diff options
author | Monty <monty@mariadb.org> | 2021-05-11 21:05:51 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2021-05-11 21:06:36 +0300 |
commit | 0df51e610bd88edbcda5da0234a8768cc2e219ef (patch) | |
tree | 7ef39536869272ecdfac8b823b1822f28f06292f | |
parent | 621501f38bd8db1a334a6cd873db787a5a5070aa (diff) | |
download | mariadb-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.cc | 4 |
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) |