mariadb/storage
Vasil Dimov 43ea968d45 Fix Bug#13510739 63775: SERVER CRASH ON HANDLER READ NEXT AFTER DELETE RECORD.
CREATE TABLE bug13510739 (c INTEGER NOT NULL, PRIMARY KEY (c)) ENGINE=INNODB;
INSERT INTO bug13510739 VALUES (1), (2), (3), (4);
DELETE FROM bug13510739 WHERE c=2;
HANDLER bug13510739 OPEN;
HANDLER bug13510739 READ `primary` = (2);
HANDLER bug13510739 READ `primary` NEXT;  <-- crash

The bug is that in the particular testcase row_search_for_mysql() picked up
a delete-marked record and quit, leaving the cursor non-positioned state and
on the subsequent 'get next' call the code crashed because of the
non-positioned cursor.

In row0sel.cc (line numbers from mysql-trunk):

4653         if (rec_get_deleted_flag(rec, comp)) {
...
4679                 if (index == clust_index && unique_search) {
4680 
4681                         err = DB_RECORD_NOT_FOUND;
4682                         
4683                         goto normal_return;
4684                 }       

it quit from here, not storing the cursor position.

In contrast, if the record=2 is not found at all (e.g. sleep(1) after DELETE
to let the purge wipe it away completely) then 'get = 2' does find record=3
and quits from here:

4366                 if (0 != cmp_dtuple_rec(search_tuple, rec, offsets)) {
...
4394                         btr_pcur_store_position(pcur, &mtr);
4395 
4396                         err = DB_RECORD_NOT_FOUND;
4397 #if 0
4398                         ut_print_name(stderr, trx, FALSE, index->name);
4399                         fputs(" record not found 3\n", stderr);
4400 #endif
4401 
4402                         goto normal_return;

Another fix could be to extend the condition on line 4366 to hold only if
seach_tuple matches rec AND if rec is not delete marked.

Notice that in the above test case if we wait about 1 second somewhere after
DELETE and before 'get = 2', then the testcase does not crash and returns 4
instead. Not sure if this is the correct behavior, but this bugfix removes
the crash and makes the code return what it also returns in the non-crashing
case (if rec=2 is not found during 'get = 2', e.g. we have sleep(1) there).

Approved by:	Marko (http://bur03.no.oracle.com/rb/r/863/)
2011-12-22 12:55:44 +02:00
..
archive BUG#11751793 - 42784: ARCHIVE TABLES CAUSE 100% CPU USAGE 2011-11-23 18:33:29 +05:30
blackhole Updated/added copyright headers 2011-06-30 17:37:13 +02:00
csv Updated/added copyright headers 2011-06-30 17:37:13 +02:00
example Updated/added copyright headers 2011-06-30 17:37:13 +02:00
federated Bug #11750417 40942: UNABLE TO INSTALL FEDERATED PLUGIN 2011-09-05 14:38:20 +02:00
heap BUG#11759349 - 51655: CREATE TABLE IN MEMORY ENGINE DOESN'T STORE 2011-09-27 17:38:51 +05:30
innobase Fix Bug#13510739 63775: SERVER CRASH ON HANDLER READ NEXT AFTER DELETE RECORD. 2011-12-22 12:55:44 +02:00
innodb_plugin Fix Bug#13510739 63775: SERVER CRASH ON HANDLER READ NEXT AFTER DELETE RECORD. 2011-12-22 12:55:44 +02:00
myisam merge 2011-12-14 14:41:40 +01:00
myisammrg Updated/added copyright headers 2011-07-03 17:47:37 +02:00
ndb Merge from mysql-5.1.58-release 2011-07-06 00:56:51 +02:00
Makefile.am Updated/added copyright headers 2011-06-30 17:37:13 +02:00
mysql_storage_engine.cmake Updated/added copyright headers 2011-06-30 17:37:13 +02:00