Commit graph

698 commits

Author SHA1 Message Date
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
44aa4febc9 branches/zip: lock_rec_enqueue_waiting(): When a record lock wait occurs
in a dictionary operation, display also the name of the index.
2007-09-05 08:57:59 +00:00
vasil
ccd409b569 lock_get_type() needs to be accessed outside of the lock module, but it
is inline and accesses lock_t members.

As advised by Marko rename lock_get_type() to lock_get_type_low() and
create a public non-inline function lock_get_type() which calls
lock_get_type_low().

Approved by:	Marko
2007-09-04 07:54:29 +00:00
vasil
de61e2c143 Use MAP_ANON if MAP_ANONYMOUS is not defined, if neither of both is
defined, fall back to using malloc/free.

Approved by:	Marko
2007-09-04 07:29:59 +00:00
vasil
8393a88e43 Add functions that retrieve some lock_t characteristics, needed in
INFORMATION_SCHEMA implementation:

lock_get_trx_id()
lock_get_mode_str()
lock_get_type_str()
lock_get_table_id()
lock_get_table_name()
lock_rec_get_index_name()
lock_rec_get_space_id()
lock_rec_get_page_no()

Approved by:	Marko
2007-09-03 12:16:11 +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
vasil
1e3bf9ef79 branches/zip:
Move lock_rec_find_set_bit() from lock0priv.h to lock0lock.h. This
function is needed in the INFORMATION_SCHEMA implementation which
currently resides in trx/

Approved by:	Marko
2007-09-03 09:08: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
94eee9360d branches/zip: Add const qualifiers to some XID* parameters. 2007-08-30 06:43:27 +00:00
marko
095630bfed branches/zip: Relax the string type check of some built-in functions
of the InnoDB SQL parser.

pars_is_string_type(): New function.  Returns TRUE iff mtype equals
DATA_VARCHAR, DATA_CHAR, DATA_FIXBINARY, or DATA_BINARY.

pars_resolve_func_data_type(): Replace checks for DATA_VARCHAR with
pars_is_string_type().  For example, the NAME column of SYS_INDEXES,
SYS_TABLES, and SYS_COLUMNS is of DATA_BINARY type, although it
contains a UTF-8 character string.  This affects the functions
TO_NUMBER, BINARY_TO_NUMBER, LENGTH, INSTR, and SUBSTR.
2007-08-29 09:54:11 +00:00
marko
666c63777c branches/zip: pars_func_get_class(), pars_resolve_func_data_type():
Replace if-else with switch-case.
2007-08-29 09:40:18 +00:00
marko
8462fba615 branches/zip: ha_innobase::add_index(): Remove a remark about row0mysql.c
in a comment about latching the data dictionary.  The data dictionary may
be latched elsewhere too.
2007-08-29 08:53:29 +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
63583d80a7 branches/zip: hash_create(): Remove two unused variables. They should have
been removed in r1752.
2007-08-29 05:48:37 +00:00
inaam
98c1aefe7c branches/zip: The freed_page_clock for both buf_pool and block starts ticking
only after the buffer_cache has warmed up. During the initial warmup
phase these values are set to zero. We should recommend to move the
block to the start of the LRU in this case.

Also added some comments to buf0buf.c about the LRU logic.

reviewed by: Sunny
2007-08-27 19:41:56 +00:00
vasil
9584b46995 branches/zip: Add trx_get_id() and trx_get_que_state_str() functions to
retrieve trx_t's properties that will be exported in INFORMATION_SCHEMA tables.

Approved by:	Marko
2007-08-23 09:29:28 +00:00
vasil
617cbacd07 branches/zip: Use hash_table_clear() to initialize the array instead of
for()-loop.

Suggested by:	Sunny
Approved by:	Marko
2007-08-23 07:01:24 +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
vasil
756a8b29a9 branches/zip: Add a hash_table_clear() function to drop all elements that
have been added to it.

Approved by:	Marko
2007-08-22 09:43:45 +00:00
marko
e7d302e786 branches/zip: Remove trx->sync_cb. Call dict_rename_indexes() directly
from ha_innobase::add_index().

