List:Commits« Previous MessageNext Message »
From:marko.makela Date:August 18 2010 11:01am
Subject:bzr commit into mysql-5.1-innodb branch (marko.makela:3545) Bug#55626
View as plain text  
#At file:///home/marko/innobase/dev/mysql2a/5.1-innodb/ based on revid:vasil.dimov@strippedz2odikxauf8

 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
=== 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 commit into mysql-5.1-innodb branch (marko.makela:3545) Bug#55626marko.makela18 Aug