Bug #107681 Assertion `!thd->is_error()' failed in MySQL 8.0.29
Submitted: 28 Jun 2022 8:50 Modified: 16 Aug 2022 23:44
Reporter: Wang Ke Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Optimizer Severity:S6 (Debug Builds)
Version:8.0.29 OS:Any
Assigned to: CPU Architecture:Any
Tags: assertion failure

[28 Jun 2022 8:50] Wang Ke
Description:
An assertion failed in mysql-8.0.29-debug-asan:

```
2022-06-28T08:37:12.304506Z 0 [System] [MY-010931] [Server] /home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld: ready for connections. Version: '8.0.29-debug-asan'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution.
mysqld: /home/mysql-server/mysql-8.0.29-origin/sql/sql_executor.cc:3335: int join_read_const_table(JOIN_TAB *, POSITION *): Assertion `!thd->is_error()' failed.
08:37:49 UTC - mysqld got signal 6 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x62700028e900
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...
stack_bottom = 7fc6d5918b20 thread_stack 0x100000
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(__interceptor_backtrace+0x5b) [0x5e4e34b]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0x10d) [0xb6ab1cd]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(print_fatal_signal(int)+0x389) [0x8149469]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(handle_fatal_signal+0x175) [0x8149ab5]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x11390) [0x7fc706b39390]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38) [0x7fc70502d438]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x16a) [0x7fc70502f03a]
/lib/x86_64-linux-gnu/libc.so.6(+0x2dbe7) [0x7fc705025be7]
/lib/x86_64-linux-gnu/libc.so.6(+0x2dc92) [0x7fc705025c92]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(join_read_const_table(JOIN_TAB*, POSITION*)+0x15f2) [0x76104c2]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(JOIN::extract_func_dependent_tables()+0x1792) [0x777fbc2]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(JOIN::make_join_plan()+0x994) [0x773dc14]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(JOIN::optimize(bool)+0x47b1) [0x772e281]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(Query_block::optimize(THD*, bool)+0x330) [0x7b71280]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(Query_expression::optimize(THD*, TABLE*, bool, bool)+0x404) [0x7e176c4]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(Sql_cmd_dml::execute_inner(THD*)+0x9a) [0x7b66eba]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(Sql_cmd_dml::execute(THD*)+0xe1d) [0x7b6423d]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(mysql_execute_command(THD*, bool)+0x3583) [0x794fbc3]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(dispatch_sql_command(THD*, Parser_state*)+0x1b5d) [0x7945c8d]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(dispatch_command(THD*, COM_DATA const*, enum_server_command)+0x756f) [0x793a43f]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld(do_command(THD*)+0xf9c) [0x794149c]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld() [0x80d00a2]
/home/mysql-server/mysql-8.0.29-origin-dev/bin/mysqld() [0xd6ac2da]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7fc706b2f6ba]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fc7050ff51d]

Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (61a0002b4ab0): SELECT ra8 . k , ra8 . k , ra6 . k , ra4 . k , ra5 . k , ra2 . k , ra8 . k , ra4 . k , ra1 . k , MATCH ra5 . k AGAINST ( 'x' 'x' IN BOOLEAN MODE ) ca0 , ra5 . k , ra7 . k , ra5 . k , ra7 . k , ra6 . k , ra8 . k , ra5 . k , ra7 . k , ra6 . k , ra8 . k FROM t2 ra7 CROSS JOIN t1 ra6 LEFT OUTER JOIN ( t2 ra1 LEFT JOIN t2 ra2 ON ra2 . k = 1 AND CAST( SHA( ra2 . k >> 'fixme' ) AS JSON ) = ra2 . k CROSS JOIN t1 ra5 LEFT JOIN ( t2 ra3 LEFT JOIN t1 ra4 ON ra3 . k = ra3 . k AND ra4 . k < - 16 ) ON ra3 . k >= - 2147483648 AND ra3 . k = ra3 . k ) ON ( CAST( 'fixme' AS CHAR ) = - - 1 OR ra4 . k IS NULL ) AND ( ra5 . k = - - 1 OR ra4 . k IS NULL ) AND ( ra3 . k = ra1 . k OR ra6 . k IS NULL OR ra3 . k IS NULL OR ra6 . k IS NULL ) AND ( ra1 . k <> 'fixme' ) CROSS JOIN t2 ra8 WHERE ra5 . k = - 1 AND ra3 . k < ra6 . k = ra6 . k AND ( ra2 . k >= - 16 OR ra7 . k IS NULL ) AND ( ra4 . k < - 1 OR ra4 . k IS NULL ) AND ( ra1 . k = ra6 . k OR ra5 . k IS NULL OR ra7 . k IS NULL ) AND ( ra5 . k >= - - 16 OR ra8 . k IS NULL ) AND ( ra7
Connection ID (thread ID): 8
Status: NOT_KILLED

The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
```

Observed that release build not affected.

How to repeat:
Test case:

```
CREATE TABLE t1 ( k INT , KEY ( k ) ) ENGINE = MyISAM ;
INSERT INTO t1 VALUES ( 1 ) ;
CREATE TABLE t2 ( k INT , KEY ( k ) ) ENGINE = MyISAM ;
INSERT INTO t2 VALUES ( 1 ) ;
SELECT ra8 . k , ra8 . k , ra6 . k , ra4 . k , ra5 . k , ra2 . k , ra8 . k , ra4 . k , ra1 . k , MATCH ra5 . k AGAINST ( 'x' 'x' IN BOOLEAN MODE ) ca0 , ra5 . k , ra7 . k , ra5 . k , ra7 . k , ra6 . k , ra8 . k , ra5 . k , ra7 . k , ra6 . k , ra8 . k FROM t2 ra7 CROSS JOIN t1 ra6 LEFT OUTER JOIN ( t2 ra1 LEFT JOIN t2 ra2 ON ra2 . k = 1 AND CAST( SHA( ra2 . k >> 'fixme' ) AS JSON ) = ra2 . k CROSS JOIN t1 ra5 LEFT JOIN ( t2 ra3 LEFT JOIN t1 ra4 ON ra3 . k = ra3 . k AND ra4 . k < - 16 ) ON ra3 . k >= - 2147483648 AND ra3 . k = ra3 . k ) ON ( CAST( 'fixme' AS CHAR ) = - - 1 OR ra4 . k IS NULL ) AND ( ra5 . k = - - 1 OR ra4 . k IS NULL ) AND ( ra3 . k = ra1 . k OR ra6 . k IS NULL OR ra3 . k IS NULL OR ra6 . k IS NULL ) AND ( ra1 . k <> 'fixme' ) CROSS JOIN t2 ra8 WHERE ra5 . k = - 1 AND ra3 . k < ra6 . k = ra6 . k AND ( ra2 . k >= - 16 OR ra7 . k IS NULL ) AND ( ra4 . k < - 1 OR ra4 . k IS NULL ) AND ( ra1 . k = ra6 . k OR ra5 . k IS NULL OR ra7 . k IS NULL ) AND ( ra5 . k >= - - 16 OR ra8 . k IS NULL ) AND ( ra7 . k >= - - 12346 OR ra3 . k IS NULL ) AND ( ra3 . k <= 1 OR ra3 . k IS NULL ) AND ( ra2 . k < - 1 OR ra6 . k IS NULL ) AND ( ra4 . k = ra2 . k OR ra7 . k IS NULL ) AND ( ra3 . k = - 16 ) ORDER BY CAST( 128 AS CHAR ( 1 ) CHARSET BINARY ) , ra1 . k ;
```
[28 Jun 2022 9:19] MySQL Verification Team
Hello Wang Ke,

Thank you for the report and test case.
Observed that 8.0.29 debug build is affected with provided test case.

regards,
Umesh
[16 Aug 2022 23:44] Jon Stephens
Documented fix in the MySQL 8.0.31 changelog, as follows:

    Added a missing error check after an item evaluation when
    reading const tables.

Closed.