summaryrefslogtreecommitdiff
path: root/innobase/btr/btr0cur.c
diff options
context:
space:
mode:
authormonty@mysql.com <>2003-12-17 17:35:34 +0200
committermonty@mysql.com <>2003-12-17 17:35:34 +0200
commite0cc6799ecc831d296c568c5068947c1421fcaa5 (patch)
tree93924b5aab311e02a0f0931cf91e67cdfad04bdf /innobase/btr/btr0cur.c
parent0462f48b344633c7d88d12d9667f4bd50b91c552 (diff)
parent30e318311b35b109d230f7184fe0be1b6e29f02b (diff)
downloadmariadb-git-e0cc6799ecc831d296c568c5068947c1421fcaa5.tar.gz
Merge with 4.0.17
Diffstat (limited to 'innobase/btr/btr0cur.c')
-rw-r--r--innobase/btr/btr0cur.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c
index 93e9e815c99..b2bfdbec4e4 100644
--- a/innobase/btr/btr0cur.c
+++ b/innobase/btr/btr0cur.c
@@ -1151,7 +1151,6 @@ btr_cur_pessimistic_insert(
}
/*==================== B-TREE UPDATE =========================*/
-/* Only clustered index records are modified using these functions */
/*****************************************************************
For an update, checks the locks and does the undo logging. */
@@ -1175,12 +1174,16 @@ btr_cur_upd_lock_and_undo(
ut_ad(cursor && update && thr && roll_ptr);
- /* Only clustered index records are updated using this function */
- ut_ad((cursor->index)->type & DICT_CLUSTERED);
-
rec = btr_cur_get_rec(cursor);
index = cursor->index;
+ if (!(index->type & DICT_CLUSTERED)) {
+ /* We do undo logging only when we update a clustered index
+ record */
+ return(lock_sec_rec_modify_check_and_lock(flags, rec, index,
+ thr));
+ }
+
/* Check if we have to wait for a lock: enqueue an explicit lock
request if yes */
@@ -1227,6 +1230,13 @@ btr_cur_update_in_place_log(
mach_write_to_1(log_ptr, flags);
log_ptr++;
+ /* The code below assumes index is a clustered index: change index to
+ the clustered index if we are updating a secondary index record (or we
+ could as well skip writing the sys col values to the log in this case
+ because they are not needed for a secondary index record update) */
+
+ index = dict_table_get_first_index(index->table);
+
log_ptr = row_upd_write_sys_vals_to_log(index, trx, roll_ptr, log_ptr,
mtr);
mach_write_to_2(log_ptr, rec - buf_frame_align(rec));
@@ -1394,13 +1404,10 @@ btr_cur_update_in_place(
buf_block_t* block;
ulint err;
rec_t* rec;
- dulint roll_ptr;
+ dulint roll_ptr = ut_dulint_zero;
trx_t* trx;
ibool was_delete_marked;
- /* Only clustered index records are updated using this function */
- ut_ad(cursor->index->type & DICT_CLUSTERED);
-
rec = btr_cur_get_rec(cursor);
index = cursor->index;
trx = thr_get_trx(thr);
@@ -1425,7 +1432,12 @@ btr_cur_update_in_place(
block = buf_block_align(rec);
if (block->is_hashed) {
- if (row_upd_changes_ord_field_binary(NULL, index, update)) {
+ /* The function row_upd_changes_ord_field_binary works only
+ if the update vector was built for a clustered index, we must
+ NOT call it if index is secondary */
+
+ if (!(index->type & DICT_CLUSTERED)
+ || row_upd_changes_ord_field_binary(NULL, index, update)) {
/* Remove possible hash index pointer to this record */
btr_search_update_hash_on_delete(cursor);
@@ -1499,9 +1511,6 @@ btr_cur_optimistic_update(
mem_heap_t* heap;
ibool reorganized = FALSE;
ulint i;
-
- /* Only clustered index records are updated using this function */
- ut_ad((cursor->index)->type & DICT_CLUSTERED);
page = btr_cur_get_page(cursor);
rec = btr_cur_get_rec(cursor);
@@ -1551,8 +1560,8 @@ btr_cur_optimistic_update(
new_entry = row_rec_to_index_entry(ROW_COPY_DATA, index, rec, heap);
- row_upd_index_replace_new_col_vals(new_entry, index, update, NULL);
-
+ row_upd_index_replace_new_col_vals_index_pos(new_entry, index, update,
+ NULL);
old_rec_size = rec_get_size(rec);
new_rec_size = rec_get_converted_size(new_entry);
@@ -1735,7 +1744,6 @@ btr_cur_pessimistic_update(
index = cursor->index;
tree = index->tree;
- ut_ad(index->type & DICT_CLUSTERED);
ut_ad(mtr_memo_contains(mtr, dict_tree_get_lock(tree),
MTR_MEMO_X_LOCK));
ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
@@ -1786,8 +1794,8 @@ btr_cur_pessimistic_update(
new_entry = row_rec_to_index_entry(ROW_COPY_DATA, index, rec, heap);
- row_upd_index_replace_new_col_vals(new_entry, index, update, heap);
-
+ row_upd_index_replace_new_col_vals_index_pos(new_entry, index, update,
+ heap);
if (!(flags & BTR_KEEP_SYS_FLAG)) {
row_upd_index_entry_sys_field(new_entry, index, DATA_ROLL_PTR,
roll_ptr);