| Bug #55472 | Assertion failed in heap_rfirst function of hp_rfirst.c on DELETE statement | ||
|---|---|---|---|
| Submitted: | 22 Jul 2010 8:04 | Modified: | 12 Aug 2010 19:29 |
| Reporter: | John Embretsen | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: General | Severity: | S1 (Critical) |
| Version: | 5.5.6-m3-Celosia | OS: | Any |
| Assigned to: | Gleb Shchepa | CPU Architecture: | Any |
[22 Jul 2010 8:58]
Sveta Smirnova
Thank you for the report. Verified as described with mysql-trunk-bugfixing
[22 Jul 2010 12:25]
John Embretsen
For the record: Unable to repeat issue (different crash) with non-debug builds (as mentioned above) at this time.
[28 Jul 2010 17:47]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/114554 3156 Gleb Shchepa 2010-07-28 Bug #55472: Assertion failed in heap_rfirst function of hp_rfirst.c on DELETE statement Single-table delete ordered by a field that has a hash-type index may cause an assertion failure or a crash. An optimization added by the fix for the bug 36569 forced the optimizer to use ORDER BY-compatible indices when applicable. However, the existence of unsorted indices (HASH index algorithm for some engines such as HEAP, MEMORY, NDB) was ignored. The test_if_order_by_key function has been modified to skip unsorted indices. @ mysql-test/r/heap_hash.result Test case for bug #55472. @ mysql-test/t/heap_hash.test Test case for bug #55472. @ sql/sql_select.cc Bug #55472: Assertion failed in heap_rfirst function of hp_rfirst.c on DELETE statement The test_if_order_by_key function has been modified to skip unsorted indices.
[29 Jul 2010 7:17]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/114588 3158 Gleb Shchepa 2010-07-29 Bug #55472: Assertion failed in heap_rfirst function of hp_rfirst.c on DELETE statement Single-table delete ordered by a field that has a hash-type index may cause an assertion failure or a crash. An optimization added by the fix for the bug 36569 forced the optimizer to use ORDER BY-compatible indices when applicable. However, the existence of unsorted indices (HASH index algorithm for some engines such as MEMORY/HEAP, NDB) was ignored. The test_if_order_by_key function has been modified to skip unsorted indices. @ mysql-test/r/heap_hash.result Test case for bug #55472. @ mysql-test/t/heap_hash.test Test case for bug #55472. @ sql/sql_select.cc Bug #55472: Assertion failed in heap_rfirst function of hp_rfirst.c on DELETE statement The test_if_order_by_key function has been modified to skip unsorted indices.
[4 Aug 2010 7:50]
Bugs System
Pushed into mysql-trunk 5.5.6-m3 (revid:alik@sun.com-20100731131027-1n61gseejyxsqk5d) (version source revid:marko.makela@oracle.com-20100621094008-o9fa153s3f09merw) (merge vers: 5.1.49) (pib:18)
[4 Aug 2010 8:09]
Bugs System
Pushed into mysql-trunk 5.6.1-m4 (revid:alik@ibmvm-20100804080001-bny5271e65xo34ig) (version source revid:marko.makela@oracle.com-20100621094008-o9fa153s3f09merw) (merge vers: 5.1.49) (pib:18)
[4 Aug 2010 8:25]
Bugs System
Pushed into mysql-trunk 5.6.1-m4 (revid:alik@ibmvm-20100804081533-c1d3rbipo9e8rt1s) (version source revid:marko.makela@oracle.com-20100621094008-o9fa153s3f09merw) (merge vers: 5.1.49) (pib:18)
[4 Aug 2010 9:04]
Bugs System
Pushed into mysql-next-mr (revid:alik@ibmvm-20100804081630-ntapn8bf9pko9vj3) (version source revid:marko.makela@oracle.com-20100621094008-o9fa153s3f09merw) (pib:20)
[12 Aug 2010 19:29]
Paul DuBois
Noted in 5.5.6 changelog. A single-table DELETE ordered by a column that had a hash-type index could raise an assertion or cause a server crash.

