summaryrefslogtreecommitdiff
path: root/storage/innobase/include/btr0cur.h
diff options
context:
space:
mode:
authorSunny Bains <Sunny.Bains@Oracle.Com>2010-08-16 12:05:49 +1000
committerSunny Bains <Sunny.Bains@Oracle.Com>2010-08-16 12:05:49 +1000
commit3c4d4e0a25e608287eee7e8678f5111d8024e23c (patch)
tree5f3449d2d0e990d82565f52b11704975f777074b /storage/innobase/include/btr0cur.h
parentadde4bac9867c279a8974ef08ea42afd74e5e4f4 (diff)
downloadmariadb-git-3c4d4e0a25e608287eee7e8678f5111d8024e23c.tar.gz
Merge from -c3476 mysql-5.1-security.
------------------------------------------------------------ revno: 3476 committer: Sunny Bains <Sunny.Bains@Oracle.Com> branch nick: 5.1-security timestamp: Thu 2010-08-05 19:18:17 +1000 message: Fix bug# 55543 - InnoDB Plugin: Signal 6: Assertion failure in file fil/fil0fil.c line 4306 The bug is due to a double delete of a BLOB, once via: rollback -> btr_cur_pessimistic_delete() and the second time via purge. The bug is in row_upd_clust_rec_by_insert(). There we relinquish ownership of the non-updated BLOB columns in btr_cur_mark_extern_inherited_fields() before building the row entry that will be inserted and whose contents will be logged in the UNDO log. However, we don't set the BLOB column later to INHERITED so that a possible rollback will not free the original row's non-updated BLOB entries. This is because the condition that checks for that is in : if (node->upd_ext) {}. node->upd_ext is non-NULL only if a BLOB column was updated and that column is part of some key ordering (see row_upd_replace()). This results in the non-update BLOB columns being deleted during a rollback and subsequently by purge again. rb://413
Diffstat (limited to 'storage/innobase/include/btr0cur.h')
-rw-r--r--storage/innobase/include/btr0cur.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/storage/innobase/include/btr0cur.h b/storage/innobase/include/btr0cur.h
index 757477838ee..e38cb51a987 100644
--- a/storage/innobase/include/btr0cur.h
+++ b/storage/innobase/include/btr0cur.h
@@ -456,9 +456,10 @@ btr_estimate_number_of_different_key_vals(
Marks not updated extern fields as not-owned by this record. The ownership
is transferred to the updated record which is inserted elsewhere in the
index tree. In purge only the owner of externally stored field is allowed
-to free the field. */
+to free the field.
+@return TRUE if BLOB ownership was transferred */
UNIV_INTERN
-void
+ibool
btr_cur_mark_extern_inherited_fields(
/*=================================*/
page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed