Commit graph

781 commits

Author SHA1 Message Date
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
a44c590508 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
826fe59e91 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
vasil
b9982ac9ec Implement INFORMATION_SCHEMA tables innodb_trx, innodb_locks,
innodb_lock_waits. See
https://svn.innodb.com/innobase/InformationSchema/TransactionsAndLocks
for design notes.

Things that need to be resolved before this goes live:
* MySQL must add thd_get_thread_id() function to their code
  http://bugs.mysql.com/30930
* Allocate memory from mem_heap instead of using mem_alloc()
* Copy table name and index name into the cache because they may be
  freed later which will result in referencing freed memory

Approved by:	Marko
2007-09-20 11:23:44 +00:00
marko
f5e4a4c3ed branches/zip: Merge 1830:1862 from trunk. 2007-09-20 08:36:22 +00:00
marko
5003c18d27 branches/zip: Improve Valgrind instrumentation in the merge block I/O
of fast index creation.
2007-09-19 13:52:43 +00:00
marko
79854fb2d6 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
15b12a703a branches/zip: cmp_rec_rec_simple(): Compare n_uniq columns instead of
all columns present in offsets.  Add a const qualifier to the
dict_index_t* parameter.
2007-09-19 11:31:00 +00:00
marko
861d8fb842 branches/zip: dict_index_get_n_unique_in_tree(), dict_index_get_n_unique():
Add const qualifiers.
2007-09-19 09:49:58 +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
52c0513083 branches/zip: rec_init_offsets(): Fix a bug that was introduced in r1518:
Correctly handle node pointer records containing variable-length columns
with two-byte length.
2007-09-19 09:05:16 +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
06b6f54447 branches/zip: row_ext_lookup_ith(): New function, sliced from
row_ext_lookup().
2007-09-19 07:11:13 +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
1fabfe9c99 branches/zip: Move the code related to fast index creation
(smart ALTER TABLE) from ha_innodb.cc to a separate module, handler0alter.cc.
2007-09-13 09:31:54 +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
1b52ef61f9 branches/zip: ha_node_t: Enclose the field buf_block_t* block inside
#ifdef UNIV_DEBUG.  This should have been done in r1014.
2007-09-12 10:44:53 +00:00
marko
5f11ccfd47 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
5cff259229 branches/zip: ha_innobase::add_index(): Fix a race condition that
existed before the fast-index-creation code was merged, in r1414.

Do not call row_prebuilt_table_obsolete(innodb_table) until after
the table has been renamed to a temporary name.  Otherwise, the
following could happen when creating a clustered index on table T:

(a1) copy T to T#1
(a2) mark T obsolete
(b1) add the name of T to the background drop list
(a3) rename T to T#2 and T#1 to T
(b2) drop the table on the background

These steps are executed by two threads, a and b.

If b1 is executed after a3, all is fine: the name T#2 will be added
to the background drop list.  If b1 is executed before a3, the name
T will be added, and T#2 will survive.
2007-09-11 06:20:19 +00:00
marko
cee366907b 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
inaam
22d5997dbc branches/zip: Undo changes commited in r1832.
These should have gone to branches/fts.

Spotted by: Marko and Ken
2007-09-11 00:41:02 +00:00
inaam
ae1bf9e3e9 branches/zip: undo changes made in r1763.
These should have gone in branches/fts

Spotted by: Marko and Ken
2007-09-11 00:38:13 +00:00
inaam
24741ad8f7 branches/zip: Enabled group commit functionality with XA.
Reviewed by: Heikki
2007-09-10 17:06:44 +00:00
marko
7c680d2f3e branches/zip: Merge 1809:1830 from trunk. 2007-09-10 10:09:01 +00:00
marko
8f98e9099c branches/zip: UNIV_MEM_ASSERT_AND_FREE():
Use UNIV_MEM_ASSERT_W() instead of UNIV_MEM_ASSERT_RW().
The memory area need not be initialized.
This mistake was made in r1815.
2007-09-07 12:39:36 +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
0a2e8d97be branches/zip: ha_innobase::add_index(): Allocate a new transaction for
the dictionary operations.

TODO: ha_innobase::final_drop_index() should do the same, and set
trx->dict_operation as well.
2007-09-06 12:43:29 +00:00
marko
55e009428e branches/zip: mem_init_buf(), mem_erase_buf(): Add UNIV_MEM_ASSERT_W(). 2007-09-06 12:25:38 +00:00
marko
4867227690 branches/zip: univ.i: Remove the duplicate UNIV_MEM_DEBUG that was
accidentally added in r1815.
2007-09-06 11:44:00 +00:00
marko
372a25240a branches/zip: Improve Valgrind instrumentation.
UNIV_MEM_ASSERT_RW(): New macro, to check that the contents of a memory
area is defined.

UNIV_MEM_ASSERT_W(): New macro, to check that a memory area is writable.

UNIV_MEM_ASSERT_AND_FREE(): New macro, to check that the memory is
writable before declaring it free (unwritable).  This replaces UNIV_MEM_FREE()
in many places.

mem_init_buf(): Declare the memory undefined.

mem_erase_buf(): Declare the memory freed.
2007-09-06 11:36:35 +00:00
marko
94e707cf3c branches/zip: Merge 1792:1809 from trunk. 2007-09-06 07:12:12 +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
52a8928693 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
63805a307b 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
ad9b8c6a48 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
8030aa2dae 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
ccb384e236 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
73311227dd 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
4c8d01ef84 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
97b8960beb branches/zip: Merge 1783:1792 from trunk. 2007-09-03 08:44:39 +00:00
marko
37e720811b 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
a4132905cd 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
faec4797c8 branches/zip: Merge 1664:1783 from trunk. 2007-08-30 09:21:25 +00:00
marko
fac65f0bd5 branches/zip: Add const qualifiers to some XID* parameters. 2007-08-30 06:43:27 +00:00
marko
63b2f038e0 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
ffce28bf45 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
a9c7b3c543 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
64dfb280d2 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
3131340b34 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