Description: When executing a single-threaded Random Query Generator test using partitioning against a debug build of MySQL Server, the server asserts with the following message: Assertion failed: 0, file /export/home/tmp/je159969/mysql-dev/bzr-repos/mysql-trunk-bugfixing/storage/heap/hp_rfirst.c, line 65 100722 9:47:04 - mysqld got signal 6 ; Stack trace: [12] _assert(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7fff1fdc95 [13] heap_rfirst(info = 0x380c500, record = 0x233bfc2 "3^B", inx = 0), line 65 in "hp_rfirst.c" [14] ha_heap::index_first(this = 0x38ca580, buf = 0x233bfc2 "3^B"), line 353 in "ha_heap.cc" [15] ha_partition::handle_ordered_index_scan(this = 0x38ca190, buf = 0x38ca4b8 "ÿ", reverse_order = false), line 4873 in "ha_partition.cc" [16] ha_partition::common_first_last(this = 0x38ca190, buf = 0x38ca4b8 "ÿ"), line 4336 in "ha_partition.cc" [17] ha_partition::index_first(this = 0x38ca190, buf = 0x38ca4b8 "ÿ"), line 4285 in "ha_partition.cc" [18] rr_index_first(info = 0xfffffd7fff039390), line 362 in "records.cc" [19] mysql_delete(thd = 0x37675d0, table_list = 0x37727c0, conds = 0x3772e78, order_list = 0x37695f0, limit = 1ULL, options = 0), line 297 in "sql_delete.cc" [20] mysql_execute_command(thd = 0x37675d0), line 3355 in "sql_parse.cc" [21] mysql_parse(thd = 0x37675d0, inBuf = 0x3772660 "DELETE FROM v WHERE `col_int_nokey` = 6 ORDER BY `col_int_key` , `col_int_nokey` LIMIT 1", length = 88U, parser_state = 0xfffffd7fff03cab8), line 5901 in "sql_parse.cc" [22] dispatch_command(command = COM_QUERY, thd = 0x37675d0, packet = 0x376e631 "DELETE FROM v WHERE `col_int_nokey` = 6 ORDER BY `col_int_key` , `col_int_nokey` LIMIT 1", packet_length = 88U), line 1135 in "sql_parse.cc" [23] do_command(thd = 0x37675d0), line 807 in "sql_parse.cc" [24] do_handle_one_connection(thd_arg = 0x37675d0), line 1191 in "sql_connect.cc" [25] handle_one_connection(arg = 0x37675d0), line 1130 in "sql_connect.cc" [26] _thrp_setup(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7fff27acf5 [27] _lwp_start(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7fff27afb0 Related code (in storage/heap/hp_rfirst.c) is: if (!(info->s->records)) { my_errno=HA_ERR_END_OF_FILE; DBUG_RETURN(my_errno); } DBUG_ASSERT(0); /* TODO fix it */ info->current_record=0; info->current_hash_ptr=0; info->update=HA_STATE_PREV_FOUND; DBUG_RETURN(heap_rnext(info,record)); Note the "TODO fix it" comment at the line of the assertion that was hit. Also note that the test fails differently with a non-debug build. Observed against mysql-trunk-bugfixing as of 2010-07-20 (revid jonathan.perkin@oracle.com-20100720093555-gqyrtmkgwrjfgsmc). How to repeat: Obtain a debug build of MySQL Server, using a recent development version (trunk or next-mr). This is referred to as $CODE below. Obtain the RQG: bzr branch lp:randgen cd randgen Run the test: perl ./runall-new.pl \ --threads=1 \ --grammar=conf/partitioning/partitions-ddl.yy \ --queries=100000 \ --duration=600 \ --basedir=$CODE \ --Reporter=Backtrace (Note that using runall-new.pl instead of runall.pl is required at this time due to Bug#54835. Alternatively, the suggested patch for that bug can be applied to allow use of runall.pl.) Note that the test fails like this with a debug build only. With a non-debug build the test triggers a different crash (although it may be related). Not repeatable against mysql-5.1-bugteam.