Commit graph

766 commits

Author SHA1 Message Date
vasil
f38752862a branches/zip:
Move part of the code from lock_rec_print() in a separate function
buf_page_try_get() because the same functionality is needed in
INFORMATION SCHEMA code.

Approved by:	Heikki
2007-09-27 14:35:18 +00:00
vasil
89423c0455 branches/zip:
Add auxiliary function lock_rec_get_index() to retrieve the index on
which the lock is.

Approved by:	Heikki
2007-09-27 13:54:21 +00:00
vasil
54df816bb9 branches/zip:
Fix a bug where the condition (prtype & DATA_ROW_ID) is unexpectedly
always false becasue DATA_ROW_ID is 0.

Use a switch instead of if-else in order to avoid repeating
(prtype & DATA_SYS_PRTYPE_MASK).

Approved by:	Heikki
2007-09-27 13:52:47 +00:00
marko
a1e57e698b branches/zip: Merge 1862:1894 from trunk, except 1866. 2007-09-27 11:17:45 +00:00
marko
14b2f454cf branches/zip: Correctly convert InnoDB records to MySQL table->record[0].
innobase_col_to_mysql(): New function, adapted from
row_sel_field_store_in_mysql_format().

innobase_rec_to_mysql(): Correct the function comment, which was still
saying "clustered index record", although we can convert any record.
Make use of innobase_col_to_mysql().  Always call field->reset(),
so that innobase_col_to_mysql() will not have to pad anything.
2007-09-27 11:03:36 +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
79ec158732 branches/zip: innobase_rec_to_mysql(): Allow "index" to be any index,
clustered or secondary.  Remove the rec_offs_validate() assertion, because
the function may be passed a mrec_t* that would fail the check.
2007-09-27 08:19:38 +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
2646e38c58 branches/zip: Clean up some non-inlined functions.
dtuple_create_for_mysql(), dtuple_free_for_mysql(): Remove.

ha_innobase::records_in_range(): Use mem_heap_create(), mem_heap_free(),
and dtuple_create() instead of the removed functions above.  Since r1587,
InnoDB C++ functions can invoke inlined C functions.
2007-09-26 12:07:07 +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
f44bec1917 branches/zip: Minor cleanup.
dict_find_index_by_max_id(): Rename this static function to its
only caller, dict_table_get_index_by_max_id().

dict_table_get_index_by_max_id(): Copy the function comment from
dict_find_index_by_max_id().
2007-09-26 09:59:17 +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
9b1d1fff14 branches/zip: Minor cleanup.
dtuple_create(): Simplify a pointer expression.  Flag the fields uninitialized
after initializing them in the debug version.

dtuple_t: Only declare magic_n if UNIV_DEBUG is defined.  The field is
not assigned to nor tested unless UNIV_DEBUG is defined.
2007-09-26 06:37:17 +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
1595953ae9 branches/zip: Add some const qualifiers or in/out comments to the
dict_index_t* and dict_table_t* parameters of some functions.
2007-09-24 13:29:18 +00:00
vasil
9bbb520f8f branches/zip:
Copy any data (currently table name and table index) that may be
destroyed after releasing the kernel mutex into internal cache's
storage.

This is done in efficient manner using ha_storage type and a given
string is copied only once into the cache's storage. Later additions of
the same string use the already stored string, thus allocating memory
only once per unique string.

Approved by:	Marko
2007-09-24 12:25:06 +00:00
vasil
92ff5c4790 branches/zip:
Add a type that stores chunks of data in its own storage and avoids
duplicates. Supported methods:

ha_storage_create()
Allocates new storage object.

ha_storage_put()
Copies a given data chunk into the storage and returns pointer to the
copy. If the data chunk is already present, a pointer to the existing
object is returned and the given data chunk is not copied.

ha_storage_empty()
Clears (empties) the storage from all data chunks that are stored in it.

ha_storage_free()
Destroys a storage object. Opposite to ha_storage_create().

Approved by:	Marko
2007-09-24 12:21:29 +00:00
marko
ba051c35e7 branches/zip: Add const qualifiers to the dict_index_t* parameters of
rec_get_n_fields(), rec_offs_validate(), and rec_offs_make_valid().
2007-09-24 11:58:07 +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
vasil
29bb4b5459 branches/zip:
Non-functional: put the code that clears the IS cache into a separate
function.
2007-09-22 09:18:59 +00:00
vasil
a6ad375330 branches/zip:
Cosmetic: initialize the members of the cache in the same order as
they are defined in the structure.
2007-09-22 09:03:29 +00:00
vasil
841306b6bc branches/zip:
Make comment more clear (hopefully).
2007-09-22 08:36:59 +00:00
vasil
77a2323a44 branches/zip:
Use the newly introduced mem_alloc2() to use the memory that has been
allocated in addition to the requested memory. This is done in order to
avoid wasting memory.

Do not calculate the sizes and offsets of the chunks in advance in
table_cache_init() because it is unknown how much bytes will actually
be allocated by mem_alloc2(). Rather calculate these on the run: after
each chunk is allocated set its size and the offset of the next chunk.

Similar patch approved by:	Marko
2007-09-22 08:34:26 +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
4bf90e5355 branches/zip: Reduce internal memory fragmentation.
mem_alloc2(): New macro.  This is a variant of mem_alloc() that
returns the allocated size, which is equal to or greater than
the requested size.

mem_alloc_func(): Add the output parameter *size for the allocated size.
When it is set, adjust the parameter passed to mem_heap_alloc().

rec_copy_prefix_to_buf_old(), rec_copy_prefix_to_buf(): Use mem_alloc2()
instead of mem_alloc().
2007-09-21 12:45:46 +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
53b14f2f5d branches/zip: When creating a memory heap, set the block size to what
was actually obtained from the buddy allocator.  This should avoid some
internal memory fragmentation in mem_heap_create() and mem_heap_alloc().

mem_area_alloc(): Change the in parameter size to an in/out parameter.
Adjust the size based on what was obtained from pool->free_list[].

mem_heap_create_block(): Adjust block->len to what was obtained from
mem_area_alloc().
2007-09-21 10:22:58 +00:00
marko
809270166b 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
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
vasil
69a2345cbb 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
4a1d105a31 branches/zip: Merge 1830:1862 from trunk. 2007-09-20 08:36:22 +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
ec4059555b 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
23c5767ec6 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
f6aec10b49 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
0d9050315e 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
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
98d2ca10b5 branches/zip: row_ext_lookup_ith(): New function, sliced from
row_ext_lookup().
2007-09-19 07:11:13 +00:00
marko
5de8acee56 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
62ede4fcd4 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