summaryrefslogtreecommitdiff
path: root/storage/innobase/row/row0ins.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/row0ins.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/row0ins.c')
-rw-r--r--storage/innobase/row/row0ins.c61
1 files changed, 8 insertions, 53 deletions
diff --git a/storage/innobase/row/row0ins.c b/storage/innobase/row/row0ins.c
index 5f10a763fc4..2925feb2904 100644
--- a/storage/innobase/row/row0ins.c
+++ b/storage/innobase/row/row0ins.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
@@ -348,9 +348,9 @@ row_ins_clust_index_entry_by_modify(
return(DB_LOCK_TABLE_FULL);
}
- err = btr_cur_pessimistic_update(
- BTR_KEEP_POS_FLAG, cursor, heap, big_rec, update,
- 0, thr, mtr);
+ err = btr_cur_pessimistic_update(0, cursor,
+ heap, big_rec, update,
+ 0, thr, mtr);
}
return(err);
@@ -1976,7 +1976,6 @@ row_ins_index_entry_low(
ulint modify = 0; /* remove warning */
rec_t* insert_rec;
rec_t* rec;
- ulint* offsets;
ulint err;
ulint n_unique;
big_rec_t* big_rec = NULL;
@@ -2084,51 +2083,6 @@ row_ins_index_entry_low(
err = row_ins_clust_index_entry_by_modify(
mode, &cursor, &heap, &big_rec, entry,
thr, &mtr);
-
- if (big_rec) {
- 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 will write the redo log for
- the BLOB writes before writing the
- redo log for the record update. Thus,
- redo log application at crash recovery
- will see BLOBs being written to free pages. */
-
- btr_mark_freed_leaves(index, &mtr, TRUE);
-
- rec = btr_cur_get_rec(&cursor);
- offsets = rec_get_offsets(
- rec, index, NULL,
- ULINT_UNDEFINED, &heap);
-
- err = btr_store_big_rec_extern_fields(
- index, btr_cur_get_block(&cursor),
- rec, offsets, big_rec, &mtr,
- FALSE, &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);
- goto stored_big_rec;
- }
} else {
ut_ad(!n_ext);
err = row_ins_sec_index_entry_by_modify(
@@ -2157,6 +2111,8 @@ function_exit:
mtr_commit(&mtr);
if (UNIV_LIKELY_NULL(big_rec)) {
+ rec_t* rec;
+ ulint* offsets;
mtr_start(&mtr);
btr_cur_search_to_nth_level(index, 0, entry, PAGE_CUR_LE,
@@ -2168,9 +2124,8 @@ function_exit:
err = btr_store_big_rec_extern_fields(
index, btr_cur_get_block(&cursor),
- rec, offsets, big_rec, &mtr, FALSE, NULL);
+ rec, offsets, &mtr, FALSE, big_rec);
-stored_big_rec:
if (modify) {
dtuple_big_rec_free(big_rec);
} else {
@@ -2443,7 +2398,7 @@ row_ins(
node->index = dict_table_get_next_index(node->index);
node->entry = UT_LIST_GET_NEXT(tuple_list, node->entry);
- /* Skip corrupted secondary index and its entry */
+ /* Skip corrupted secondar index and its entry */
while (node->index && dict_index_is_corrupted(node->index)) {
node->index = dict_table_get_next_index(node->index);