Commit graph

73 commits

Author SHA1 Message Date
marko
f7e6f2a9d1 branches/zip: innodb-zip.test: Add tests for warnings about
ROW_FORMAT=COMPRESSED when neither innodb_file_per_table nor
innodb_file_format are set.
2008-03-14 11:07:39 +00:00
marko
c82afadaa8 branches/zip: Implement ROW_FORMAT=COMPRESSED and ROW_FORMAT=DYNAMIC.
Throw warnings, not errors for wrong ROW_FORMAT or KEY_BLOCK_SIZE,
so that any table dump can be loaded.

As of this change, InnoDB supports the following table formats:

ROW_FORMAT=REDUNDANT
	the only format before MySQL/InnoDB 5.0.3
ROW_FORMAT=COMPACT
	the new default format of MySQL/InnoDB 5.0.3
ROW_FORMAT=DYNAMIC
	uncompressed, no prefix in the clustered index record for BLOBs
ROW_FORMAT=COMPRESSED
	like ROW_FORMAT=DYNAMIC, but zlib compressed B-trees and BLOBs;
	the compressed page size is specified by KEY_BLOCK_SIZE in
	kilobytes (1, 2, 4, 8, or 16; default 8)

KEY_BLOCK_SIZE=1, 2, 4, 8, or 16: implies ROW_FORMAT=COMPRESSED;
ignored if ROW_FORMAT is not COMPRESSED

KEY_BLOCK_SIZE=anything else: ignored

The InnoDB row format is displayed in the 4th column (Row_format) of
the output of SHOW TABLE STATUS.  The Create_options column may show
ROW_FORMAT= and KEY_BLOCK_SIZE=, but they do not necessarily have
anything to do with InnoDB.

The table format can also be queried like this:

SELECT table_schema, table_name, row_format
FROM information_schema.tables
WHERE engine='innodb' and row_format in ('Compressed','Dynamic');

When Row_format='Compressed', KEY_BLOCK_SIZE should usually correspond
to the compressed page size.  But the .frm file could be manipulated
to show any KEY_BLOCK_SIZE.

For some reason, INFORMATION_SCHEMA.TABLES.CREATE_OPTIONS does not
include KEY_BLOCK_SIZE.  It does include row_format (spelled in
lowercase).  This looks like a MySQL bug, because the table
INFORMATION_SCHEMA.TABLES probably tries to replace SHOW TABLE STATUS.
I reported this as Bug #35275 <http://bugs.mysql.com/35275>.

ha_innobase::get_row_type(): Add ROW_TYPE_COMPRESSED, ROW_TYPE_DYNAMIC.

ha_innobase::create(): Implement ROW_FORMAT=COMPRESSED and
ROW_FORMAT=DYNAMIC.  Do not throw errors for wrong ROW_FORMAT or
KEY_BLOCK_SIZE, but issue warnings instead.

ha_innobase::check_if_incompatible_data(): Return COMPATIBLE_DATA_NO
if KEY_BLOCK_SIZE has been specified.

innodb.result: Adjust the result for the warning issued for ROW_FORMAT=FIXED.

innodb-zip.test: Add tests.  Query INFORMATION_SCHEMA.TABLES for ROW_FORMAT.
2008-03-13 17:25:53 +00:00
marko
633fc05300 branches/zip: Fix a bug in the retrieval of old versions of records containing
externally stored columns.

innodb-zip.test: Correct the test case.  Without the fixes, the test
would fail, because the BLOB would be prepended with a 768-byte prefix
of the data.

row_upd_index_replace_new_col_vals_index_pos(),
row_upd_index_replace_new_col_vals(): Use only one "heap"
parameter that must be non-NULL.  When fetching externally
stored columns, use upd_field_t::orig_len.

upd_get_field_by_field_no(): New accessor function, for retrieving
an field from an update vector by field_no.

row_upd_index_replace_new_col_val(): New function, for replacing the
value from an update vector.  This used to be duplicated code in
row_upd_index_replace_new_col_vals_index_pos() and
row_upd_index_replace_new_col_vals().
2008-03-13 12:49:34 +00:00
marko
86361e032b branches/zip: Implement the configuration parameter and settable global
variable innodb_file_format.  Implement file format version stamping of
*.ibd files and SYS_TABLES.TYPE.

This change breaks introduces an incompatible change for for
compressed tables.  We can do this, as we have not released yet.

innodb-zip.test: Add tests for stricter KEY_BLOCK_SIZE and ROW_FORMAT
checks.

DICT_TF_COMPRESSED_MASK, DICT_TF_COMPRESSED_SHIFT: Replace with
DICT_TF_ZSSIZE_MASK, DICT_TF_ZSSIZE_SHIFT.

DICT_TF_FORMAT_MASK, DICT_TF_FORMAT_SHIFT, DICT_TF_FORMAT_51,
DICT_TF_FORMAT_ZIP: File format version, stored in table->flags,
in the .ibd file header, and in SYS_TABLES.TYPE.

dict_create_sys_tables_tuple(): Write the table flags to SYS_TABLES.TYPE
if the format is at least DICT_TF_FORMAT_ZIP.  For old formats
(DICT_TF_FORMAT_51), write DICT_TABLE_ORDINARY as the table type.

DB_TABLE_ZIP_NO_IBD: Remove the error code.  The error handling is done
in ha_innodb.cc; as a failsafe measure, dict_build_table_def_step() will
silently clear the compression and format flags instead of returning this
error.

dict_mem_table_create(): Assert that no extra bits are set in the flags.

dict_sys_tables_get_zip_size(): Rename to dict_sys_tables_get_flags().
Check all flag bits, and return ULINT_UNDEFINED if the combination is
unsupported.

dict_boot(): Document the SYS_TABLES columns N_COLS and TYPE.

dict_table_get_format(), dict_table_set_format(),
dict_table_flags_to_zip_size(): New accessors to table->flags.

dtuple_convert_big_rec(): Introduce the auxiliary variables
local_len, local_prefix_len.  Store a 768-byte prefix locally
if the file format is less than DICT_TF_FORMAT_ZIP.

dtuple_convert_back_big_rec(): Restore the columns.

srv_file_format: New variable: innodb_file_format.

fil_create_new_single_table_tablespace(): Replace the parameter zip_size
with table->flags.

fil_open_single_table_tablespace(): Replace the parameter zip_size_in_k
with table->flags.  Check the flags.

fil_space_struct, fil_space_create(), fil_op_write_log():
Replace zip_size with flags.

fil_node_open_file(): Note a TODO item for InnoDB Hot Backup.
Check that the tablespace flags match.

fil_space_get_zip_size(): Rename to fil_space_get_flags().  Add a
wrapper for fil_space_get_zip_size().

fsp_header_get_flags(): New function.

fsp_header_init_fields(): Replace zip_size with flags.

FSP_SPACE_FLAGS: New name for the tablespace flags.  This field used
to be called FSP_PAGE_ZIP_SIZE, or FSP_LOWEST_NO_WRITE.  It has always
been written as 0 in MySQL/InnoDB versions 4.1 to 5.1.

MLOG_ZIP_FILE_CREATE: Rename to MLOG_FILE_CREATE2.  Add a 32-bit
parameter for the tablespace flags.

ha_innobase::create(): Check the table attributes ROW_FORMAT and
KEY_BLOCK_SIZE.  Issue errors if they are inappropriate, or warnings
if the inherited attributes (in ALTER TABLE) will be ignored.

PAGE_ZIP_MIN_SIZE_SHIFT: New constant: the 2-logarithm of PAGE_ZIP_MIN_SIZE.
2008-03-10 11:05:32 +00:00
marko
a669361818 innodb-zip.test: Now that innodb_file_per_table is a settable variable
as of r2355, remove the special startup options innodb-zip-master.opt
and set the variable in innodb-zip.test instead.
2008-03-07 14:10:08 +00:00
marko
cdba733fb5 branches/zip: Merge 2263:2295 from branches/5.1. 2008-02-18 20:09:03 +00:00
marko
28a3070180 branches/zip: Merge 2236:2263 from branches/5.1. 2008-01-28 15:54:46 +00:00
marko
6523ce6fd8 branches/zip: When storing a longer prefix of an externally stored column
to the undo log, also store the original length of the column, so that the
changes will be correctly undone in transaction rollback or when fetching
previous versions of the row.

innodb-zip.test: New file, for tests of the compression.

upd_field_t: Add orig_len, the original length of new_val.

btr_push_update_extern_fields(): Restore the original prefix of the column.
Add the parameter heap where memory will be allocated if necessary.

trx_undo_rec_get_col_val(): Add the output parameter orig_len.

trx_undo_page_report_modify_ext(): New function: Write an externally
stored column to the undo log.  This is only called from
trx_undo_page_report_modify(), and this is the only caller of
trx_undo_page_fetch_ext().

trx_undo_update_rec_get_update(): Read the original length of the column
prefix to upd_field->orig_len.
2008-01-23 13:46:45 +00:00
marko
630f27a4d2 branches/zip: Merge 2155:2213 from branches/5.1.
(Revisions 2146:2155 were already merged.)
2008-01-07 09:15:25 +00:00
marko
7e62ee83c7 branches/zip: innodb-index.test: Test duplicate key failures for different
indexes.
2008-01-04 15:25:59 +00:00
marko
3c68b7a137 branches/zip: innodb-index.test: Drop all created tables at the end. 2008-01-04 07:57:13 +00:00
marko
5bdc51ce5f branches/zip: innodb-index.test: Work around MySQL bugs and bug fixes. 2008-01-03 12:45:17 +00:00
marko
463141d149 branches/zip: Implement a limit for the size of undo log records.
innodb-index.test: Add a test with a large number of externally stored
columns.  Check that there may not be prefix indexes on too many columns.

dict_index_too_big_for_undo(): New function: Check if the undo log may
overflow.

dict_index_add_to_cache(): Return DB_SUCCESS or DB_TOO_BIG_RECORD.
Postpone the creation and linking of some data structures, so that
when dict_index_too_big_for_undo() holds, it will be easier to clean up.
Check the return status in all callers.
2007-12-19 14:03:39 +00:00
marko
d0d9299177 branches/zip: Fast index creation: Remove the ROW_PREBUILT_OBSOLETE nonsense.
Active transactions must not switch table or index definitions on the fly,
for several reasons, including the following:

 * copied indexes do not carry any history or locking information;
   that is, rollbacks, read views, and record locking would be broken

 * huge potential for race conditions, inconsistent reads and writes,
   loss of data, and corruption

Instead of trying to track down if the table was changed during a transaction,
acquire appropriate locks that protect the creation and dropping of indexes.

innodb-index.test: Test the locking of CREATE INDEX and DROP INDEX.  Test
that consistent reads work across dropped indexes.

lock_rec_insert_check_and_lock(): Relax the lock_table_has() assertion.
When inserting a record into an index, the table must be at least IX-locked.
However, when an index is being created, an IS-lock on the table is
sufficient.

row_merge_lock_table(): Add the parameter enum lock_mode mode, which must
be LOCK_X or LOCK_S.

row_merge_drop_table(): Assert that n_mysql_handles_opened == 0.
Unconditionally drop the table.

ha_innobase::add_index(): Acquire an X or S lock on the table, as appropriate.
After acquiring an X lock, assert that n_mysql_handles_opened == 1.
Remove the comments about dropping tables in the background.

ha_innobase::final_drop_index(): Acquire an X lock on the table.

dict_table_t: Remove version_number, to_be_dropped, and prebuilts.
ins_node_t: Remove table_version_number.

enum lock_mode: Move the definition from lock0lock.h to lock0types.h.

ROW_PREBUILT_OBSOLETE, row_update_prebuilt(), row_prebuilt_table_obsolete():
Remove.

row_prebuilt_t: Remove the declaration from row0types.h.

row_drop_table_for_mysql_no_commit(): Always print a warning if a table
was added to the background drop queue.
2007-12-17 15:49:59 +00:00
marko
45a2844543 branches/zip: Merge r2154 from trunk:
innodb.result, innodb.test: Revert the changes in r2145.

The tests that were removed by MySQL

ChangeSet@1.2598.2.6  2007-11-06 15:42:58-07:00  tsmith@hindu.god

were moved to a new test, innodb_autoinc_lock_mode_zero, which is
kept in the MySQL BitKeeper tree.
2007-12-04 08:37:43 +00:00
marko
690566c36a branches/zip: Merge 2116:2146 from trunk. 2007-11-30 12:30:21 +00:00
vasil
84979e4341 branches/zip:
Bugfix1: Set innodb_locks.lock_index to NOT NULL.
If a column in INFORMATION_SCHEMA table has the flag
MY_I_S_MAYBE_NULL and it is not explicitly marked as NOT NULL
with the method ::set_notnull() then it is always rendered as
NULL by MySQL.

Bugfix2: Avoid crashes if lock_index is NULL. It is NULL for table
level locks.

Pointyhat to:	Marko
2007-11-21 12:01:36 +00:00
vasil
2140d5956a branches/zip:
Move test that depends on ucs2 to a separate file that is disabled if
ucs2 is not compiled in.
2007-11-21 11:23:05 +00:00
vasil
a5f81a6054 branches/zip:
Move common SQL commands to an .inc file.
2007-11-21 10:47:08 +00:00
vasil
f5ff7acb2e branches/zip:
Synchronize the utf8 and ucs2 tests.
2007-11-21 10:18:22 +00:00
marko
afccd4afd2 branches/zip: INFORMATION_SCHEMA.INNODB_LOCKS: Quote lock_table, lock_index.
innodb_information_schema.test. Add tests that display most columns from
INFORMATION_SCHEMA.INNODB_LOCKS.  Test that quoting of table names works
and respects SQL_MODE='ANSI_QUOTES'.

innobase_print_identifier(): Remove.

innobase_convert_identifier(): New function,
based on innobase_print_identifier().

innobase_convert_name(): New function, similar to ut_print_namel(), but
using a memory buffer.

ut_print_namel(): Use innobase_convert_name().

fill_innodb_locks_from_cache(): Convert lock_table and lock_index by
calling innobase_convert_name().
2007-11-21 08:46:11 +00:00
marko
a7344bc8e1 branches/zip: Merge 2015:2093 from trunk. 2007-11-16 13:57:27 +00:00
vasil
e8de094a3f branches/zip:
Add innodb_locks.lock_data column and some relevant tests.
For record locks this column represents the ordering fields of the
locked row in a human readable, SQL-valid, format.

Approved by:	Marko
2007-10-29 13:03:53 +00:00
marko
c661970d75 branches/zip: Merge 1937:2015 from trunk. 2007-10-24 10:59:54 +00:00
marko
00b1b124f8 innodb-test: Allow Innodb_buffer_pool_pages_total to be 511 or 512.
The size of the buffer pool can be one page smaller than the requested
size when os_mem_alloc_large() returns something that is not
aligned by UNIV_PAGE_SIZE.  This test may still fail on systems with
a big os_large_page_size.
2007-10-18 06:58:39 +00:00
marko
81761f5f7c branches/zip: innodb-index.test: Add FORCE INDEX directives and remove
those SELECTs whose ORDER BY cannot possibly make use of an index.
2007-10-15 08:42:35 +00:00
marko
a8a47268a4 branches/zip: innodb-index.result: Adapt the results to a patch from MySQL.
Unfortunately, the patch seems to prevent MySQL from utilizing secondary
indexes in the ORDER BY clauses.  Thus, the test no longer checks if newly
created indexes are well-formed.

ChangeSet@1.2528.98.1  2007-08-02 12:45:56-07:00  igor@mysql.com

Fixed bug#28404.
This patch adds cost estimation for the queries with ORDER BY / GROUP BY
and LIMIT. 
If there was a ref/range access to the table whose rows were required
to be ordered in the result set the optimizer always employed this access
though a scan by a different index that was compatible with the required 
order could be cheaper to produce the first L rows of the result set.
Now for such queries the optimizer makes a choice between the cheapest
ref/range accesses not compatible with the given order and index scans
compatible with it.
2007-10-08 12:16:32 +00:00
marko
5ae0bb6d60 branches/zip: innodb.test: Fix the result, now that fast index creation
reports duplicate key values.  The reported value may depend on the
size of the main-memory merge sort buffer (row_merge_block_t).
2007-10-05 08:39:35 +00:00
marko
bb97dfee59 branches/zip: innodb-index.test: Add yet another CHECK TABLE and add the
column d to two SELECT FROM t1.
2007-09-21 10:00:00 +00:00
marko
f5e4a4c3ed branches/zip: Merge 1830:1862 from trunk. 2007-09-20 08:36:22 +00:00
marko
499bbb4b17 branches/zip: innodb-index.test: Add more columns and rows, to ensure
that row_merge_blocks() will have some work to do when
row_merge_block_t is shrunk to 8192 bytes.

Currently, this will cause a debug assertion failure, because
row_merge_cmp() is considering all columns, not just the unique ones.
2007-09-19 09:37:09 +00:00
marko
770dde6947 branches/zip: row_merge_buf_add(): Correct the processing of
column prefixes in clustered indexes.

innodb-index.test: Add test cases for creating primary keys
containing column prefixes.
2007-09-19 07:14:36 +00:00
marko
685f665b06 branches/zip: ha_innobase::add_index(): Translate DB_TOO_BIG_RECORD
via my_error().  Add a test case to innodb-index.test.
2007-09-17 10:43:51 +00:00
marko
8763d94169 branches/zip: innodb-index.test: Make the column b much longer, to hit
the 65,535-byte VARCHAR length limit of MySQL.
2007-09-17 08:42:10 +00:00
marko
fbcd7fbec4 branches/zip: innodb-index.test: Remove a bogus comment that should have
been removed in r1808.
2007-09-12 19:13:18 +00:00
marko
7c680d2f3e branches/zip: Merge 1809:1830 from trunk. 2007-09-10 10:09:01 +00:00
marko
6b4c37d6e8 branches/zip: Decode table names when displaying error messages in
fast index creation.

