summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2021-05-11 21:05:51 +0300
committerMonty <monty@mariadb.org>2021-05-11 21:06:36 +0300
commit0df51e610bd88edbcda5da0234a8768cc2e219ef (patch)
tree7ef39536869272ecdfac8b823b1822f28f06292f
parent621501f38bd8db1a334a6cd873db787a5a5070aa (diff)
downloadmariadb-git-0df51e610bd88edbcda5da0234a8768cc2e219ef.tar.gz
MDEV-25651 Server crash or assertion failure in THD::update_stats upon concurrent DROP TRIGGER
The problem was that in a timeout event, thd->lex->restore_backup_query_tables_list() was called when it should not have been. Patch tested with the script in MDEV-25651 (not suitable for mtr)
-rw-r--r--sql/sql_trigger.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc
index 24bd7001eea..19379d3f77a 100644
--- a/sql/sql_trigger.cc
+++ b/sql/sql_trigger.cc
@@ -396,6 +396,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
bool result= TRUE;
String stmt_query;
bool lock_upgrade_done= FALSE;
+ bool backup_of_table_list_done= 0;;
MDL_ticket *mdl_ticket= NULL;
MDL_request mdl_request_for_trn;
Query_tables_list backup;
@@ -465,6 +466,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
Protect the query table list from the temporary and potentially
destructive changes necessary to open the trigger's table.
*/
+ backup_of_table_list_done= 1;
thd->lex->reset_n_backup_query_tables_list(&backup);
/*
Restore Query_tables_list::sql_command, which was
@@ -634,7 +636,7 @@ end:
mdl_ticket->downgrade_lock(MDL_SHARED_NO_READ_WRITE);
/* Restore the query table list. Used only for drop trigger. */
- if (!create)
+ if (backup_of_table_list_done)
thd->lex->restore_backup_query_tables_list(&backup);
if (!result)