mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Merge r3403..3414 from mysql-5.1-innodb:
------------------------------------------------------------ revno: 3414 revision-id: marko.makela@oracle.com-20100422093342-jf9ojlzdqsdebohn parent: marko.makela@oracle.com-20100421185359-8qaxoa2yyrpzwdd7 committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Thu 2010-04-22 12:33:42 +0300 message: Correct the definition of DICT_SYS_INDEXES_NAME_FIELD. When row_merge_drop_temp_indexes() was reworked to drop the indexes via the data dictionary cache, the code was broken because it would read the index name from the wrong field. modified: storage/innodb_plugin/ChangeLog 2425@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2FChangeLog storage/innodb_plugin/dict/dict0boot.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fdict%2Fdict0boot.c storage/innodb_plugin/include/dict0boot.h 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Finclude%2Fdict0boot.h ------------------------------------------------------------ revno: 3413 revision-id: marko.makela@oracle.com-20100421185359-8qaxoa2yyrpzwdd7 parent: marko.makela@oracle.com-20100421102723-0i80uezbyu0ekj5d committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Wed 2010-04-21 21:53:59 +0300 message: btr_page_split_and_insert(): Avoid an infinite loop. (Bug #52964) btr_page_tuple_smaller(): New function, refactored from btr_page_split_and_insert(). btr_page_get_split_rec(): Renamed from btr_page_get_sure_split_rec(). Note that a NULL return may mean that the tuple is to be inserted into either the lower or upper page, to be determined by btr_page_tuple_smaller(). btr_page_split_and_insert(): When btr_page_get_split_rec() returns NULL, invoke btr_page_tuple_smaller() to determine which half-page the tuple belongs to. Reviewed by Sunny Bains modified: storage/innodb_plugin/ChangeLog 2425@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2FChangeLog storage/innodb_plugin/btr/btr0btr.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fbtr%2Fbtr0btr.c ------------------------------------------------------------ revno: 3412 revision-id: marko.makela@oracle.com-20100421102723-0i80uezbyu0ekj5d parent: marko.makela@oracle.com-20100421100029-mji6lmdgvuqh96qq committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Wed 2010-04-21 13:27:23 +0300 message: dict_create_index_step(): Be strict about DYNAMIC and COMPRESSED tables. Bug #50495 is about REDUNDANT and COMPACT tables, after all. modified: mysql-test/suite/innodb_plugin/r/innodb-zip.result 2252@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2Fmysql-test%2Finnodb-zip.result mysql-test/suite/innodb_plugin/t/innodb-zip.test 2252@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2Fmysql-test%2Finnodb-zip.test storage/innodb_plugin/ChangeLog 2425@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2FChangeLog storage/innodb_plugin/dict/dict0crea.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fdict%2Fdict0crea.c ------------------------------------------------------------ revno: 3411 revision-id: marko.makela@oracle.com-20100421100029-mji6lmdgvuqh96qq parent: marko.makela@oracle.com-20100421095033-0acvzxb8um8cms0a committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Wed 2010-04-21 13:00:29 +0300 message: ha_innobase::add_index(): Only check for duplicate indexes when the data dictionary is locked. This fixes a UNIV_DEBUG assertion failure in innodb-index.test. modified: storage/innodb_plugin/handler/handler0alter.cc 1845@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2Fhandler%2Fhandler0alter.cc ------------------------------------------------------------ revno: 3410 revision-id: marko.makela@oracle.com-20100421095033-0acvzxb8um8cms0a parent: marko.makela@oracle.com-20100421094032-ir4glqk46qvg2ywn committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Wed 2010-04-21 12:50:33 +0300 message: dtuple_convert_big_rec(): Store locally any fields whose maximum length is less than 256 bytes. (Bug #52745) Add related comments and debug assertions to the "offsets" functions in rem0rec.c. Approved by Sunny Bains modified: storage/innodb_plugin/ChangeLog 2425@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2FChangeLog storage/innodb_plugin/data/data0data.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fdata%2Fdata0data.c storage/innodb_plugin/rem/rem0rec.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Frem%2Frem0rec.c ------------------------------------------------------------ revno: 3409 revision-id: marko.makela@oracle.com-20100421094032-ir4glqk46qvg2ywn parent: marko.makela@oracle.com-20100421091611-uu46iygmv5sizjru committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Wed 2010-04-21 12:40:32 +0300 message: Adjust tests for the Bug #50495 fix. modified: mysql-test/suite/innodb_plugin/r/innodb-zip.result 2252@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2Fmysql-test%2Finnodb-zip.result mysql-test/suite/innodb_plugin/t/innodb-zip.test 2252@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2Fmysql-test%2Finnodb-zip.test mysql-test/suite/innodb_plugin/t/innodb_bug36169.test 2418@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2Fmysql-test%2Finnodb_bug36169.test ------------------------------------------------------------ revno: 3408 revision-id: marko.makela@oracle.com-20100421091611-uu46iygmv5sizjru parent: marko.makela@oracle.com-20100421063916-h3gwjea7jzjilyww committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Wed 2010-04-21 12:16:11 +0300 message: rec_convert_dtuple_to_rec(): Correct the debug check. The "extern" accessor functions return zero or nonzero, not 0 or 1. modified: storage/innodb_plugin/rem/rem0rec.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Frem%2Frem0rec.c ------------------------------------------------------------ revno: 3407 revision-id: marko.makela@oracle.com-20100421063916-h3gwjea7jzjilyww parent: marko.makela@oracle.com-20100420201550-cax1xywvlcdshgfg committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Wed 2010-04-21 09:39:16 +0300 message: rec_convert_dtuple_to_rec(): Add a debug check. modified: storage/innodb_plugin/rem/rem0rec.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Frem%2Frem0rec.c ------------------------------------------------------------ revno: 3406 revision-id: marko.makela@oracle.com-20100420201550-cax1xywvlcdshgfg parent: marko.makela@oracle.com-20100420114222-diq7h2hiom9ww6me committer: Marko Makela <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Tue 2010-04-20 23:15:50 +0300 message: btr_cur_optimistic_insert(): Remove unused variable "heap". modified: storage/innodb_plugin/btr/btr0cur.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fbtr%2Fbtr0cur.c ------------------------------------------------------------ revno: 3405 revision-id: marko.makela@oracle.com-20100420114222-diq7h2hiom9ww6me parent: marko.makela@oracle.com-20100420082908-tpako8jd4imkh1xb committer: Marko Makela <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Tue 2010-04-20 14:42:22 +0300 message: dict_create_index_step(): Invoke dict_index_add_to_cache() in strict mode only if innodb_strict_mode is set. (Bug #50495) trx_is_strict(): New function, for checking innodb_strict_mode. modified: storage/innodb_plugin/ChangeLog 2425@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2FChangeLog storage/innodb_plugin/dict/dict0crea.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fdict%2Fdict0crea.c storage/innodb_plugin/handler/ha_innodb.cc 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fhandler%2Fha_innodb.cc storage/innodb_plugin/include/trx0trx.h 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Finclude%2Ftrx0trx.h ------------------------------------------------------------ revno: 3404 revision-id: marko.makela@oracle.com-20100420082908-tpako8jd4imkh1xb parent: marko.makela@oracle.com-20100419103603-u5pz4qc6hfhx4nua committer: Marko M?kel? <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Tue 2010-04-20 11:29:08 +0300 message: Implement UNIV_BTR_AVOID_COPY, an optimization of page splits. modified: storage/innodb_plugin/ChangeLog 2425@16c675df-0fcb-4bc9-8058-dcc011a37293:branches%2Fzip%2FChangeLog storage/innodb_plugin/btr/btr0btr.c 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Fbtr%2Fbtr0btr.c storage/innodb_plugin/include/univ.i 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Finclude%2Funiv.i ------------------------------------------------------------ revno: 3403 revision-id: marko.makela@oracle.com-20100419103603-u5pz4qc6hfhx4nua parent: marko.makela@oracle.com-20100419094405-fd3xwadullishv07 committer: Marko =?ISO-8859-1?Q?M=E4kel=E4?= <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Mon 2010-04-19 13:36:03 +0300 message: Enable UNIV_DEBUG_VALGRIND when HAVE_purify is set. modified: storage/innobase/include/univ.i 2@cee13dc7-1704-0410-992b-c9b4543f1246:trunk%2Finclude%2Funiv.i storage/innodb_plugin/include/univ.i 2@16c675df-0fcb-4bc9-8058-dcc011a37293:trunk%2Finclude%2Funiv.i
This commit is contained in:
parent
d7ffd1a088
commit
66b4a1e614
13 changed files with 200 additions and 57 deletions
|
|
@ -1455,11 +1455,11 @@ Calculates a split record such that the tuple will certainly fit on
|
|||
its half-page when the split is performed. We assume in this function
|
||||
only that the cursor page has at least one user record.
|
||||
@return split record, or NULL if tuple will be the first record on
|
||||
upper half-page */
|
||||
the lower or upper half-page (determined by btr_page_tuple_smaller()) */
|
||||
static
|
||||
rec_t*
|
||||
btr_page_get_sure_split_rec(
|
||||
/*========================*/
|
||||
btr_page_get_split_rec(
|
||||
/*===================*/
|
||||
btr_cur_t* cursor, /*!< in: cursor at which insert should be made */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
ulint n_ext) /*!< in: number of externally stored columns */
|
||||
|
|
@ -1835,6 +1835,37 @@ btr_attach_half_pages(
|
|||
btr_page_set_next(upper_page, upper_page_zip, next_page_no, mtr);
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
Determine if a tuple is smaller than any record on the page.
|
||||
@return TRUE if smaller */
|
||||
static
|
||||
ibool
|
||||
btr_page_tuple_smaller(
|
||||
/*===================*/
|
||||
btr_cur_t* cursor, /*!< in: b-tree cursor */
|
||||
const dtuple_t* tuple, /*!< in: tuple to consider */
|
||||
ulint* offsets,/*!< in/out: temporary storage */
|
||||
ulint n_uniq, /*!< in: number of unique fields
|
||||
in the index page records */
|
||||
mem_heap_t** heap) /*!< in/out: heap for offsets */
|
||||
{
|
||||
buf_block_t* block;
|
||||
const rec_t* first_rec;
|
||||
page_cur_t pcur;
|
||||
|
||||
/* Read the first user record in the page. */
|
||||
block = btr_cur_get_block(cursor);
|
||||
page_cur_set_before_first(block, &pcur);
|
||||
page_cur_move_to_next(&pcur);
|
||||
first_rec = page_cur_get_rec(&pcur);
|
||||
|
||||
offsets = rec_get_offsets(
|
||||
first_rec, cursor->index, offsets,
|
||||
n_uniq, heap);
|
||||
|
||||
return(cmp_dtuple_rec(tuple, first_rec, offsets) < 0);
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
Splits an index page to halves and inserts the tuple. It is assumed
|
||||
that mtr holds an x-latch to the index tree. NOTE: the tree x-latch is
|
||||
|
|
@ -1909,49 +1940,45 @@ func_start:
|
|||
if (n_iterations > 0) {
|
||||
direction = FSP_UP;
|
||||
hint_page_no = page_no + 1;
|
||||
split_rec = btr_page_get_sure_split_rec(cursor, tuple, n_ext);
|
||||
split_rec = btr_page_get_split_rec(cursor, tuple, n_ext);
|
||||
|
||||
if (UNIV_UNLIKELY(split_rec == NULL)) {
|
||||
insert_left = btr_page_tuple_smaller(
|
||||
cursor, tuple, offsets, n_uniq, &heap);
|
||||
}
|
||||
} else if (btr_page_get_split_rec_to_right(cursor, &split_rec)) {
|
||||
direction = FSP_UP;
|
||||
hint_page_no = page_no + 1;
|
||||
insert_left = FALSE;
|
||||
|
||||
} else if (btr_page_get_split_rec_to_left(cursor, &split_rec)) {
|
||||
direction = FSP_DOWN;
|
||||
hint_page_no = page_no - 1;
|
||||
ut_ad(split_rec);
|
||||
} else {
|
||||
direction = FSP_UP;
|
||||
hint_page_no = page_no + 1;
|
||||
|
||||
if (page_get_n_recs(page) == 1) {
|
||||
page_cur_t pcur;
|
||||
/* If there is only one record in the index page, we
|
||||
can't split the node in the middle by default. We need
|
||||
to determine whether the new record will be inserted
|
||||
to the left or right. */
|
||||
|
||||
/* There is only one record in the index page
|
||||
therefore we can't split the node in the middle
|
||||
by default. We need to determine whether the
|
||||
new record will be inserted to the left or right. */
|
||||
|
||||
/* Read the first (and only) record in the page. */
|
||||
page_cur_set_before_first(block, &pcur);
|
||||
page_cur_move_to_next(&pcur);
|
||||
first_rec = page_cur_get_rec(&pcur);
|
||||
|
||||
offsets = rec_get_offsets(
|
||||
first_rec, cursor->index, offsets,
|
||||
n_uniq, &heap);
|
||||
|
||||
/* If the new record is less than the existing record
|
||||
the split in the middle will copy the existing
|
||||
record to the new node. */
|
||||
if (cmp_dtuple_rec(tuple, first_rec, offsets) < 0) {
|
||||
split_rec = page_get_middle_rec(page);
|
||||
} else {
|
||||
split_rec = NULL;
|
||||
}
|
||||
} else {
|
||||
if (page_get_n_recs(page) > 1) {
|
||||
split_rec = page_get_middle_rec(page);
|
||||
} else if (btr_page_tuple_smaller(cursor, tuple,
|
||||
offsets, n_uniq, &heap)) {
|
||||
split_rec = page_rec_get_next(
|
||||
page_get_infimum_rec(page));
|
||||
} else {
|
||||
split_rec = NULL;
|
||||
insert_left = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* At this point, insert_left is initialized if split_rec == NULL
|
||||
and may be uninitialized otherwise. */
|
||||
|
||||
/* 2. Allocate a new page to the index */
|
||||
new_block = btr_page_alloc(cursor->index, hint_page_no, direction,
|
||||
btr_page_get_level(page, mtr), mtr);
|
||||
|
|
@ -1978,11 +2005,11 @@ func_start:
|
|||
avoid further splits by inserting the record
|
||||
to an empty page. */
|
||||
split_rec = NULL;
|
||||
goto insert_right;
|
||||
goto insert_empty;
|
||||
}
|
||||
} else {
|
||||
insert_right:
|
||||
insert_left = FALSE;
|
||||
insert_empty:
|
||||
ut_ad(!split_rec);
|
||||
buf = mem_alloc(rec_get_converted_size(cursor->index,
|
||||
tuple, n_ext));
|
||||
|
||||
|
|
@ -2019,7 +2046,17 @@ insert_right:
|
|||
}
|
||||
|
||||
/* 5. Move then the records to the new page */
|
||||
if (direction == FSP_DOWN) {
|
||||
if (direction == FSP_DOWN
|
||||
#ifdef UNIV_BTR_AVOID_COPY
|
||||
&& page_rec_is_supremum(move_limit)) {
|
||||
/* Instead of moving all records, make the new page
|
||||
the empty page. */
|
||||
|
||||
left_block = block;
|
||||
right_block = new_block;
|
||||
} else if (direction == FSP_DOWN
|
||||
#endif /* UNIV_BTR_AVOID_COPY */
|
||||
) {
|
||||
/* fputs("Split left\n", stderr); */
|
||||
|
||||
if (0
|
||||
|
|
@ -2062,6 +2099,14 @@ insert_right:
|
|||
right_block = block;
|
||||
|
||||
lock_update_split_left(right_block, left_block);
|
||||
#ifdef UNIV_BTR_AVOID_COPY
|
||||
} else if (!split_rec) {
|
||||
/* Instead of moving all records, make the new page
|
||||
the empty page. */
|
||||
|
||||
left_block = new_block;
|
||||
right_block = block;
|
||||
#endif /* UNIV_BTR_AVOID_COPY */
|
||||
} else {
|
||||
/* fputs("Split right\n", stderr); */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue