Bug #96125 Using index for skip scan, Mysql server core down
Submitted: 8 Jul 2019 14:02 Modified: 8 Jul 2019 15:25
Reporter: juncai meng Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: DML Severity:S6 (Debug Builds)
Version:8.0.16 OS:CentOS
Assigned to: CPU Architecture:Any

[8 Jul 2019 14:02] juncai meng
Description:
exec sql statement: select count(*) from STRG_PARTRANGE_TBL_001 where c_id<=600 
mysql server core down:

#8  0x000000000314c2a9 in key_rec_cmp (key=0x7f70fcf90380, first_rec=0x7f70fcfff5c2 "", second_rec=0x7f70fd0009ff "")
    at /data/taurus/mysql-8.0.16/sql/key.cc:594
#9  0x0000000002b40b6b in Key_rec_less::operator() (this=0x7f70fcf619e0, first=0x7f70fcfff5c0 "", second=0x7f70fd0009fd "\001")
    at /data/taurus/mysql-8.0.16/sql/partitioning/partition_handler.h:363
#10 0x0000000002b434d8 in Priority_queue<unsigned char*, std::vector<unsigned char*, std::allocator<unsigned char*> >, Key_rec_less>::heapify (
    this=0x7f70fcf619e0, i=0, last=3) at /data/taurus/mysql-8.0.16/include/priority_queue.h:133
#11 0x0000000002b429c6 in Priority_queue<unsigned char*, std::vector<unsigned char*, std::allocator<unsigned char*> >, Key_rec_less>::heapify (
    this=0x7f70fcf619e0, i=0) at /data/taurus/mysql-8.0.16/include/priority_queue.h:147
#12 0x0000000002b4278b in Priority_queue<unsigned char*, std::vector<unsigned char*, std::allocator<unsigned char*> >, Key_rec_less>::build_heap (
    this=0x7f70fcf619e0) at /data/taurus/mysql-8.0.16/include/priority_queue.h:199
#13 0x0000000002b419b1 in Priority_queue<unsigned char*, std::vector<unsigned char*, std::allocator<unsigned char*> >, Key_rec_less>::assign (
    this=0x7f70fcf619e0, container=...) at /data/taurus/mysql-8.0.16/include/priority_queue.h:187
#14 0x0000000002b3f4c0 in Partition_helper::handle_ordered_index_scan (this=0x7f70fcf902e8, buf=0x7f70fcff0778 "")
    at /data/taurus/mysql-8.0.16/sql/partitioning/partition_handler.cc:2638
#15 0x0000000002b3dc4f in Partition_helper::common_index_read (this=0x7f70fcf902e8, buf=0x7f70fcff0778 "", have_start_key=true)
    at /data/taurus/mysql-8.0.16/sql/partitioning/partition_handler.cc:1972
#16 0x0000000002b3e498 in Partition_helper::ph_read_range_first (this=0x7f70fcf902e8, start_key=0x7f70fcf535d0, end_key=0x7f70fcf535f0, eq_range_arg=false, 
    sorted=true) at /data/taurus/mysql-8.0.16/sql/partitioning/partition_handler.cc:2265
#17 0x0000000004318df3 in ha_innopart::read_range_first (this=0x7f70fcf8ec58, start_key=0x7f70fcf535d0, end_key=0x7f70fcf535f0, eq_range_arg=false, 
    sorted=true) at /data/taurus/mysql-8.0.16/storage/innobase/handler/ha_innopart.h:523
#18 0x0000000002fb68bf in handler::ha_read_range_first (this=0x7f70fcf8ec58, start_key=0x7f70fcf535d0, end_key=0x7f70fcf535f0, eq_range=false, sorted=true)
    at /data/taurus/mysql-8.0.16/sql/handler.cc:7088
