diff options
author | unknown <marko@hundin.mysql.fi> | 2005-06-21 07:36:18 +0300 |
---|---|---|
committer | unknown <marko@hundin.mysql.fi> | 2005-06-21 07:36:18 +0300 |
commit | 2fb07495ed6aded3a3c9bdbd9456bbe692362bc2 (patch) | |
tree | 767c26a535c75a55034463ff090808d95891c741 /innobase/row/row0ins.c | |
parent | c2e9730818d9b4a3aa2c237085d3cd41e3001414 (diff) | |
parent | 3236060592757ec84b4abcd9e617009dd68555e1 (diff) | |
download | mariadb-git-2fb07495ed6aded3a3c9bdbd9456bbe692362bc2.tar.gz |
Merge hundin.mysql.fi:/home/marko/mysql-5.0
into hundin.mysql.fi:/home/marko/mysql-5.0-current
innobase/dict/dict0dict.c:
Auto merged
innobase/fil/fil0fil.c:
Auto merged
innobase/include/lock0lock.h:
Auto merged
innobase/lock/lock0lock.c:
Auto merged
innobase/os/os0file.c:
Auto merged
innobase/row/row0ins.c:
Auto merged
innobase/row/row0mysql.c:
Auto merged
innobase/srv/srv0start.c:
Auto merged
innobase/trx/trx0trx.c:
Auto merged
sql/ha_innodb.cc:
Auto merged
sql/ha_innodb.h:
Auto merged
sql/mysqld.cc:
Auto merged
Diffstat (limited to 'innobase/row/row0ins.c')
-rw-r--r-- | innobase/row/row0ins.c | 108 |
1 files changed, 62 insertions, 46 deletions
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index 303fe5749bc..776094d0de5 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -478,7 +478,7 @@ row_ins_cascade_calc_update_vec( if (parent_ufield->field_no == parent_field_no) { - ulint fixed_size; + ulint min_size; /* A field in the parent index record is updated. Let us make the update vector @@ -508,10 +508,13 @@ row_ins_cascade_calc_update_vec( column, do not allow the update */ if (ufield->new_val.len != UNIV_SQL_NULL - && ufield->new_val.len - > dtype_get_len(type)) { + && dtype_get_at_most_n_mbchars( + type, dtype_get_len(type), + ufield->new_val.len, + ufield->new_val.data) + < ufield->new_val.len) { - return(ULINT_UNDEFINED); + return(ULINT_UNDEFINED); } /* If the parent column type has a different @@ -519,29 +522,46 @@ row_ins_cascade_calc_update_vec( need to pad with spaces the new value of the child column */ - fixed_size = dtype_get_fixed_size(type); - - /* TODO: pad in UCS-2 with 0x0020. - TODO: How does the special truncation of - UTF-8 CHAR cols affect this? */ + min_size = dtype_get_min_size(type); - if (fixed_size + if (min_size && ufield->new_val.len != UNIV_SQL_NULL - && ufield->new_val.len < fixed_size) { + && ufield->new_val.len < min_size) { + char* pad_start; + const char* pad_end; ufield->new_val.data = mem_heap_alloc(heap, - fixed_size); - ufield->new_val.len = fixed_size; - ut_a(dtype_get_pad_char(type) - != ULINT_UNDEFINED); - - memset(ufield->new_val.data, - (byte)dtype_get_pad_char(type), - fixed_size); + min_size); + pad_start = ufield->new_val.data + + ufield->new_val.len; + pad_end = ufield->new_val.data + + min_size; + ufield->new_val.len = min_size; ut_memcpy(ufield->new_val.data, parent_ufield->new_val.data, parent_ufield->new_val.len); + + switch (UNIV_EXPECT( + dtype_get_mbminlen(type), 1)) { + default: + ut_error; + case 1: + /* space=0x20 */ + memset(pad_start, 0x20, + pad_end - pad_start); + break; + case 2: + /* space=0x0020 */ + ut_a(!(ufield->new_val.len + % 2)); + ut_a(!(min_size % 2)); + do { + *pad_start++ = 0x00; + *pad_start++ = 0x20; + } while (pad_start < pad_end); + break; + } } ufield->extern_storage = FALSE; @@ -1255,9 +1275,11 @@ run_again: /* Scan index records and check if there is a matching record */ for (;;) { + page_t* page; rec = btr_pcur_get_rec(&pcur); + page = buf_frame_align(rec); - if (rec == page_get_infimum_rec(buf_frame_align(rec))) { + if (rec == page_get_infimum_rec(page)) { goto next_rec; } @@ -1265,7 +1287,7 @@ run_again: offsets = rec_get_offsets(rec, check_index, offsets, ULINT_UNDEFINED, &heap); - if (rec == page_get_supremum_rec(buf_frame_align(rec))) { + if (rec == page_get_supremum_rec(page)) { err = row_ins_set_shared_rec_lock(LOCK_ORDINARY, rec, check_index, offsets, thr); @@ -1392,7 +1414,7 @@ do_possible_lock_wait: } exit_func: - if (heap) { + if (UNIV_LIKELY_NULL(heap)) { mem_heap_free(heap); } return(err); @@ -1529,12 +1551,7 @@ row_ins_dupl_error_with_rec( } } - if (!rec_get_deleted_flag(rec, index->table->comp)) { - - return(TRUE); - } - - return(FALSE); + return(!rec_get_deleted_flag(rec, rec_offs_comp(offsets))); } /******************************************************************* @@ -1629,7 +1646,7 @@ row_ins_scan_sec_index_for_duplicate( break; } - if (rec == page_get_supremum_rec(buf_frame_align(rec))) { + if (page_rec_is_supremum(rec)) { goto next_rec; } @@ -1660,7 +1677,7 @@ next_rec: } } - if (heap) { + if (UNIV_LIKELY_NULL(heap)) { mem_heap_free(heap); } mtr_commit(&mtr); @@ -1697,7 +1714,6 @@ row_ins_duplicate_error_in_clust( #ifndef UNIV_HOTBACKUP ulint err; rec_t* rec; - page_t* page; ulint n_unique; trx_t* trx = thr_get_trx(thr); mem_heap_t*heap = NULL; @@ -1728,9 +1744,8 @@ row_ins_duplicate_error_in_clust( if (cursor->low_match >= n_unique) { rec = btr_cur_get_rec(cursor); - page = buf_frame_align(rec); - if (rec != page_get_infimum_rec(page)) { + if (!page_rec_is_infimum(rec)) { offsets = rec_get_offsets(rec, cursor->index, offsets, ULINT_UNDEFINED, &heap); @@ -1772,9 +1787,8 @@ row_ins_duplicate_error_in_clust( if (cursor->up_match >= n_unique) { rec = page_rec_get_next(btr_cur_get_rec(cursor)); - page = buf_frame_align(rec); - if (rec != page_get_supremum_rec(page)) { + if (!page_rec_is_supremum(rec)) { offsets = rec_get_offsets(rec, cursor->index, offsets, ULINT_UNDEFINED, &heap); @@ -1842,7 +1856,6 @@ row_ins_must_modify( { ulint enough_match; rec_t* rec; - page_t* page; /* NOTE: (compare to the note in row_ins_duplicate_error) Because node pointers on upper levels of the B-tree may match more to entry than @@ -1856,9 +1869,8 @@ row_ins_must_modify( if (cursor->low_match >= enough_match) { rec = btr_cur_get_rec(cursor); - page = buf_frame_align(rec); - if (rec != page_get_infimum_rec(page)) { + if (!page_rec_is_infimum(rec)) { return(ROW_INS_PREV); } @@ -1897,7 +1909,6 @@ row_ins_index_entry_low( ulint modify = 0; /* remove warning */ rec_t* insert_rec; rec_t* rec; - rec_t* first_rec; ulint err; ulint n_unique; big_rec_t* big_rec = NULL; @@ -1932,15 +1943,20 @@ row_ins_index_entry_low( err = DB_SUCCESS; goto function_exit; - } - - first_rec = page_rec_get_next(page_get_infimum_rec( - buf_frame_align(btr_cur_get_rec(&cursor)))); + } + +#ifdef UNIV_DEBUG + { + page_t* page = btr_cur_get_page(&cursor); + rec_t* first_rec = page_rec_get_next( + page_get_infimum_rec(page)); - if (!page_rec_is_supremum(first_rec)) { - ut_a(rec_get_n_fields(first_rec, index) + if (UNIV_LIKELY(first_rec != page_get_supremum_rec(page))) { + ut_a(rec_get_n_fields(first_rec, index) == dtuple_get_n_fields(entry)); + } } +#endif n_unique = dict_index_get_n_unique(index); @@ -2048,7 +2064,7 @@ function_exit: mtr_commit(&mtr); } - if (heap) { + if (UNIV_LIKELY_NULL(heap)) { mem_heap_free(heap); } return(err); |