row_merge(): Add the assertion ut_ad(half > 0).
row_merge_sort(): Compute the half of the merge file correctly. The
previous implementation used truncating division, which may result in
loss of records when the file size in blocks is not a power of 2.
Some bug still remains, because innodb-index.test will lose some
records from the clustered index after add primary key (a,b(255),c(255))
when row_merge_block_t is reduced to 8192 bytes.
row_merge(): Add the parameter "half". Add some Valgrind instrumentation.
Note that either stream can end before the other one.
row_merge_sort(): Calculate "half" for row_merge().
rec_print_comp(): New function, sliced from rec_print_new().
rec_print_old(), rec_print_comp(): Print the untruncated length of the column.
row_merge_print_read, row_merge_print_write, row_merge_print_cmp:
New flags, to enable debug printout in UNIV_DEBUG builds.
row_merge_tuple_print(): New function for UNIV_DEBUG builds.
row_merge_read_rec(): Obey row_merge_print_read.
row_merge_buf_write(), row_merge_write_rec_low(),
row_merge_write_eof(): Obey row_merge_print_write.
row_merge_cmp(): Obey row_merge_print_cmp.
in fast index creation.
row_merge_write_eof(), row_merge_buf_write(): When UNIV_DEBUG_VALGRIND
is defined, fill the rest of the block (after the end-of-block marker)
with 0xff.
row_merge_read_rec(): Correct a typo in a comment. Fix error in
arithmetics when the record spans two blocks.
row_merge_write_rec_low(): Add a "size" parameter. Add debug assertions
about extra_size and size.
row_merge_write_rec(): After writing a record, properly advance the
buffer pointer.
row_add_table_to_background_drop_list(): Replace the dict_table_t*
parameter with const char* (the table name).
row_check_table_for_mysql(): Replace prebuilt->table with table.
trx_t: Remove dict_undo_list and dict_redo_list.
innobase_create_temporary_tablename(): Replace TEMP_TABLE_PREFIX with
a table name suffix "#1" or "#2". In this way, the user can restore
precious data, should anything go wrong. It is possible to reach an
inconsistent state, because the creation, deletion and renaming of
single-table tablespaces are not transactional.
ut_print_namel(), fil_make_ibd_name(), innobase_rename_table(): Remove
the special treatment of TEMP_TABLE_PREFIX.
Introduce TEMP_INDEX_PREFIX == 0xff for temporary indexes. This byte
cannot occur in index names since MySQL 4.1. However, it might have
been possible to use this byte in MySQL 4.0.
recv_recovery_from_checkpoint_finish(): Call the new function
row_merge_drop_temp_indexes(), to drop all indexes whose name starts
with the byte 0xff.
row_merge_rename_indexes(): Renamed from row_merge_rename_index().
Remove the parameter "index".
row_drop_table_for_mysql(): Unconditionally call trx_commit_for_mysql().
row_drop_table_for_mysql_no_commit(): Correct the function commit,
based on the corrected comment of row_drop_table_for_mysql(). Rely on
table->to_be_dropped instead of TEMP_TABLE_PREFIX.
ha_innobase::add_index(): Simplify the control flow.
row_drop_table_for_mysql() call with a call to
row_drop_table_for_mysql_no_commit(). The last parameter of
the function is ibool drop_db, not ibool do_commit. Also,
since r1790 of trunk it is not necessary to copy table->name.
#ifdef ROW_MERGE_IS_INDEX_USABLE, to avoid growing the memory
footprint until MySQL implements and calls the virtual method
handler::is_index_available() or something equivalent.
in fast index creation. The prefix was previously TEMP_TABLE_PREFIX == '/',
which may occur in index names.
ut_print_namel(): Do not assume that all '/' are separators between
database and table names.
created in fast index creation.
dict_load_indexes(): Always complain if the first index is not clustered.
lock_table_enqueue_waiting(): Always complain about lock waits in
a dictionary operation.
row_merge_rename_tables(): Add an assertion that dict_sys->mutex is
being held.
row_undo_mod_del_unmark_sec_and_undo_update(): Make the test about
temporary indexes more readable.
row_create_table_for_mysql(): Do not retry creating a temporary table
in fast index creation. Orphaned temporary tables will have to be dropped
in crash recovery.
row_upd_index_is_referenced(), row_upd_check_references_constraints(),
row_purge_parse_undo_rec(): Remove duplicated code that calls
row_mysql_unfreeze_data_dictionary().
row_undo_ins_remove_clust_rec():
Assert that the data dictionary is X-latched. Do not attempt to re-latch
the data dictionary, because doing so introduces race conditions. This
re-latching was probably made unnecessary already in r1676, which keeps
the data dictionary X-latched in ha_innobase::add_index() for the complete
duration of the data dictionary operations.
row_undo_ins_parse_undo_rec(): Do not attempt to acquire the data dictionary
latch. The data dictionary should be already X-latched when a transaction
that modifies system tables is rolled back. This also holds in the rollback
during crash recovery: trx_rollback_active() will X-latch the data dictionary
when needed.
ha_innobase::add_index(): Add assertions about !trx->sync_cb and
!trx->dict_redo_list. Remove a bogus comment. Replace
row_lock_table_for_merge() with row_merge_lock_table().
row_merge_lock_table(): Renamed from row_lock_table_for_merge()
and moved from row0mysql.c to row0merge.c. Always lock the table in
the mode LOCK_X. Call que_graph_free() in order not to leak memory.
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().
mem_heap_zalloc() and mem_zalloc(), because calloc() in the C runtime
library takes two size parameters, not one.
mem_heap_zalloc(): Add debug assertions. Document that the return value
is never NULL.
row_merge_buf_add(): Add a prefetch instruction to row->fields.
Eliminate a variable from the copying loop, and move the termination
condition to the end of the loop.
row_merge_build_indexes(): Remove the second call to
trx_start_if_not_started().
(merging branches/fast-index-creation):
row_truncate_table_for_mysql(), row_drop_table_for_mysql_no_commit():
Let ut_print_name() output to ef instead of stderr.
innobase_create_key_def(), row_table_got_default_clust_index(),
row_get_mysql_key_number_for_index(): Add a const qualifier.
dict_table_get_first_index(), dict_table_get_next_index(): Define
as a const-preserving macro. Preserve the old function for UNIV_DEBUG,
but add a const qualifier to the parameter and cast away the constness.
row_merge_create_temporary_table(): Add the parameter index_defs.
DB_PRIMARY_KEY_IS_NULL: New error code, mapped to ER_PRIMARY_CANT_HAVE_NULL.
row_merge_read_clustered_index(): Replace the parameter "table" with the
two parameters "old_table" and "new_table". Detect NULL values of columns
that are supposed to be NOT NULL.
row_merge_col_prtype(): New auxiliary function, used by
row_merge_create_temporary_table() to flag NOT NULL any columns
contained in an added PRIMARY KEY.
innobase_copy_index_field_def(): Remove parameter heap. The field->name
will not be deallocated before the copied index has been added to the
data dictionary cache.
innobase_copy_index_def(): Add const qualifier to dict_index_t*.
Add an assertion !dict_index_is_clust(index).
ha_innobase::add_index(): Add the missing user_thd parameter to the
convert_error_code_to_mysql() call that was forgotten from r1686.
merge_index_field_struct: Add const qualifier to field_name.
merge_index_def_struct: Add const qualifier to name.
row_merge_build_indexes(): Improve the function comment.
row_merge_drop_table(): Remove bogus assertion ut_a(table->to_be_dropped).
row_merge_buf_create_low(): Swap the parameters max_tuples and buf_size,
because the callers had them swapped. Add debug assertions about
these parameters.
row_merge_buf_empty(): Return the emptied buffer. In some cases, the
buffer may be relocated.
row_mysql_read_true_varchar(), row_mysql_read_blob_ref(),
row_mysql_store_col_in_innobase_format(),
row_sel_convert_mysql_key_to_innobase(): Add const qualifiers.
row_sel_convert_mysql_key_to_innobase(): Document that the first parameter
is in/out.
the data dictionary locked across the operations.
dict_table_decrement_handle_count(), row_prebuilt_free(): Add the flag
dict_locked, to prevent the acquisition of dict_sys->mutex.
innobase_rename_table(): Rename commit_flag to lock_and_commit,
and do not acquire dict_sys->mutex or flush the log unless the flag is set.
Remove bogus comment about utility threads, because the threads will
be waken up by the upper-level function ha_innobase::rename_table().
ha_innobase::add_index(): After creating a primary key, hold dict_sys->mutex
across all dictionary operations.
be set always.
trx_rollback_active(): Split from trx_rollback_or_clean_all_without_sess().
row_undo_dictionary(): Do not return a value. Assert that all operations
succeed.
row_merge_drop_index(): Remove bogus comment about void return value.
trx_dummy_sess: Move the declaration from trx0roll.h to trx0trx.h,
because the variable is defined in trx0trx.c.
Some things still fail in innodb-index.test, and there seems to be
a race condition (data dictionary lock wait) when running with --valgrind.
dfield_t: Add an "external storage" flag, dfield->ext.
dfield_is_null(), dfield_is_ext(), dfield_set_ext(), dfield_set_null():
New functions.
dfield_copy(), dfield_copy_data(): Add const qualifiers, fix in/out comments.
data_write_sql_null(): Use memset().
big_rec_field_t: Replace byte* data with const void* data.
ut_ulint_sort(): Remove.
upd_field_t: Remove extern_storage.
upd_node_t: Replace ext_vec, n_ext_vec with n_ext.
row_merge_copy_blobs(): New function.
row_ins_index_entry(): Add the parameter "ibool foreign" for suppressing
foreign key checks during fast index creation or when inserting into
secondary indexes.
btr_page_insert_fits(): Add const qualifiers.
btr_cur_add_ext(), upd_ext_vec_contains(): Remove.
dfield_print_also_hex(), dfield_print(): Replace if...else if with switch.
Observe dfield_is_ext().