From f53321cbdb53c949295732c95f8a01dd3585fb78 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Wed, 18 Oct 2023 12:34:04 +0200 Subject: [PATCH] MDEV-20471 Assertion during cleanup of failed CREATE TABLE LIKE While cleaning up a failed CREATE TABLE LIKE , `mysql_rm_table_no_locks` erroneously attempted to remove all tables involved in the query, including the source table (sequence). Fix to temporarily modify `table_list` to ensure that only the intended table is removed during the cleanup. --- mysql-test/main/sequence_debug.result | 12 ++++++++++++ mysql-test/main/sequence_debug.test | 16 ++++++++++++++++ sql/sql_sequence.cc | 3 ++- sql/sql_table.cc | 10 +++++++++- 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 mysql-test/main/sequence_debug.result create mode 100644 mysql-test/main/sequence_debug.test diff --git a/mysql-test/main/sequence_debug.result b/mysql-test/main/sequence_debug.result new file mode 100644 index 00000000000..5147837bade --- /dev/null +++ b/mysql-test/main/sequence_debug.result @@ -0,0 +1,12 @@ +# +# MDEV-20471 Assertion during cleanup of failed CREATE TABLE LIKE +# +CREATE SEQUENCE s; +set @save_debug_dbug=@@debug_dbug; +set debug_dbug='+d,kill_query_on_sequence_insert'; +CREATE TABLE t LIKE s; +ERROR 70100: Query execution was interrupted +DROP TABLE t; +ERROR 42S02: Unknown table 'test.t' +DROP SEQUENCE s; +set debug_dbug=@save_debug_dbug; diff --git a/mysql-test/main/sequence_debug.test b/mysql-test/main/sequence_debug.test new file mode 100644 index 00000000000..a9ccc2c61b2 --- /dev/null +++ b/mysql-test/main/sequence_debug.test @@ -0,0 +1,16 @@ +--source include/have_debug.inc + +--echo # +--echo # MDEV-20471 Assertion during cleanup of failed CREATE TABLE LIKE +--echo # + +CREATE SEQUENCE s; +set @save_debug_dbug=@@debug_dbug; +set debug_dbug='+d,kill_query_on_sequence_insert'; +--error ER_QUERY_INTERRUPTED +CREATE TABLE t LIKE s; +--error ER_BAD_TABLE_ERROR +DROP TABLE t; + +DROP SEQUENCE s; +set debug_dbug=@save_debug_dbug; diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index 9387d2527fe..ab77eabfa28 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -300,7 +300,8 @@ bool sequence_insert(THD *thd, LEX *lex, TABLE_LIST *org_table_list) Query_tables_list query_tables_list_backup; TABLE_LIST table_list; // For sequence table DBUG_ENTER("sequence_insert"); - + DBUG_EXECUTE_IF("kill_query_on_sequence_insert", + thd->set_killed(KILL_QUERY);); /* seq is 0 if sequence was created with CREATE TABLE instead of CREATE SEQUENCE diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 99839e61ba8..987c66e8aeb 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -5306,7 +5306,14 @@ int mysql_create_table_no_lock(THD *thd, const LEX_CSTRING *db, if (res) { DBUG_ASSERT(thd->is_error()); - /* Drop the table as it wasn't completely done */ + /* + Drop the new table, we were not completely done. + + Temporarily modify table_list to avoid dropping source sequence + in CREATE TABLE LIKE . + */ + TABLE_LIST *tail= table_list->next_local; + table_list->next_local= NULL; if (!mysql_rm_table_no_locks(thd, table_list, 1, create_info->tmp_table(), false, true /* Sequence*/, @@ -5320,6 +5327,7 @@ int mysql_create_table_no_lock(THD *thd, const LEX_CSTRING *db, */ res= 2; } + table_list->next_local= tail; } }