dict_rename_indexes(): Remove the redundant parameter commit_flag.
2007-08-21 12:36:13 +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
dea769663d branches/zip: mem_heap_free_heap_top(): Declare the memory
freed with UNIV_MEM_FREE().  Before this change, the memory
freed by mem_heap_empty() was not completely flagged free
in UNIV_DEBUG_VALGRIND builds.  After this change, Valgrind
will hopefully catch all errors caught by UNIV_MEM_DEBUG.
2007-08-21 09:48:33 +00:00
marko
4dfa0cc981 branches/zip: ha_innobase::add_index(): Remove the mem_heap_empty() call.
The index[] array that is allocated from the heap is still live.
2007-08-21 09:42:20 +00:00
marko
b59ce25d1e branches/zip: dict_foreign_eval_sql(): Print foreign->id as a table name
(in the database.id format).  This should have been changed in r1570.
2007-08-21 08:34:50 +00:00
marko
71f47ed2e2 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
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
2be769710c branches/zip: dict_table_rename_in_cache(): Improve the diagnostic printout
for the error cases.  Avoid copying the old table->name; the string will
remain valid in table->heap.
2007-08-20 09:43:30 +00:00
marko
9ce78f52ea branches/zip: Refuse fast index creation if newraw or innodb_force_recovery
have been set.

ha_innobase::add_index(), ha_innobase::prepare_drop_index(),
ha_innobase::final_drop_index(): Return HA_ERR_WRONG_COMMAND if
newraw or innodb_force_recovery have been set.
2007-08-20 09:13:26 +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
1e7b92f844 branches/zip: Use mem_heap_zalloc() when initializing
dict_table_t, dict_index_t, and dict_foreign_t.
2007-08-20 06:58:37 +00:00
marko
d4568988fd branches/zip: ha_innobase::write_row(): Remove an unreachable break statement. 2007-08-20 06:54:31 +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
marko
66f6a5acc8 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
c541324b21 branches/zip: Minor cleanup.
ha_innobase::add_index(), ha_innobase::prepare_drop_index():
Remove the redundant thd_test_options() calls.
The options are tested in check_trx_exists().

ha_innobase::prepare_drop_index(): key cannot be NULL; remove the tests.
Move the condition for checking foreign keys outside of the loop.
Remove the redundant error log printout about foreign key dependency.
2007-08-16 09:19:48 +00:00
marko
2c7f6f6a26 branches/zip: Remove redundant type casts. Change the parameter type
of ut_strcmp() from const void* to const char*.
2007-08-16 09:09:08 +00:00
marko
064e5aae3f branches/zip: dict0mem.h: Minor cleanup.
Remove the unused constant DICT_NOT_READY.
Make dict_index_t::type a bit-field, and move it next to other bit-fields.
Add a const qualifier to dict_index_t::name.
2007-08-16 08:48:29 +00:00
marko
91ee8176f6 branches/zip: Remove the error code DB_CANNOT_DROP_FOREIGN_INDEX.
It was only set by ha_innobase::prepare_drop_index(), which can return
the appropriate MySQL error code (HA_ERR_DROP_INDEX_FK) directly.

ha_innobase::add_index(): Correct the function comment.

ha_innobase::prepare_drop_index(): Correct the function comment.
Return MySQL error codes directly.

ha_innobase::final_drop_index(): Correct the function comment.
2007-08-15 15:49:58 +00:00
marko
dddb659202 branches/zip: row_mysql_handle_errors(): Replace the if-else with
switch-case.
2007-08-15 15:35:48 +00:00
marko
f218619067 branches/zip: Performance improvement:
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().
2007-08-15 11:54:15 +00:00
marko
6b7c6cb398 branches/zip: Minor cleanup.
trx_t: Change the type of error_info from void* to const dict_index_t*.

trx_get_error_info(): Add const qualifier to trx_t*.  Make this an
inline function.
2007-08-15 06:53:34 +00:00
marko
b008bc09a7 branches/zip: Fix two mistakes made in r1414
(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.
2007-08-13 17:15:31 +00:00
marko
04ae127d2d branches/zip: ha_innobase::add_index(): Do not merely check for a
key name "PRIMARY".  If the table has a generated clustered index,
also check for a UNIQUE INDEX containing no NULL columns.

innobase_create_index_def(): Add the parameter key_primary.

innobase_create_key_def(): Check if the first index is a UNIQUE index
consisting of NOT NULL columns.

Fixing this bug revealed another one: FOREIGN KEY constraints
will be lost when a PRIMARY KEY is created.  This is the reason why
innodb.test will fail.
2007-08-13 16:34:00 +00:00
marko
2cf5070fda branches/zip: ha_innobase::change_active_index(): Write to the error log
when the index could not be found.
2007-08-13 16:05:23 +00:00
marko
e0009cd4db branches/zip: Add some const qualifiers to dict_index_t* and dict_table_t*.
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.
2007-08-13 15:57:28 +00:00