#19 0x0000000002b250f7 in QUICK_SKIP_SCAN_SELECT::get_next (this=0x7f70fcf534d0) at /data/taurus/mysql-8.0.16/sql/opt_range.cc:14771
#20 0x0000000002b5972f in IndexRangeScanIterator::Read (this=0x7f70fcfee4d0) at /data/taurus/mysql-8.0.16/sql/records.cc:349
#21 0x0000000002f3c855 in FilterIterator::Read (this=0x7f70fcfeeab0) at /data/taurus/mysql-8.0.16/sql/composite_iterators.cc:70
#22 0x0000000002f3cebf in AggregateIterator::Read (this=0x7f70fcfeead8) at /data/taurus/mysql-8.0.16/sql/composite_iterators.cc:182
#23 0x0000000002bfbe60 in ExecuteIteratorQuery (join=0x7f70fcfedac8) at /data/taurus/mysql-8.0.16/sql/sql_executor.cc:1930
#24 0x0000000002bfc0cb in do_select (join=0x7f70fcfedac8) at /data/taurus/mysql-8.0.16/sql/sql_executor.cc:1986
#25 0x0000000002bf5d60 in JOIN::exec (this=0x7f70fcfedac8) at /data/taurus/mysql-8.0.16/sql/sql_executor.cc:313
#26 0x0000000002cc6b4e in Sql_cmd_dml::execute_inner (this=0x7f70fcfed990, thd=0x7f70fcdaf580) at /data/taurus/mysql-8.0.16/sql/sql_select.cc:903
#27 0x0000000002cc61d4 in Sql_cmd_dml::execute (this=0x7f70fcfed990, thd=0x7f70fcdaf580) at /data/taurus/mysql-8.0.16/sql/sql_select.cc:699
#28 0x0000000002c658c4 in mysql_execute_command (thd=0x7f70fcdaf580, first_level=true) at /data/taurus/mysql-8.0.16/sql/sql_parse.cc:4400
#29 0x0000000002c680f5 in mysql_parse (thd=0x7f70fcdaf580, parser_state=0x7f71a8141c20) at /data/taurus/mysql-8.0.16/sql/sql_parse.cc:5194

How to repeat:
exec sqls follow:

DELIMITER $$

CREATE PROCEDURE test()
begin
declare num_temp int;
set num_temp=0;

while num_temp<2000 do
INSERT INTO STRG_PARTRANGE_TBL_001 VALUES (
num_temp+1,
num_temp+1,
234213542352134,
100.2,
123523.2132,
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'q2',
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'dfecddfecddfecddfecd',
'dfecddfecddfecddfecd',
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'sw',
'ewfxejdsk',
'wedjkswikilsdcnr',
curtime(),
'21',
12342124.23,
0.2,
2323423.56,
2342324.3454,
1200234.235,
true,
now(),
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds'
);
set num_temp=num_temp+1;
end while;
end;
$$

DELIMITER ;

create table STRG_PARTRANGE_TBL_001(
c_id INT,
C_D_ID INTEGER NOT NULL,
C_W_ID BIGINT NOT NULL,
C_DOUBLE DOUBLE NOT NULL,
C_DECIMAL DECIMAL NOT NULL,
C_FIRST VARCHAR(64) NOT NULL,
C_MIDDLE CHAR(2),
C_LAST VARCHAR(64) NOT NULL,
C_STREET_1 VARCHAR(20) NOT NULL,
C_STREET_2 VARCHAR(20),
C_CITY VARCHAR(64) NOT NULL,
C_STATE CHAR(2) NOT NULL,
C_ZIP CHAR(9) NOT NULL,
C_PHONE CHAR(16) NOT NULL,
C_SINCE TIMESTAMP,
C_CREDIT CHAR(2) NOT NULL,
C_CREDIT_LIM NUMERIC(12,2),
C_DISCOUNT NUMERIC(4,4),
C_BALANCE NUMERIC(12,2),
C_YTD_PAYMENT REAL NOT NULL,
C_PAYMENT_CNT FLOAT NOT NULL,
C_DELIVERY_CNT BOOLEAN NOT NULL,
C_END DATE NOT NULL,
C_VCHAR VARCHAR(1000),
C_DATA TEXT,
C_TEXT BLOB,
C_TINYTEXT TINYTEXT,
C_MEDIUMBLOB MEDIUMBLOB,
C_LONGBLOB LONGBLOB,
primary key (C_ID))
partition by range(c_id)
(
partition part_1 values less than (201),
partition part_2 values less than (401),
partition part_3 values less than (601),
partition part_4 values less than (801),
partition part_5 values less than (1001),
partition part_6 values less than (1201),
partition part_7 values less than (1401),
partition part_8 values less than (1601),
partition part_9 values less than (1801),
partition part_10 values less than (2001),
partition part_11 values less than (maxvalue)
);

