summaryrefslogtreecommitdiff
path: root/storage/innobase/row/row0upd.c
diff options
context:
space:
mode:
authorInaam Rana <inaam.rana@oracle.com>2011-09-30 07:02:19 -0400
committerInaam Rana <inaam.rana@oracle.com>2011-09-30 07:02:19 -0400
commitc95fdd936e73eb3bddad3fe02d087ccce67b00c9 (patch)
treed7e78f1f58f18ffbdf4b3095e47ff3db52ebe8ca /storage/innobase/row/row0upd.c
parent0e6afc7f6b1fef4e639f2012332c46301d3af1cb (diff)
downloadmariadb-git-c95fdd936e73eb3bddad3fe02d087ccce67b00c9.tar.gz
Revert original fix for Bug 12612184 and the follow up fix for
Bug 12704861. Bug 12704861 fix was revno: 3504.1.1 (rb://693) Bug 12612184 fix was revno: 3445.1.10 (rb://678)
Diffstat (limited to 'storage/innobase/row/row0upd.c')
-rw-r--r--storage/innobase/row/row0upd.c42
1 files changed, 12 insertions, 30 deletions
diff --git a/storage/innobase/row/row0upd.c b/storage/innobase/row/row0upd.c
index 2401fc88553..765233c8dab 100644
--- a/storage/innobase/row/row0upd.c
+++ b/storage/innobase/row/row0upd.c
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -1999,46 +1999,28 @@ row_upd_clust_rec(
ut_ad(!rec_get_deleted_flag(btr_pcur_get_rec(pcur),
dict_table_is_comp(index->table)));
- err = btr_cur_pessimistic_update(
- BTR_NO_LOCKING_FLAG | BTR_KEEP_POS_FLAG, btr_cur,
- &heap, &big_rec, node->update, node->cmpl_info, thr, mtr);
- if (big_rec) {
+ err = btr_cur_pessimistic_update(BTR_NO_LOCKING_FLAG, btr_cur,
+ &heap, &big_rec, node->update,
+ node->cmpl_info, thr, mtr);
+ mtr_commit(mtr);
+
+ if (err == DB_SUCCESS && big_rec) {
ulint offsets_[REC_OFFS_NORMAL_SIZE];
rec_t* rec;
rec_offs_init(offsets_);
- ut_a(err == DB_SUCCESS);
- /* Write out the externally stored columns, but
- allocate the pages and write the pointers using the
- mini-transaction of the record update. If any pages
- were freed in the update, temporarily mark them
- allocated so that off-page columns will not overwrite
- them. We must do this, because we write the redo log
- for the BLOB writes before writing the redo log for
- the record update. */
-
- btr_mark_freed_leaves(index, mtr, TRUE);
+ mtr_start(mtr);
+
+ ut_a(btr_pcur_restore_position(BTR_MODIFY_TREE, pcur, mtr));
rec = btr_cur_get_rec(btr_cur);
err = btr_store_big_rec_extern_fields(
index, btr_cur_get_block(btr_cur), rec,
rec_get_offsets(rec, index, offsets_,
ULINT_UNDEFINED, &heap),
- big_rec, mtr, TRUE, mtr);
- /* If writing big_rec fails (for example, because of
- DB_OUT_OF_FILE_SPACE), the record will be corrupted.
- Even if we did not update any externally stored
- columns, our update could cause the record to grow so
- that a non-updated column was selected for external
- storage. This non-update would not have been written
- to the undo log, and thus the record cannot be rolled
- back. */
- ut_a(err == DB_SUCCESS);
- /* Free the pages again in order to avoid a leak. */
- btr_mark_freed_leaves(index, mtr, FALSE);
+ mtr, TRUE, big_rec);
+ mtr_commit(mtr);
}
- mtr_commit(mtr);
-
if (UNIV_LIKELY_NULL(heap)) {
mem_heap_free(heap);
}