| Bug #120353 | InnoDB crashes with assertion failure (ut_dbg_assertion_failed) when creating index with ALGORITHM COPY on table with F | ||
|---|---|---|---|
| Submitted: | 27 Apr 11:55 | Modified: | 29 Apr 11:43 |
| Reporter: | Jason Tang | Email Updates: | |
| Status: | Can't repeat | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
| Version: | <=8.0.42-debug | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[27 Apr 17:25]
MySQL Verification Team
Please upload your mysql error log and my.cnf. I couldn't reproduce this on 8.0.46-debug.
mysql> CREATE DATABASE fuzzDatabase1;
Query OK, 1 row affected (0.01 sec)
mysql> USE fuzzDatabase1;
Database changed
mysql> CREATE TABLE IF NOT EXISTS t0(
-> c0 DECIMAL,
-> c1 FLOAT STORAGE DISK UNIQUE NULL
-> );
Query OK, 0 rows affected (0.07 sec)
mysql> CREATE UNIQUE INDEX i0 ON t0(c0 ASC, c1);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> UPDATE t0 SET c0=DEFAULT;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
mysql> CREATE INDEX i1 USING BTREE ON t0(c0, c1) VISIBLE ALGORITHM COPY;
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select version();
+-------------------------+
| version() |
+-------------------------+
| 8.0.46-commercial-debug |
+-------------------------+
1 row in set (0.00 sec)
--
Shane, MySQL Senior Principal Technical Support Engineer
Oracle Corporation
http://dev.mysql.com/
[28 Apr 16:17]
Jason Tang
InnoDB: We intentionally generate a memory trap. InnoDB: Submit a detailed bug report to http://bugs.mysql.com. InnoDB: If you get repeated assertion failures or crashes, even InnoDB: immediately after the mysqld startup, there may be InnoDB: corruption in the InnoDB tablespace. Please refer to InnoDB: http://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html InnoDB: about forcing recovery. 2026-04-27T11:46:22Z UTC - mysqld got signal 6 ; Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware. BuildID[sha1]=74c66055f3de3ce92689b61f26f34703359b2316 Thread pointer: 0x7f38c8001050 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 = 7f39387f79b8 thread_stack 0x100000 /usr/local/mysql/bin/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0x4c) [0x55efe32ededc] /usr/local/mysql/bin/mysqld(print_fatal_signal(int)+0x398) [0x55efe11f72e8] /usr/local/mysql/bin/mysqld(my_server_abort()+0x10d) [0x55efe11f769d] /usr/local/mysql/bin/mysqld(my_abort()+0xa) [0x55efe32dd35a] /usr/local/mysql/bin/mysqld(ut_dbg_assertion_failed(char const*, char const*, unsigned long)+0x2c6) [0x55efe384c9c6] /usr/local/mysql/bin/mysqld(+0x3df605d) [0x55efe38bd05d] /usr/local/mysql/bin/mysqld(btr_create(unsigned long, unsigned int, unsigned long, dict_index_t*, mtr_t*)+0x76a) [0x55efe38bca5a] /usr/local/mysql/bin/mysqld(dict_create_index_tree_in_mem(dict_index_t*, trx_t*)+0x29c) [0x55efe3a3acac] /usr/local/mysql/bin/mysqld(row_create_index_for_mysql(dict_index_t*, trx_t*, unsigned long const*, dict_table_t*)+0x75c) [0x55efe36a1a3c] /usr/local/mysql/bin/mysqld(create_index(trx_t*, TABLE const*, unsigned int, char const*, unsigned int, dd::Table const*)+0x1118) [0x55efe33953d8] /usr/local/mysql/bin/mysqld(create_table_info_t::create_table(dd::Table const*, dd::Table const*)+0x132b) [0x55efe338fe5b] /usr/local/mysql/bin/mysqld(int innobase_basic_ddl::create_impl<dd::Table>(THD*, char const*, TABLE*, HA_CREATE_INFO*, dd::Table*, bool, bool, bool, unsigned int, unsigned int, dd::Table const*)+0x26c) [0x55efe33985dc] /usr/local/mysql/bin/mysqld(ha_innobase::create(char const*, TABLE*, HA_CREATE_INFO*, dd::Table*)+0x218) [0x55efe33a4398] /usr/local/mysql/bin/mysqld(ha_create_table(THD*, char const*, char const*, char const*, HA_CREATE_INFO*, bool, bool, dd::Table*)+0x82f) [0x55efe14561bf] /usr/local/mysql/bin/mysqld(mysql_alter_table(THD*, char const*, char const*, HA_CREATE_INFO*, Table_ref*, Alter_info*)+0x4661) [0x55efe102c071] /usr/local/mysql/bin/mysqld(Sql_cmd_create_or_drop_index_base::execute(THD*)+0x2dd) [0x55efe199677d] /usr/local/mysql/bin/mysqld(mysql_execute_command(THD*, bool)+0x5fbb) [0x55efe0ec29cb] /usr/local/mysql/bin/mysqld(dispatch_sql_command(THD*, Parser_state*)+0xfa8) [0x55efe0eb90d8] /usr/local/mysql/bin/mysqld(dispatch_command(THD*, COM_DATA const*, enum_server_command)+0x4792) [0x55efe0eb3d32] /usr/local/mysql/bin/mysqld(do_command(THD*)+0x9de) [0x55efe0eb6a8e] /usr/local/mysql/bin/mysqld(+0x170b554) [0x55efe11d2554] /usr/local/mysql/bin/mysqld(+0x48e64dc) [0x55efe43ad4dc] /lib/x86_64-linux-gnu/libc.so.6(+0x94ac3) [0x7f3986c60ac3] /lib/x86_64-linux-gnu/libc.so.6(+0x1268d0) [0x7f3986cf28d0] Trying to get some variables. Some pointers may be invalid and cause the dump to abort. Query (7f38c8202fc0): CREATE INDEX i1 USING BTREE ON t0(c0, c1) VISIBLE ALGORITHM COPY Connection ID (thread ID): 8 Status: NOT_KILLED
[28 Apr 16:19]
Jason Tang
POC: DROP DATABASE IF EXISTS fuzzDatabase1; CREATE DATABASE fuzzDatabase1; USE fuzzDatabase1; SET GLOBAL innodb_redo_log_capacity = 137438953472; CREATE TABLE IF NOT EXISTS t0(c0 DECIMAL, c1 FLOAT STORAGE DISK UNIQUE NULL ) ; CREATE UNIQUE INDEX i0 ON t0(c0 ASC, c1); UPDATE t0 SET c0=DEFAULT; CREATE INDEX i1 USING BTREE ON t0(c0, c1) VISIBLE ALGORITHM COPY;
[29 Apr 11:43]
MySQL Verification Team
Hello! I cannot repeat this on linux on 8.0.45-debug either. However, I notice you've changed the version: -Version: 8.0.45+ +Version: <=8.0.42-debug Still not able to reproduce this on 8.0.42-debug. $ mysql -uroot -h127.0.0.1 -P3333 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 8.0.42-debug (Built on 24 May 2025, with gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-5.0.1)) Copyright (c) 2000, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE TABLE IF NOT EXISTS t0(c0 DECIMAL, c1 FLOAT STORAGE DISK UNIQUE NULL ) ; mysql> DROP DATABASE IF EXISTS fuzzDatabase1; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE DATABASE fuzzDatabase1; Query OK, 1 row affected (0.00 sec) mysql> USE fuzzDatabase1; Database changed mysql> SET GLOBAL innodb_redo_log_capacity = 137438953472; Query OK, 0 rows affected (0.02 sec) mysql> CREATE TABLE IF NOT EXISTS t0(c0 DECIMAL, c1 FLOAT STORAGE DISK UNIQUE NULL ) ; Query OK, 0 rows affected (0.06 sec) mysql> CREATE UNIQUE INDEX i0 ON t0(c0 ASC, c1); Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> UPDATE t0 SET c0=DEFAULT; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql> CREATE INDEX i1 USING BTREE ON t0(c0, c1) VISIBLE ALGORITHM COPY; Query OK, 0 rows affected (0.20 sec) Records: 0 Duplicates: 0 Warnings: 0 Older versions don't get fixed. Suggest you please try 8.4.9 or newer.