call test();

CREATE UNIQUE INDEX STRG_RANGE_INDEX_001_1 ON STRG_PARTRANGE_TBL_001(c_id);
CREATE INDEX STRG_RANGE_INDEX_001_3 ON STRG_PARTRANGE_TBL_001(C_FIRST);

delete from STRG_PARTRANGE_TBL_001 WHERE (c_id - 2*(floor(c_id/2)))=0;

explain select count(*) from STRG_PARTRANGE_TBL_001 where c_id<=600;

select count(*) from STRG_PARTRANGE_TBL_001 where c_id<=600;

Suggested fix:
skip_scan problem.

this problem is always appear
[8 Jul 2019 15:25] MySQL Verification Team
Release built version aren't affected, will test debug binary:

mysql> create database c;
Query OK, 1 row affected (0.02 sec)

mysql> use c
Database changed
mysql> DELIMITER $$
mysql>
mysql> CREATE PROCEDURE test()
    -> begin
    -> declare num_temp int;
    -> set num_temp=0;
    ->
    -> while num_temp<2000 do
    -> INSERT INTO STRG_PARTRANGE_TBL_001 VALUES (
    -> num_temp+1,
    -> num_temp+1,
    -> 234213542352134,
    -> 100.2,
    -> 123523.2132,
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'q2',
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'dfecddfecddfecddfecd',
    -> 'dfecddfecddfecddfecd',
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'sw',
    -> 'ewfxejdsk',
    -> 'wedjkswikilsdcnr',
    -> curtime(),
    -> '21',
    -> 12342124.23,
    -> 0.2,
    -> 2323423.56,
    -> 2342324.3454,
    -> 1200234.235,
    -> true,
    -> now(),
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds',
    -> 'wevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbdswevfwbds'
    -> );
    -> set num_temp=num_temp+1;
    -> end while;
    -> end;
    -> $$
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> DELIMITER ;
mysql>
mysql> create table STRG_PARTRANGE_TBL_001(
    -> c_id INT,
    -> C_D_ID INTEGER NOT NULL,
    -> C_W_ID BIGINT NOT NULL,
    -> C_DOUBLE DOUBLE NOT NULL,
    -> C_DECIMAL DECIMAL NOT NULL,
    -> C_FIRST VARCHAR(64) NOT NULL,
    -> C_MIDDLE CHAR(2),
    -> C_LAST VARCHAR(64) NOT NULL,
    -> C_STREET_1 VARCHAR(20) NOT NULL,
    -> C_STREET_2 VARCHAR(20),
    -> C_CITY VARCHAR(64) NOT NULL,
    -> C_STATE CHAR(2) NOT NULL,
    -> C_ZIP CHAR(9) NOT NULL,
    -> C_PHONE CHAR(16) NOT NULL,
    -> C_SINCE TIMESTAMP,
    -> C_CREDIT CHAR(2) NOT NULL,
    -> C_CREDIT_LIM NUMERIC(12,2),
    -> C_DISCOUNT NUMERIC(4,4),
    -> C_BALANCE NUMERIC(12,2),
    -> C_YTD_PAYMENT REAL NOT NULL,
    -> C_PAYMENT_CNT FLOAT NOT NULL,
    -> C_DELIVERY_CNT BOOLEAN NOT NULL,
    -> C_END DATE NOT NULL,
    -> C_VCHAR VARCHAR(1000),
    -> C_DATA TEXT,
    -> C_TEXT BLOB,
    -> C_TINYTEXT TINYTEXT,
    -> C_MEDIUMBLOB MEDIUMBLOB,
    -> C_LONGBLOB LONGBLOB,
    -> primary key (C_ID))
    -> partition by range(c_id)
    -> (
    -> partition part_1 values less than (201),
    -> partition part_2 values less than (401),
    -> partition part_3 values less than (601),
    -> partition part_4 values less than (801),
    -> partition part_5 values less than (1001),
    -> partition part_6 values less than (1201),
    -> partition part_7 values less than (1401),
    -> partition part_8 values less than (1601),
    -> partition part_9 values less than (1801),
    -> partition part_10 values less than (2001),
    -> partition part_11 values less than (maxvalue)
    -> );
Query OK, 0 rows affected (0.21 sec)

mysql>
mysql> call test();
Query OK, 1 row affected (6.05 sec)

mysql> CREATE UNIQUE INDEX STRG_RANGE_INDEX_001_1 ON STRG_PARTRANGE_TBL_001(c_id);
Query OK, 0 rows affected (0.38 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE INDEX STRG_RANGE_INDEX_001_3 ON STRG_PARTRANGE_TBL_001(C_FIRST);
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql> delete from STRG_PARTRANGE_TBL_001 WHERE (c_id - 2*(floor(c_id/2)))=0;
Query OK, 1000 rows affected (0.04 sec)

mysql>
mysql> explain select count(*) from STRG_PARTRANGE_TBL_001 where c_id<=600;
+----+-------------+------------------------+----------------------+-------+-------------------------------------------------------+---------+---------+------+------+----------+--------------------------+
| id | select_type | table                  | partitions           | type  | possible_keys                                         | key     | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+------------------------+----------------------+-------+-------------------------------------------------------+---------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | STRG_PARTRANGE_TBL_001 | part_1,part_2,part_3 | range | PRIMARY,STRG_RANGE_INDEX_001_1,STRG_RANGE_INDEX_001_3 | PRIMARY | 4       | NULL |  150 |   100.00 | Using where; Using index |
+----+-------------+------------------------+----------------------+-------+-------------------------------------------------------+---------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

mysql>
mysql> select count(*) from STRG_PARTRANGE_TBL_001 where c_id<=600;
+----------+
| count(*) |
+----------+
|      300 |
+----------+
1 row in set (0.00 sec)

mysql> show variables like "%version%";
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| immediate_server_version | 999999                       |
| innodb_version           | 8.0.16                       |
| original_server_version  | 999999                       |
| protocol_version         | 10                           |
| slave_type_conversions   |                              |
| tls_version              | TLSv1,TLSv1.1,TLSv1.2        |
| version                  | 8.0.16                       |
| version_comment          | MySQL Community Server - GPL |
| version_compile_machine  | x86_64                       |
| version_compile_os       | Win64                        |
| version_compile_zlib     | 1.2.11                       |
+--------------------------+------------------------------+
11 rows in set (0.00 sec)

mysql>
[8 Jul 2019 15:27] MySQL Verification Team
Thank you for the bug report, debug built affected:

d:\dbs>d:\dbs\8.0\bin\mysqld --defaults-file=d:\dbs\my80.ini --standalone --console
2019-07-08T15:19:35.733643Z 0 [System] [MY-010116] [Server] d:\dbs\8.0\bin\mysqld (mysqld 8.0.18-debug) starting as process 10888
2019-07-08T15:19:43.465967Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2019-07-08T15:19:43.886116Z 0 [System] [MY-010931] [Server] d:\dbs\8.0\bin\mysqld: ready for connections. Version: '8.0.18-debug'  socket: ''  port: 3580  Source distribution BUILT: 2019-JUL-05.
2019-07-08T15:19:44.097745Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060
Assertion failed: bitmap_is_set(key_info->table->read_set, key_info->key_part->field->field_index), file D:\build\2019JUL05\mysql-8.0\sql\key.cc, line 593
abort() has been called15:19:58 UTC - mysqld got exception 0x80000003 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x1ff22283050
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
7ff7d639bc85    mysqld.exe!my_sigabrt_handler()[my_thr_init.cc:372]
7ffd3b75c3e1    ucrtbased.dll!raise()
7ffd3b75e039    ucrtbased.dll!abort()
7ffd3b763c65    ucrtbased.dll!_get_wide_winmain_command_line()
7ffd3b7637d7    ucrtbased.dll!_get_wide_winmain_command_line()
7ffd3b761868    ucrtbased.dll!_get_wide_winmain_command_line()
7ffd3b7641cf    ucrtbased.dll!_wassert()
7ff7d46a11fa    mysqld.exe!key_rec_cmp()[key.cc:592]
7ff7d4306774    mysqld.exe!Key_rec_less::operator()()[partition_handler.h:371]
7ff7d4309e61    mysqld.exe!Priority_queue<unsigned char *,std::vector<unsigned char *,std::allocator<unsigned char *> >,Key_rec_less>::heapify()[priority_queue.h:133]
7ff7d430971a    mysqld.exe!Priority_queue<unsigned char *,std::vector<unsigned char *,std::allocator<unsigned char *> >,Key_rec_less>::build_heap()[priority_queue.h:201]
7ff7d4309138    mysqld.exe!Priority_queue<unsigned char *,std::vector<unsigned char *,std::allocator<unsigned char *> >,Key_rec_less>::assign()[priority_queue.h:188]
7ff7d430160e    mysqld.exe!Partition_helper::handle_ordered_index_scan()[partition_handler.cc:2633]
7ff7d4302f02    mysqld.exe!Partition_helper::common_index_read()[partition_handler.cc:1966]
7ff7d42fc895    mysqld.exe!Partition_helper::ph_read_range_first()[partition_handler.cc:2259]
7ff7d6a6f119    mysqld.exe!ha_innopart::read_range_first()[ha_innopart.h:485]
7ff7d40d104a    mysqld.exe!handler::ha_read_range_first()[handler.cc:7161]
7ff7d42c580a    mysqld.exe!QUICK_SKIP_SCAN_SELECT::get_next()[opt_range.cc:14865]
7ff7d46a5e16    mysqld.exe!IndexRangeScanIterator::Read()[records.cc:353]
7ff7d4aff72f    mysqld.exe!FilterIterator::Read()[composite_iterators.cc:77]
7ff7d4b00614    mysqld.exe!AggregateIterator::Read()[composite_iterators.cc:271]
7ff7d46f1835    mysqld.exe!SELECT_LEX_UNIT::ExecuteIteratorQuery()[sql_union.cc:1499]
7ff7d46f2214    mysqld.exe!SELECT_LEX_UNIT::execute()[sql_union.cc:1571]
7ff7d472c323    mysqld.exe!Sql_cmd_dml::execute_inner()[sql_select.cc:898]
7ff7d472bbe0    mysqld.exe!Sql_cmd_dml::execute()[sql_select.cc:703]
7ff7d43e07d1    mysqld.exe!mysql_execute_command()[sql_parse.cc:4437]
7ff7d43d9520    mysqld.exe!mysql_parse()[sql_parse.cc:5241]
7ff7d43e4149    mysqld.exe!dispatch_command()[sql_parse.cc:1760]
7ff7d43e1f79    mysqld.exe!do_command()[sql_parse.cc:1272]
7ff7d3f739da    mysqld.exe!handle_connection()[connection_handler_per_thread.cc:302]
7ff7d6d84685    mysqld.exe!pfs_spawn_thread()[pfs.cc:2856]
7ff7d639a7f7    mysqld.exe!win_thread_start()[my_thread.cc:52]
7ffd3b76542c    ucrtbased.dll!_register_onexit_function()
7ffd96a27bd4    KERNEL32.DLL!BaseThreadInitThunk()
7ffd9864ce71    ntdll.dll!RtlUserThreadStart()

Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (1ff224678d0): select count(*) from STRG_PARTRANGE_TBL_001 where c_id<=600
Connection ID (thread ID): 8
Status: NOT_KILLED