Commit graph

239 commits

Author SHA1 Message Date
marko
cd12974298 branches/zip: Minor cleanup of B-tree cursor operations.
btr_pcur_get_rel_pos(): Add a const qualifier.

btr_pcur_get_btr_cur(), btr_pcur_get_page_cur(): btr_cur_get_page_cur():
Define as const-preserving macros.

btr_pcur_is_on_user_rec(), btr_pcur_is_after_last_on_page(),
btr_pcur_is_before_first_on_page(): Remove the unused parameter mtr.
Add a const qualifier.

btr_pcur_move_to_next_on_page(), btr_pcur_move_to_prev_on_page():
Remove the unused parameter mtr.

page_cur_search(): Add const qualifiers.

page_cur_get_page(), page_cur_is_before_first(), page_cur_is_after_last():
Add debug assertions.
2007-10-22 08:16:35 +00:00
marko
3980b139e0 branches/zip: Introduce two new dictionary operation modes for transactions.
enum trx_dict_op: dictionary operation modes

trx_get_dict_operation(), trx_set_dict_operation(): Accessors for
trx->dict_operation.

lock_table_enqueue_waiting(), lock_rec_enqueue_waiting(): Do not complain
about lock waits if the dictionary mode is TRX_DICT_OP_INDEX_MAY_WAIT.

row_merge_lock_table(): Remove the work-around for avoiding the warning
in lock_table_enqueue_waiting().

trx_undo_mark_as_dict_operation(): Do not write trx->table_id to the
undo log unless the dict_operation is TRX_DICT_OP_TABLE.

ha_innobase::add_index(): Set the dict_operation mode initially to
TRX_DICT_OP_INDEX_MAY_WAIT, then lock the table exclusively, and set the
mode to TRX_DICT_OP_INDEX, and optionally to TRX_DICT_OP_TABLE when
creating a temporary table.
2007-10-19 10:52:25 +00:00
marko
93157fcd32 branches/zip: row_merge_lock_table(): Clear the trx->dict_operation flag
for the duration of the lock_table() call in order to avoid a bogus warning.
2007-10-18 09:18:18 +00:00
marko
65d4e6308e branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.

page_rec_get_n_recs_before(): Add const qualifiers.

page_dir_get_nth_slot(): Define as a const-preserving macro.

page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.

page_rec_get_next_low(): Add const qualifiers.

page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().

page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.

page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.

buf_page_get_mutex(): Add a const qualifier to buf_page_t*.

rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
marko
aea22cad48 branches/zip: row_scan_and_check_index(): Remove the compiler warning
that tmp_heap is possibly uninitialized.  This was introduced in r1990.
2007-10-17 12:19:35 +00:00
marko
e7267909d7 branches/zip: Initialize dfield_t::ext as soon as possible. This should
fix the bugs introduced in r1591.

row_rec_to_index_entry_low(): Clear "n_ext".  Do not allow it to be NULL.
Add const qualifier to dict_index_t*.

row_rec_to_index_entry(): Add the parameters "offsets" and "n_ext".

btr_cur_optimistic_update(): Add an assertion that there are no externally
stored columns.  Remove the unreachable call to btr_cur_unmark_extern_fields()
and the preceding unnecessary call to rec_get_offsets().

btr_push_update_extern_fields(): Remove the parameters index, offsets.
Only report the additional externally stored columns of the update vector.

row_build(), trx_undo_rec_get_partial_row(): Flag externally stored columns
also with dfield_set_ext().

rec_copy_prefix_to_dtuple(): Assert that there are no externally stored
columns in the prefix.

row_build_row_ref(): Note and assert that the index is a secondary index,
and assert that there are no externally stored columns.

row_build_row_ref_fast(): Assert that there are no externally stored columns.

rec_offs_get_n_alloc(): Expose the function.

row_build_row_ref_in_tuple(): Assert that there are no externally stored
columns in a record of a secondary index.

row_build_row_ref_from_row(): Assert that there are no externally stored
columns.

row_upd_check_references_constraints(): Add the parameter offsets, to
avoid a redundant call to rec_get_offsets().

row_upd_del_mark_clust_rec(): Add the parameter offsets.  Remove
duplicated code.

row_ins_index_entry_set_vals(): Copy the external storage flag.

sel_pop_prefetched_row(): Assert that there are no externally stored
columns.

row_scan_and_check_index(): Copy offsets to a temporary heap across
the invocation of row_rec_to_index_entry().
2007-10-17 12:13:29 +00:00
marko
c6f5ea288a branches/zip: btr_push_update_extern_fields(): Add parameter "index"
and use it for flagging externally stored columns in the data tuple.
The data tuple contains the same columns as the clustered index record,
but in a different order.  This error was introduced in r1591.

TODO: the assertion ut_ad(!dfield_is_ext()) may fail in
btr_cur_pessimistic_update().
2007-10-16 07:25:58 +00:00
marko
9364a4daf6 branches/zip: row_ins_foreign_report_add_err(): Note that the dtuple_print()
call may display uninitialized values of DB_TRX_ID and DB_ROLL_PTR.
2007-10-10 11:39:26 +00:00
marko
f3d0ad8160 branches/zip: Use static linkage for row_ins(). 2007-10-05 06:23:37 +00:00
marko
3877f6910f branches/zip: Define the macro rec_offs_init() and use it for initializing
offsets_[] arrays, as suggested by Vasil.

rec_offs_set_n_alloc(): Declare as a public function.  Assert that
n_alloc > REC_OFFS_HEADER_SIZE.

rec_offs_get_n_alloc(): Assert that n_alloc > REC_OFFS_HEADER_SIZE.
2007-09-28 07:05:57 +00:00
marko
a1e57e698b branches/zip: Merge 1862:1894 from trunk, except 1866. 2007-09-27 11:17:45 +00:00
marko
55f4395272 branches/zip: row_mysql_store_blob_ref(): Change the type of the parameter
"data" from byte* to const void*.
2007-09-27 10:59:54 +00:00
marko
df88e3c988 branches/zip: row_sel_field_store_in_mysql_format(): Replace
if-else with switch.
2007-09-27 09:05:05 +00:00
marko
2de2d45fdf branches/zip: Remove the unused variable row_mysql_identically_false. 2007-09-27 08:56:33 +00:00
marko
028d25db86 branches/zip: Simplify the reporting of duplicate key values.
Since r1905, innobase_rec_to_mysql() does not require a clustered index record.

row_merge_dup_t: Remove old_table.

row_merge_dup_report(): Do not fetch the clustered index record.  Simply
convert the tuple by innobase_rec_to_mysql().

row_merge_blocks(), row_merge(), row_merge_sort(): Add a TABLE* parameter
for reporting duplicate key values during file sort.

row_merge_read_clustered_index(): Replace UNIV_PAGE_SIZE with the more
appropriate sizeof(mrec_buf_t).
2007-09-27 08:28:25 +00:00
marko
e25d62f27a branches/zip: Double the size of mrec_buf_t to UNIV_PAGE_SIZE.
This should have been done in r1903, where the minimum size of
row_merge_block_t was noted to be UNIV_PAGE_SIZE.
2007-09-27 06:13:33 +00:00
marko
51436aa102 branches/zip: Document the minimum size of row_merge_block_t as UNIV_PAGE_SIZE.
row_merge_buf_add(): Add ut_ad(data_size < sizeof(row_merge_block_t))
and document why it may fail if sizeof row_merge_block_t < UNIV_PAGE_SIZE.
2007-09-26 13:52:08 +00:00
marko
c6d6f1fa8b branches/zip: row_merge_build_indexes(): Call innobase_rec_reset() only once.
row_merge_dup_report(): Do not call innobase_rec_reset().
2007-09-26 13:47:32 +00:00
marko
34ab0c0523 branches/zip: Implement the reporting of duplicate key values to MySQL.
innobase_rec_to_mysql(): New function, for converting an InnoDB clustered
index record to MySQL table->record[0].  TODO: convert integer fields.
Currently, integer fields are in big-endian byte order instead of
host byte order, and signed integer fields are offset by 0x80000000.

innobase_rec_reset(): New function, for resetting table->record[0].

row_merge_build_indexes(): Add the parameter TABLE* table (the MySQL table
handle) for reporting duplicate key values.

dtuple_from_fields(): New function, to convert an array of dfield_t* to
dtuple_t.

dtuple_get_n_ext(): New function, to compute the number of externally stored
fields.

row_merge_dup_t: Structure for counting and reporting duplicate records.

row_merge_dup_report(): Function for counting and reporting duplicate records.

row_merge_tuple_cmp(), row_merge_tuple_sort(): Replace the ulint* n_dup
parameter with row_merge_dup_t* dup.

row_merge_buf_sort(): Add the parameter row_merge_dup_t* dup, which is
NULL when sorting a non-unique index.

row_merge_buf_write(), row_merge_heap_create(), row_merge_read_rec(),
row_merge_cmp(), row_merge_read_clustered_index(), row_merge_blocks(),
row_merge(), row_merge_sort(): Add const qualifiers.

row_merge_read_clustered_index(): Use a common error handling branch err_exit.
Invoke row_merge_buf_sort() differently on unique indexes.

row_merge_blocks(): note TODO: We could invoke innobase_rec_to_mysql()
to report duplicate key values when creating a clustered index.
2007-09-26 11:56:26 +00:00
marko
3ad7bd739d branches/zip: Add some const qualifiers to input parameters.
rec_get_converted_size_comp(), rec_convert_dtuple_to_rec_comp(),
rec_convert_dtuple_to_rec_new(), rec_convert_dtuple_to_rec(): Add a
const qualifier to dict_index_t*.

row_search_on_row_ref(): Add const qualifiers to the dict_table_t*
and dtuple_t* parameters.  Note that pcur is an "out" parameter
and mtr is "in/out".
2007-09-26 09:12:23 +00:00
marko
366087058f branches/zip: Minor cleanup.
row_build_row_ref_fast(): Note that "ref" is an in/out parameter.

row_build_row_ref_from_row(): Add const qualifiers to all "in" parameters.
2007-09-26 07:45:08 +00:00
marko
051545ad66 branches/zip: row_build_row_ref_in_tuple(): Add the parameter "offsets",
to avoid a rec_get_offsets() call.  Add some const qualifiers.

row_sel_get_clust_rec_for_mysql(): Note that "offsets" will also be
an input parameter.
2007-09-25 07:20:56 +00:00
marko
30fe641edd branches/zip: Restore the size of row_merge_block_t to 1048576 bytes.
This was inadvertently reduced to 16384 bytes in r1861.  For testing,
this can be set as low as UNIV_PAGE_SIZE.
2007-09-24 08:52:15 +00:00
marko
9dfeb65c58 branches/zip: Correct the bug mentioned in r1872.
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.
2007-09-24 08:46:13 +00:00
marko
4ae9841792 branches/zip: row_merge_read_clustered_index(): After writing out the
merge buffer, write the next record to the beginning of the emptied buffer.
This fixes one of the bugs mentioned in r1872.
2007-09-21 14:33:49 +00:00
marko
238db63262 branches/zip: Fix a bug in the merge sort in fast index creation.
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().
2007-09-21 13:05:51 +00:00
marko
7a0a4df586 branches/zip: Add more details to the debug printout enabled by
row_merge_print_read and row_merge_print_write.
2007-09-21 11:44:57 +00:00
marko
619fd43a67 branches/zip: Add diagnostic printout.
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.
2007-09-21 08:07:58 +00:00
marko
e0ce04fd89 branches/zip: Improve Valgrind instrumentation of the file-based merge sort
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.
2007-09-20 12:20:17 +00:00
marko
81332ff9d0 branches/zip: Improve Valgrind instrumentation in the merge block I/O
of fast index creation.
2007-09-19 13:52:43 +00:00
marko
8b4d78802d branches/zip: Fix some bugs in file-based merge sort.
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.
2007-09-19 11:40:51 +00:00
marko
fdcf0b1fcd 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
746c3316e1 branches/zip: row_merge_create_temporary_table(): On error, free the
data dictionary object new_table.  This fixes a memory leak.
2007-09-12 07:27:42 +00:00
marko
5f3faa0991 branches/zip: Minor cleanup.
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.
2007-09-11 05:09:19 +00:00
marko
57afe1d5d2 branches/zip: Merge 1809:1830 from trunk. 2007-09-10 10:09:01 +00:00
marko
84ff578142 branches/zip: Simplify crash recovery in fast index creation.
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.
2007-09-05 10:18:03 +00:00
marko
9d65ac4ca4 branches/zip: row_merge_drop_table(): Replace the
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.
2007-09-03 10:34:25 +00:00
marko
140a706079 branches/zip: Merge 1783:1792 from trunk. 2007-09-03 08:44:39 +00:00
marko
a2943ec761 branches/zip: Enclose the definition of dict_index_t::trx_id in
#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.
2007-09-03 07:13:59 +00:00
marko
c056d2c3f5 branches/zip: Introduce TEMP_INDEX_PREFIX == 0xff for indexes being populated
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.
2007-08-31 09:58:22 +00:00
marko
31d63cd08f branches/zip: Merge 1664:1783 from trunk. 2007-08-30 09:21:25 +00:00
marko
c13f191357 branches/zip: Remove some checks if an index or a table is a temporary one
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.
2007-08-29 08:45:34 +00:00
marko
9129593724 branches/zip: Simplify the locking of the data dictionary.
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.
2007-08-29 06:36:10 +00:00
marko
7bd89c504d branches/zip: row_merge_create_temporary_table(): On failure,
row_create_table_for_mysql() will free new_table.  Thus, remove
the call dict_mem_table_free(new_table).
2007-08-22 18:31:24 +00:00
marko
7274fd95af branches/zip: Fix a memory leak in fast index creation.
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.
2007-08-21 12:10:14 +00:00
marko
8aa17b95e1 branches/zip: row_merge_read(): Call os_file_read_no_error_handling()
instead of os_file_read().  Display some fault diagnostics.
2007-08-20 12:33:27 +00:00
marko
885212294d 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
fc02084a69 branches/zip: row_rename_table_for_mysql(): Rely on the diagnostic
printout of dict_table_rename_in_cache().  Correct the comment about
the SQL parser.  This function does not drop any table.
2007-08-20 09:45:27 +00:00
marko
c09dd214be branches/zip: Add const qualifiers to the upd_t* parameters of some functions. 2007-08-20 06:59:22 +00:00
marko
8634d343f7 branches/zip: Rename mem_heap_calloc() and mem_calloc() to
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.
2007-08-16 13:25:56 +00:00