From 1639873671e85748f0dcf89ce76ef4efce9a087c Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 15 Aug 2019 22:32:59 +0300 Subject: [PATCH] MDEV-18154 Deadlock and assertion upon no-op ALTER under LOCK TABLES 1. Revert incorrect treatment of m_needs_reopen; 2. Close single instance of TABLE instead of all instances since reopened only those that are marked for reopen. --- sql/sql_base.cc | 13 ++++++++++--- sql/sql_table.cc | 3 --- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 99c8a227861..3483c9381e8 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2488,9 +2488,16 @@ Locked_tables_list::reopen_tables(THD *thd, bool need_reopen) { if (!table_list->table || !table_list->table->needs_reopen()) continue; - /* no need to remove the table from the TDC here, thus (TABLE*)1 */ - close_all_tables_for_name(thd, table_list->table->s, - HA_EXTRA_NOT_USED, (TABLE*)1); + for (TABLE **prev= &thd->open_tables; *prev; prev= &(*prev)->next) + { + if (*prev == table_list->table) + { + thd->locked_tables_list.unlink_from_list(thd, table_list, false); + mysql_lock_remove(thd, thd->lock, *prev); + close_thread_table(thd, prev); + break; + } + } DBUG_ASSERT(table_list->table == NULL); } else diff --git a/sql/sql_table.cc b/sql/sql_table.cc index be3f9b46c0f..1543a445d7b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -7831,7 +7831,6 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, Create_field *def; Field **f_ptr,*field; MY_BITMAP *dropped_fields= NULL; // if it's NULL - no dropped fields - bool save_reopen= table->m_needs_reopen; DBUG_ENTER("mysql_prepare_alter_table"); /* @@ -8511,9 +8510,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, alter_info->create_list.swap(new_create_list); alter_info->key_list.swap(new_key_list); alter_info->check_constraint_list.swap(new_constraint_list); - DBUG_RETURN(rc); err: - table->m_needs_reopen= save_reopen; DBUG_RETURN(rc); }