innobase_convert_tablename(): New function, to remove the filename
encoding of a database and table name.

ha_innobase::add_index(): Invoke innobase_convert_tablename() before
calling my_error().

innodb-index.result: Update the error messages.
2007-09-07 09:05:52 +00:00
marko
489d829617 branches/zip: ha_innobase:add_index(): Report HA_ERR_TABLE_EXIST when the
temporary table cannot be created or renamed.

innodb-index.test,result: Add test cases where a temporary table already
exists.
2007-09-05 11:27:41 +00:00
marko
97b8960beb branches/zip: Merge 1783:1792 from trunk. 2007-09-03 08:44:39 +00:00
marko
faec4797c8 branches/zip: Merge 1664:1783 from trunk. 2007-08-30 09:21:25 +00:00
marko
2d74f90890 branches/zip: innodb-index.test: Add tests for creating or dropping
FOREIGN KEY constraints.  At the moment, MySQL will rebuild the entire
table and indexes when such constraints are added or removed, even though
the constraints do not affect the storage format of the data.
2007-08-21 06:40:46 +00:00
marko
bbe0043055 branches/zip: Preserve FOREIGN KEY constraints when creating a PRIMARY KEY.
innodb-index.test: Add some test cases for FOREIGN KEY constraints.

row_merge_rename_tables(): New function,
adapted from row_rename_table_for_mysql().

ha_innobase::add_index(): Use row_merge_rename_tables().
2007-08-20 11:40:00 +00:00
marko
1bbbcbfef4 branches/zip: Fix bugs in the creation or dropping of the clustered index
(PRIMARY KEY or UNIQUE INDEX on NOT NULL columns).

innodb-index.test: Remove the --replace_regex directives.  Replace correct
values to the "Duplicate entry" messages.  This will cause the test to
fail until we somehow return the duplicate key values to MySQL.
Add test cases for creating or dropping UNIQUE INDEX or PRIMARY KEY.

innobase_copy_index_def(): Allow the function to copy a clustered index
definition to a secondary one (UNIQUE INDEX).

innobase_create_key_def(): Check the NOT NULL flag from the correct
place.  Copy the clustered index if it is a UNIQUE INDEX.

ha_innobase::prepare_drop_index(): Refuse to drop the clustered index.
2007-08-16 13:13:25 +00:00
marko
56c41b1386 branches/zip: Add changes that accidentally omitted from r1698:
innodb-index.test, innodb-index.result: Add a test for creating
a PRIMARY KEY on a column that contains a NULL value.
2007-08-10 15:53:19 +00:00
marko
39c5ae17ce branches/zip: innodb-index.test: Replace numeric error codes with
symbolic ones.
2007-08-01 13:00:16 +00:00
marko
d662c3c656 branches/zip: Merge 1575:1664 from trunk. 2007-08-01 11:18:43 +00:00
marko
9a09ec002f branches/zip: innodb.test: Use ER_DROP_INDEX_FK instead of a numeric
error code.  Apparently, the numeric error codes in MySQL 5.1 are changing.
2007-08-01 11:01:27 +00:00
marko
fd91f7bb76 branches/zip: Reimplement merge sort in fast index creation.
The creation of the primary key does not work.  We will have to flag
externally stored columns and copy the externally stored part from
the old table.

row_build_index_for_mysql(): Rename to row_merge_build_indexes().
Move from row0mysql.c to row0merge.c.

Remove private declarations from row0merge.h.  Make many functions static
in row0merge.c.

cmp_rec_rec_simple(): A new comparison function.

dict_index_get_min_size(): New function.

OS_FILE_FROM_FD(fd): A macro for converting from int to os_file_t.

rec_convert_dtuple_to_rec_comp(): Make the interface lower-level.

rec_get_converted_size_comp(): Return also extra_size.

UT_SORT_FUNCTION_BODY(): Remove reference to an obsolete test program.

row_rec_to_index_entry_low(): New function.

row0merge.c: Implement merge sort based on file streams instead of
fixed-size blocks.  Sort the small blocks as arrays of dfield_t*,
because it is faster than invoking rec_get_offsets() for every
comparison.
2007-06-08 07:37:07 +00:00
marko
2d90ae68e7 branches/zip: Merge 1553:1556 from trunk. 2007-06-08 07:05:17 +00:00
marko
d1bdef34ac branches/zip: innodb-index.test: Check the length of the long columns. 2007-06-07 19:57:34 +00:00