diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 9417ec667ff64..24bd7001eea06 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -397,6 +397,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) String stmt_query; bool lock_upgrade_done= FALSE; MDL_ticket *mdl_ticket= NULL; + MDL_request mdl_request_for_trn; Query_tables_list backup; DBUG_ENTER("mysql_create_or_drop_trigger"); @@ -446,6 +447,16 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) DBUG_RETURN(TRUE); } + /* Protect against concurrent create/drop */ + MDL_REQUEST_INIT(&mdl_request_for_trn, MDL_key::TABLE, + create ? tables->db.str : thd->lex->spname->m_db.str, + thd->lex->spname->m_name.str, + MDL_EXCLUSIVE, MDL_EXPLICIT); + if (thd->mdl_context.acquire_lock(&mdl_request_for_trn, + thd->variables.lock_wait_timeout)) + goto end; + + if (!create) { bool if_exists= thd->lex->if_exists(); @@ -635,6 +646,9 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) thd->lex->spname->m_name.str, static_cast(thd->lex->spname->m_name.length)); } + if (mdl_request_for_trn.ticket) + thd->mdl_context.release_lock(mdl_request_for_trn.ticket); + DBUG_RETURN(result); #ifdef WITH_WSREP wsrep_error_label: