| Bug #111441 | bool Sql_cmd_dml::prepare(THD*): Assertion `thd->is_error()' failed. | ||
|---|---|---|---|
| Submitted: | 15 Jun 2023 18:53 | Modified: | 22 Jun 2023 17:57 |
| Reporter: | Yu Liang | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: DML | Severity: | S6 (Debug Builds) |
| Version: | 8.0.33 | OS: | Ubuntu (20.04 LTS) |
| Assigned to: | CPU Architecture: | x86 (Intel(R) Core(TM) i7-10700 CPU) | |
[16 Jun 2023 3:38]
MySQL Verification Team
Hello Yu Liang, Thank you for the report and test case. Observed that 8.0.33 debug build is affected. regards, Umesh
[16 Jun 2023 3:39]
MySQL Verification Team
-- release build - not affected
MySQL Version 8.0.33
Checking supported features
Using 'all' suites
Collecting tests
Checking leftover processes
Removing old var directory
- WARNING: Using the 'mysql-test/var' symlink
Creating var directory '/export/home/tmp/ushastry/mysql-8.0.33/mysql-test/var'
Installing system database
Using parallel: 1
==============================================================================
TEST NAME RESULT TIME (ms) COMMENT
------------------------------------------------------------------------------
drop database if exists test123;
Warnings:
Note 1008 Can't drop database 'test123'; database doesn't exist
create database test123;
use test123;
create table v0(c1 INT);
INSERT INTO v0 SELECT * FROM v0 WHERE ! { w2 c1 NOT IN ( TABLE v0) IS NOT FALSE } IN ( TABLE v0 ) IS FALSE GROUP BY c1 HAVING c1 WINDOW w2 AS ( );
[ 50%] main.bug111441 [ pass ] 7
[100%] shutdown_report [ pass ]
------------------------------------------------------------------------------
-- debug build - affected
./mtr bug111441 --nocheck-testcases --debug-server
Logging: ./mtr bug111441 --nocheck-testcases --debug-server
MySQL Version 8.0.33
Checking supported features
- Binaries are debug compiled
Using 'all' suites
Collecting tests
Checking leftover processes
Removing old var directory
- WARNING: Using the 'mysql-test/var' symlink
Creating var directory '/export/home/tmp/ushastry/mysql-8.0.33/mysql-test/var'
Installing system database
Using parallel: 1
==============================================================================
TEST NAME RESULT TIME (ms) COMMENT
------------------------------------------------------------------------------
drop database if exists test123;
Warnings:
Note 1008 Can't drop database 'test123'; database doesn't exist
create database test123;
use test123;
create table v0(c1 INT);
INSERT INTO v0 SELECT * FROM v0 WHERE ! { w2 c1 NOT IN ( TABLE v0) IS NOT FALSE } IN ( TABLE v0 ) IS FALSE GROUP BY c1 HAVING c1 WINDOW w2 AS ( );
[ 50%] main.bug111441 [ fail ]
Test ended at 2023-06-16 05:37:30
CURRENT_TEST: main.bug111441
mysqltest: At line 5: Query 'INSERT INTO v0 SELECT * FROM v0 WHERE ! { w2 c1 NOT IN ( TABLE v0) IS NOT FALSE } IN ( TABLE v0 ) IS FALSE GROUP BY c1 HAVING c1 WINDOW w2 AS ( )' failed.
ERROR 2013 (HY000): Lost connection to MySQL server during query
-bt
#0 0x00007fc9cf0a4aa1 in pthread_kill () from /lib64/libpthread.so.0
#1 0x0000000003f9296e in my_write_core(int) ()
#2 0x00000000032365f5 in handle_fatal_signal ()
#3 <signal handler called>
#4 0x00007fc9cd2de387 in raise () from /lib64/libc.so.6
#5 0x00007fc9cd2dfa78 in abort () from /lib64/libc.so.6
#6 0x00007fc9cd2d71a6 in __assert_fail_base () from /lib64/libc.so.6
#7 0x00007fc9cd2d7252 in __assert_fail () from /lib64/libc.so.6
#8 0x0000000003123445 in Sql_cmd_dml::prepare(THD*) ()
#9 0x000000000312362f in Sql_cmd_dml::execute(THD*) ()
#10 0x00000000030c24af in mysql_execute_command(THD*, bool) ()
#11 0x00000000030c5dc9 in dispatch_sql_command(THD*, Parser_state*) ()
#12 0x00000000030c752b in dispatch_command(THD*, COM_DATA const*, enum_server_command) ()
#13 0x00000000030c926e in do_command(THD*) ()
#14 0x0000000003227bb7 in handle_connection ()
#15 0x0000000004743af9 in pfs_spawn_thread ()
#16 0x00007fc9cf09fea5 in start_thread () from /lib64/libpthread.so.0
#17 0x00007fc9cd3a6b2d in clone () from /lib64/libc.so.6
[22 Jun 2023 6:56]
Tor Didriksen
Posted by developer:
Fixed on trunk, by
commit 79eae6a2b9b2ecbff21deb3b66669c9ac002d964
Author: Roy Lyseng <roy.lyseng@oracle.com>
AuthorDate: Fri May 12 08:39:57 2023 +0200
Commit: Roy Lyseng <roy.lyseng@oracle.com>
CommitDate: Fri May 12 09:13:44 2023 +0200
Bug#35184353: Refactor order of subquery resolving and transformation
[22 Jun 2023 17:22]
Christine Cole
Posted by developer: Work was done for test suite. No changelog entry needed.
[22 Jun 2023 17:57]
Yu Liang
Thank you for the patch information. We will keep track of the bug triggering in the future MySQL releases.

Description: The latest version of the MySQL Server (version 8.0.33 debug build) (git commit hash: ea7087d8850) crashes with Assertion Failure when executing the following query: Config from "/etc/mysql/conf.d/mysql.cnf": ``` [mysqld] sql_mode = "NO_ENGINE_SUBSTITUTION" ``` ```sql drop database if exists test123; create database test123; use test123; create table v0(c1 INT); INSERT INTO v0 SELECT * FROM v0 WHERE ! { w2 c1 NOT IN ( TABLE v0) IS NOT FALSE } IN ( TABLE v0 ) IS FALSE GROUP BY c1 HAVING c1 WINDOW w2 AS ( ); ``` In the debug build, the server crashes with the following stack trace: ``` mysql> INSERT LOW_PRIORITY IGNORE INTO test123 . v1099 SELECT HIGH_PRIORITY v1099 . * INTO OUTFILE 'abc' FROM { OJ v1099 } WHERE ! { v0 c1100 NOT IN ( TABLE v1099 ) IS NOT FALSE } NOT IN ( TABLE v1099 ) IS FALSE GROUP BY c1100 NOT IN ( TABLE v1099 ) IS NOT FALSE HAVING c1100 NOT REGEXP DEFAULT ( test123 . v1099 . c1100 ) IS NOT FALSE WINDOW v0 AS ( ) ON DUPLICATE KEY UPDATE c1100 = DEFAULT ; mysqld: /home/mysql/mysql-server/sql/sql_select.cc:406: virtual bool Sql_cmd_dml::prepare(THD *): Assertion `thd->is_error()' failed. 2023-06-14T15:16:29Z UTC - mysqld got signal 6 ; Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware. BuildID[sha1]=1d55d4671b7469352fc317efb0121b604c26443d Thread pointer: 0xfffef4001040 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 = ffff903d6538 thread_stack 0x100000 /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0x60) [0x4e6bc30] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(print_fatal_signal(int)+0x340) [0x1a89320] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(handle_fatal_signal+0x16c) [0x1a896dc] linux-vdso.so.1(__kernel_rt_sigreturn+0) [0xffff9a2b67a0] /lib/aarch64-linux-gnu/libc.so.6(gsignal+0xe0) [0xffff9992ad78] /lib/aarch64-linux-gnu/libc.so.6(abort+0x114) [0xffff99917aac] /lib/aarch64-linux-gnu/libc.so.6(+0x2d490) [0xffff99924490] /lib/aarch64-linux-gnu/libc.so.6(+0x2d4f4) [0xffff999244f4] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(Sql_cmd_dml::prepare(THD*)+0xdb0) [0x17366b4] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(Sql_cmd_dml::execute(THD*)+0x538) [0x1737bb4] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(mysql_execute_command(THD*, bool)+0x3884) [0x162cd40] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(dispatch_sql_command(THD*, Parser_state*)+0x1124) [0x16252c0] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(dispatch_command(THD*, COM_DATA const*, enum_server_command)+0x5434) [0x161e224] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld(do_command(THD*)+0xb8c) [0x16228f4] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld() [0x1a59a64] /home/mysql/mysql-server/bld/runtime_output_directory/mysqld() [0x655c1a0] /lib/aarch64-linux-gnu/libpthread.so.0(+0x7624) [0xffff9a25c624] /lib/aarch64-linux-gnu/libc.so.6(+0xd149c) [0xffff999c849c] Trying to get some variables. Some pointers may be invalid and cause the dump to abort. Query (fffef41f5a00): INSERT LOW_PRIORITY IGNORE INTO test123 . v1099 SELECT HIGH_PRIORITY v1099 . * INTO OUTFILE 'abc' FROM { OJ v1099 } WHERE ! { v0 c1100 NOT IN ( TABLE v1099 ) IS NOT FALSE } NOT IN ( TABLE v1099 ) IS FALSE GROUP BY c1100 NOT IN ( TABLE v1099 ) IS NOT FALSE HAVING c1100 NOT REGEXP DEFAULT ( test123 . v1099 . c1100 ) IS NOT FALSE WINDOW v0 AS ( ) ON DUPLICATE KEY UPDATE c1100 = DEFAULT Connection ID (thread ID): 8 Status: NOT_KILLED ``` How to repeat: Steps to repeat the Assertion Failure: 1. Download the MySQL Server source code from the official github repo: `https://github.com/mysql/mysql-server` 2. Checkout to the latest mysql released version: 8.0.33 (hash: `ea7087d8850`) 3. Compile MySQL using the command: ``` mkdir -p bld cd bld cmake .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST=../boost -DWITH_UNIT_TESTS=OFF -DUSE_LD_GOLD=1 -DWITH_DEBUG=1 make ``` 4. Run the MySQL Server with command: ``` ./bin/mysqld --basedir=$(pwd) --datadir=$(pwd)/data_all/ori_data --port=7000 --socket=/tmp/mysql_0.sock --mysqlx=OFF --performance_schema=OFF ``` 5. Setup the MySQL Server config in the path: "/etc/mysql/conf.d/mysql.cnf" ``` [mysqld] sql_mode = "NO_ENGINE_SUBSTITUTION" ``` 6. Run the MySQL Client with the PoC: ``` ./bin/mysql --port=7000 --user=root --socket=/tmp/mysql_0.sock < poc_0.sql ``` where `poc_0.sql` is: ```sql drop database if exists test123; create database test123; use test123; create table v0(c1 INT); INSERT INTO v0 SELECT * FROM v0 WHERE ! { w2 c1 NOT IN ( TABLE v0) IS NOT FALSE } IN ( TABLE v0 ) IS FALSE GROUP BY c1 HAVING c1 WINDOW w2 AS ( ); ``` Suggested fix: The server should continue running instead of crashing by Assertion Failure.