Description: Executing a standard sequence of DDL statements (create database → create table with FLOAT column STORAGE DISK and unique constraint → create composite unique index → create secondary index with VISIBLE ALGORITHM COPY) causes the MySQL server to crash immediately with an InnoDB assertion failure. The crash occurs in the InnoDB index creation function btr_create(), triggering a debug assertion failure (ut_dbg_assertion_failed). The server cannot handle the DDL combination gracefully and aborts directly. How to repeat: -- 1. Initialize database DROP DATABASE IF EXISTS fuzzDatabase1; CREATE DATABASE fuzzDatabase1; USE fuzzDatabase1; -- 2. Modify InnoDB global variable (no impact on crash, included in original test case) SET GLOBAL innodb_redo_log_capacity = 137438953472; -- 3. Create table with FLOAT column: STORAGE DISK + UNIQUE NULL CREATE TABLE IF NOT EXISTS t0( c0 DECIMAL, c1 FLOAT STORAGE DISK UNIQUE NULL ); -- 4. Create composite unique index (DECIMAL + FLOAT columns) CREATE UNIQUE INDEX i0 ON t0(c0 ASC, c1); -- 5. Useless update (no impact on crash) UPDATE t0 SET c0=DEFAULT; -- 6. CRASH TRIGGER: Create BTREE index with VISIBLE + ALGORITHM COPY CREATE INDEX i1 USING BTREE ON t0(c0, c1) VISIBLE ALGORITHM COPY;