3545 Marko Mäkelä 2010-08-18
Bug#55626: MIN and MAX reading a delete-marked record from secondary index
Remove a bogus debug assertion that triggered the bug.
Add assertions precisely where records must not be delete-marked.
And a comment to clarify when the record is allowed to be delete-marked.
modified:
storage/innodb_plugin/row/row0sel.c
3544 Vasil Dimov 2010-08-17 [merge]
Merge mysql-5.1-innodb from bk-internal into my local tree
modified:
storage/innobase/dict/dict0dict.c
storage/innobase/handler/ha_innodb.cc
storage/innobase/include/db0err.h
storage/innodb_plugin/ChangeLog
storage/innodb_plugin/btr/btr0sea.c
storage/innodb_plugin/ha/ha0ha.c
storage/innodb_plugin/handler/ha_innodb.cc
storage/innodb_plugin/include/btr0sea.h
storage/innodb_plugin/include/ha0ha.h
storage/innodb_plugin/include/ut0mem.h
storage/innodb_plugin/ut/ut0mem.c
=== modified file 'storage/innodb_plugin/row/row0sel.c'
--- a/storage/innodb_plugin/row/row0sel.c revid:vasil.dimov@stripped
+++ b/storage/innodb_plugin/row/row0sel.c revid:marko.makela@oracle.com-20100818110110-zfs0i1vfrccfb4yw
@@ -2690,7 +2690,6 @@ row_sel_store_mysql_rec(
ut_ad(prebuilt->mysql_template);
ut_ad(prebuilt->default_rec);
ut_ad(rec_offs_validate(rec, NULL, offsets));
- ut_ad(!rec_get_deleted_flag(rec, rec_offs_comp(offsets)));
if (UNIV_LIKELY_NULL(prebuilt->blob_heap)) {
mem_heap_free(prebuilt->blob_heap);
@@ -3611,6 +3610,7 @@ row_search_for_mysql(
row_sel_try_search_shortcut_for_mysql().
The latch will not be released until
mtr_commit(&mtr). */
+ ut_ad(!rec_get_deleted_flag(rec, comp));
if (!row_sel_store_mysql_rec(buf, prebuilt,
rec, offsets)) {
@@ -4238,7 +4238,7 @@ no_gap_lock:
rec = old_vers;
}
- } else if (!lock_sec_rec_cons_read_sees(rec, trx->read_view)) {
+ } else {
/* We are looking into a non-clustered index,
and to get the right version of the record we
have to look also into the clustered index: this
@@ -4246,8 +4246,12 @@ no_gap_lock:
information via the clustered index record. */
ut_ad(index != clust_index);
+ ut_ad(!dict_index_is_clust(index));
- goto requires_clust_rec;
+ if (!lock_sec_rec_cons_read_sees(
+ rec, trx->read_view)) {
+ goto requires_clust_rec;
+ }
}
}
@@ -4370,8 +4374,13 @@ requires_clust_rec:
ULINT_UNDEFINED, &heap);
result_rec = rec;
}
+
+ /* result_rec can legitimately be delete-marked
+ now that it has been established that it points to a
+ clustered index record that exists in the read view. */
} else {
result_rec = rec;
+ ut_ad(!rec_get_deleted_flag(rec, comp));
}
/* We found a qualifying record 'result_rec'. At this point,
Attachment: [text/bzr-bundle] bzr/marko.makela@oracle.com-20100818110110-zfs0i1vfrccfb4yw.bundle
| Thread |
|---|
| • bzr push into mysql-5.1-innodb branch (marko.makela:3544 to 3545) Bug#55626 | marko.makela | 18 Aug |