Commit ef4a1ba0 authored by Vasil Dimov's avatar Vasil Dimov

Merge mysql-5.1-innodb from bk-internal locally

parents 22ad5ffa 45a2fee9
create table bug53290 (x bigint) engine=innodb;
insert into bug53290 () values (),(),(),(),(),(),(),(),(),(),(),();
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
alter table bug53290 add unique index `idx` (x);
drop table bug53290;
-- source include/have_innodb_plugin.inc
create table bug53290 (x bigint) engine=innodb;
insert into bug53290 () values (),(),(),(),(),(),(),(),(),(),(),();
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
insert into bug53290 select * from bug53290;
alter table bug53290 add unique index `idx` (x);
drop table bug53290;
...@@ -2000,6 +2000,7 @@ func_start: ...@@ -2000,6 +2000,7 @@ func_start:
goto insert_empty; goto insert_empty;
} }
} else if (UNIV_UNLIKELY(insert_left)) { } else if (UNIV_UNLIKELY(insert_left)) {
ut_a(n_iterations > 0);
first_rec = page_rec_get_next(page_get_infimum_rec(page)); first_rec = page_rec_get_next(page_get_infimum_rec(page));
move_limit = page_rec_get_next(btr_cur_get_rec(cursor)); move_limit = page_rec_get_next(btr_cur_get_rec(cursor));
} else { } else {
......
...@@ -1393,7 +1393,12 @@ buf_LRU_free_block( ...@@ -1393,7 +1393,12 @@ buf_LRU_free_block(
ut_ad(buf_page_in_file(bpage)); ut_ad(buf_page_in_file(bpage));
ut_ad(bpage->in_LRU_list); ut_ad(bpage->in_LRU_list);
ut_ad(!bpage->in_flush_list == !bpage->oldest_modification); ut_ad(!bpage->in_flush_list == !bpage->oldest_modification);
#if UNIV_WORD_SIZE == 4
/* On 32-bit systems, there is no padding in buf_page_t. On
other systems, Valgrind could complain about uninitialized pad
bytes. */
UNIV_MEM_ASSERT_RW(bpage, sizeof *bpage); UNIV_MEM_ASSERT_RW(bpage, sizeof *bpage);
#endif
if (!buf_page_can_relocate(bpage)) { if (!buf_page_can_relocate(bpage)) {
...@@ -1688,7 +1693,12 @@ buf_LRU_block_remove_hashed_page( ...@@ -1688,7 +1693,12 @@ buf_LRU_block_remove_hashed_page(
ut_a(buf_page_get_io_fix(bpage) == BUF_IO_NONE); ut_a(buf_page_get_io_fix(bpage) == BUF_IO_NONE);
ut_a(bpage->buf_fix_count == 0); ut_a(bpage->buf_fix_count == 0);
#if UNIV_WORD_SIZE == 4
/* On 32-bit systems, there is no padding in
buf_page_t. On other systems, Valgrind could complain
about uninitialized pad bytes. */
UNIV_MEM_ASSERT_RW(bpage, sizeof *bpage); UNIV_MEM_ASSERT_RW(bpage, sizeof *bpage);
#endif
buf_LRU_remove_block(bpage); buf_LRU_remove_block(bpage);
......
...@@ -931,7 +931,12 @@ buf_page_hash_get( ...@@ -931,7 +931,12 @@ buf_page_hash_get(
ut_a(buf_page_in_file(bpage)); ut_a(buf_page_in_file(bpage));
ut_ad(bpage->in_page_hash); ut_ad(bpage->in_page_hash);
ut_ad(!bpage->in_zip_hash); ut_ad(!bpage->in_zip_hash);
#if UNIV_WORD_SIZE == 4
/* On 32-bit systems, there is no padding in
buf_page_t. On other systems, Valgrind could complain
about uninitialized pad bytes. */
UNIV_MEM_ASSERT_RW(bpage, sizeof *bpage); UNIV_MEM_ASSERT_RW(bpage, sizeof *bpage);
#endif
} }
return(bpage); return(bpage);
......
...@@ -148,7 +148,9 @@ cmp_rec_rec_simple( ...@@ -148,7 +148,9 @@ cmp_rec_rec_simple(
const rec_t* rec2, /*!< in: physical record */ const rec_t* rec2, /*!< in: physical record */
const ulint* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ const ulint* offsets1,/*!< in: rec_get_offsets(rec1, ...) */
const ulint* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ const ulint* offsets2,/*!< in: rec_get_offsets(rec2, ...) */
const dict_index_t* index); /*!< in: data dictionary index */ const dict_index_t* index, /*!< in: data dictionary index */
ibool* null_eq);/*!< out: set to TRUE if
found matching null values */
/*************************************************************//** /*************************************************************//**
This function is used to compare two physical records. Only the common This function is used to compare two physical records. Only the common
first fields are compared, and if an externally stored field is first fields are compared, and if an externally stored field is
......
...@@ -571,7 +571,7 @@ page_zip_dir_encode( ...@@ -571,7 +571,7 @@ page_zip_dir_encode(
/* Traverse the list of stored records in the collation order, /* Traverse the list of stored records in the collation order,
starting from the first user record. */ starting from the first user record. */
rec = page + PAGE_NEW_INFIMUM, TRUE; rec = page + PAGE_NEW_INFIMUM;
i = 0; i = 0;
......
...@@ -706,7 +706,9 @@ cmp_rec_rec_simple( ...@@ -706,7 +706,9 @@ cmp_rec_rec_simple(
const rec_t* rec2, /*!< in: physical record */ const rec_t* rec2, /*!< in: physical record */
const ulint* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ const ulint* offsets1,/*!< in: rec_get_offsets(rec1, ...) */
const ulint* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ const ulint* offsets2,/*!< in: rec_get_offsets(rec2, ...) */
const dict_index_t* index) /*!< in: data dictionary index */ const dict_index_t* index, /*!< in: data dictionary index */
ibool* null_eq)/*!< out: set to TRUE if
found matching null values */
{ {
ulint rec1_f_len; /*!< length of current field in rec1 */ ulint rec1_f_len; /*!< length of current field in rec1 */
const byte* rec1_b_ptr; /*!< pointer to the current byte const byte* rec1_b_ptr; /*!< pointer to the current byte
...@@ -753,6 +755,9 @@ cmp_rec_rec_simple( ...@@ -753,6 +755,9 @@ cmp_rec_rec_simple(
|| rec2_f_len == UNIV_SQL_NULL) { || rec2_f_len == UNIV_SQL_NULL) {
if (rec1_f_len == rec2_f_len) { if (rec1_f_len == rec2_f_len) {
if (null_eq) {
*null_eq = TRUE;
}
goto next_field; goto next_field;
......
...@@ -1075,11 +1075,14 @@ row_merge_cmp( ...@@ -1075,11 +1075,14 @@ row_merge_cmp(
record to be compared */ record to be compared */
const ulint* offsets1, /*!< in: first record offsets */ const ulint* offsets1, /*!< in: first record offsets */
const ulint* offsets2, /*!< in: second record offsets */ const ulint* offsets2, /*!< in: second record offsets */
const dict_index_t* index) /*!< in: index */ const dict_index_t* index, /*!< in: index */
ibool* null_eq) /*!< out: set to TRUE if
found matching null values */
{ {
int cmp; int cmp;
cmp = cmp_rec_rec_simple(mrec1, mrec2, offsets1, offsets2, index); cmp = cmp_rec_rec_simple(mrec1, mrec2, offsets1, offsets2, index,
null_eq);
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
if (row_merge_print_cmp) { if (row_merge_print_cmp) {
...@@ -1445,11 +1448,13 @@ corrupt: ...@@ -1445,11 +1448,13 @@ corrupt:
} }
while (mrec0 && mrec1) { while (mrec0 && mrec1) {
ibool null_eq = FALSE;
switch (row_merge_cmp(mrec0, mrec1, switch (row_merge_cmp(mrec0, mrec1,
offsets0, offsets1, index)) { offsets0, offsets1, index,
&null_eq)) {
case 0: case 0:
if (UNIV_UNLIKELY if (UNIV_UNLIKELY
(dict_index_is_unique(index))) { (dict_index_is_unique(index) && !null_eq)) {
innobase_rec_to_mysql(table, mrec0, innobase_rec_to_mysql(table, mrec0,
index, offsets0); index, offsets0);
mem_heap_free(heap); mem_heap_free(heap);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment