@@ -518,17 +518,20 @@ Event_db_repository::table_scan_all_for_i_s(THD *thd, TABLE *schema_table,
518518*/
519519
520520bool
521- Event_db_repository::fill_schema_events (THD *thd, TABLE_LIST *tables ,
521+ Event_db_repository::fill_schema_events (THD *thd, TABLE_LIST *i_s_table ,
522522 const char *db)
523523{
524- TABLE *schema_table= tables->table ;
525- TABLE *event_table= NULL ;
524+ TABLE *schema_table= i_s_table->table ;
525+ Open_tables_backup open_tables_backup;
526+ TABLE_LIST event_table;
526527 int ret= 0 ;
527528
528529 DBUG_ENTER (" Event_db_repository::fill_schema_events" );
529530 DBUG_PRINT (" info" ,(" db=%s" , db? db:" (null)" ));
530531
531- if (open_event_table (thd, TL_READ, &event_table))
532+ event_table.init_one_table (" mysql" , 5 , " event" , 5 , " event" , TL_READ);
533+
534+ if (open_system_tables_for_read (thd, &event_table, &open_tables_backup))
532535 DBUG_RETURN (TRUE );
533536
534537 /*
@@ -541,11 +544,11 @@ Event_db_repository::fill_schema_events(THD *thd, TABLE_LIST *tables,
541544 every single row's `db` with the schema which we show.
542545 */
543546 if (db)
544- ret= index_read_for_db_for_i_s (thd, schema_table, event_table, db);
547+ ret= index_read_for_db_for_i_s (thd, schema_table, event_table. table , db);
545548 else
546- ret= table_scan_all_for_i_s (thd, schema_table, event_table);
549+ ret= table_scan_all_for_i_s (thd, schema_table, event_table. table );
547550
548- close_thread_tables (thd);
551+ close_system_tables (thd, &open_tables_backup );
549552
550553 DBUG_PRINT (" info" , (" Return code=%d" , ret));
551554 DBUG_RETURN (ret);
@@ -584,10 +587,7 @@ Event_db_repository::open_event_table(THD *thd, enum thr_lock_type lock_type,
584587 tables.init_one_table (" mysql" , 5 , " event" , 5 , " event" , lock_type);
585588
586589 if (open_and_lock_tables (thd, &tables, FALSE , MYSQL_LOCK_IGNORE_TIMEOUT))
587- {
588- close_thread_tables (thd);
589590 DBUG_RETURN (TRUE );
590- }
591591
592592 *table= tables.table ;
593593 tables.table ->use_all_columns ();
@@ -700,7 +700,8 @@ Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data,
700700
701701end:
702702 if (table)
703- close_thread_tables (thd);
703+ close_mysql_tables (thd);
704+
704705 thd->variables .sql_mode = saved_mode;
705706 DBUG_RETURN (test (ret));
706707}
@@ -811,7 +812,8 @@ Event_db_repository::update_event(THD *thd, Event_parse_data *parse_data,
811812
812813end:
813814 if (table)
814- close_thread_tables (thd);
815+ close_mysql_tables (thd);
816+
815817 thd->variables .sql_mode = saved_mode;
816818 DBUG_RETURN (test (ret));
817819}
@@ -865,7 +867,7 @@ Event_db_repository::drop_event(THD *thd, LEX_STRING db, LEX_STRING name,
865867
866868end:
867869 if (table)
868- close_thread_tables (thd);
870+ close_mysql_tables (thd);
869871
870872 DBUG_RETURN (test (ret));
871873}
@@ -933,34 +935,14 @@ Event_db_repository::find_named_event(LEX_STRING db, LEX_STRING name,
933935
934936void
935937Event_db_repository::drop_schema_events (THD *thd, LEX_STRING schema)
936- {
937- DBUG_ENTER (" Event_db_repository::drop_schema_events" );
938- drop_events_by_field (thd, ET_FIELD_DB, schema);
939- DBUG_VOID_RETURN;
940- }
941-
942-
943- /* *
944- Drops all events which have a specific value of a field.
945-
946- @pre The thread handle has no open tables.
947-
948- @param[in,out] thd Thread
949- @param[in,out] table mysql.event TABLE
950- @param[in] field Which field of the row to use for matching
951- @param[in] field_value The value that should match
952- */
953-
954- void
955- Event_db_repository::drop_events_by_field (THD *thd,
956- enum enum_events_table_field field,
957- LEX_STRING field_value)
958938{
959939 int ret= 0 ;
960940 TABLE *table= NULL ;
961941 READ_RECORD read_record_info;
962- DBUG_ENTER (" Event_db_repository::drop_events_by_field" );
963- DBUG_PRINT (" enter" , (" field=%d field_value=%s" , field, field_value.str ));
942+ enum enum_events_table_field field= ET_FIELD_DB;
943+ MDL_ticket *mdl_savepoint= thd->mdl_context .mdl_savepoint ();
944+ DBUG_ENTER (" Event_db_repository::drop_schema_events" );
945+ DBUG_PRINT (" enter" , (" field=%d schema=%s" , field, schema.str ));
964946
965947 if (open_event_table (thd, TL_WRITE, &table))
966948 DBUG_VOID_RETURN;
@@ -979,7 +961,7 @@ Event_db_repository::drop_events_by_field(THD *thd,
979961 get_field (thd->mem_root ,
980962 table->field [ET_FIELD_NAME])));
981963
982- if (!sortcmp_lex_string (et_field_lex, field_value , system_charset_info))
964+ if (!sortcmp_lex_string (et_field_lex, schema , system_charset_info))
983965 {
984966 DBUG_PRINT (" info" , (" Dropping" ));
985967 if ((ret= table->file ->ha_delete_row (table->record [0 ])))
@@ -989,6 +971,11 @@ Event_db_repository::drop_events_by_field(THD *thd,
989971 }
990972 end_read_record (&read_record_info);
991973 close_thread_tables (thd);
974+ /*
975+ Make sure to only release the MDL lock on mysql.event, not other
976+ metadata locks DROP DATABASE might have acquired.
977+ */
978+ thd->mdl_context .rollback_to_savepoint (mdl_savepoint);
992979
993980 DBUG_VOID_RETURN;
994981}
@@ -1026,7 +1013,7 @@ Event_db_repository::load_named_event(THD *thd, LEX_STRING dbname,
10261013 else if ((ret= etn->load_from_row (thd, table)))
10271014 my_error (ER_CANNOT_LOAD_FROM_TABLE, MYF (0 ), " event" );
10281015
1029- close_thread_tables (thd);
1016+ close_mysql_tables (thd);
10301017 }
10311018
10321019 thd->variables .sql_mode = saved_mode;
@@ -1104,7 +1091,8 @@ update_timing_fields_for_event(THD *thd,
11041091
11051092end:
11061093 if (table)
1107- close_thread_tables (thd);
1094+ close_mysql_tables (thd);
1095+
11081096 /* Restore the state of binlog format */
11091097 DBUG_ASSERT (!thd->is_current_stmt_binlog_format_row ());
11101098 if (save_binlog_row_based)
@@ -1151,7 +1139,7 @@ Event_db_repository::check_system_tables(THD *thd)
11511139 if (table_intact.check (tables.table , &mysql_db_table_def))
11521140 ret= 1 ;
11531141
1154- close_thread_tables (thd);
1142+ close_mysql_tables (thd);
11551143 }
11561144 /* Check mysql.user */
11571145 tables.init_one_table (" mysql" , 5 , " user" , 4 , " user" , TL_READ);
@@ -1171,7 +1159,7 @@ Event_db_repository::check_system_tables(THD *thd)
11711159 event_priv_column_position);
11721160 ret= 1 ;
11731161 }
1174- close_thread_tables (thd);
1162+ close_mysql_tables (thd);
11751163 }
11761164 /* Check mysql.event */
11771165 tables.init_one_table (" mysql" , 5 , " event" , 5 , " event" , TL_READ);
@@ -1185,7 +1173,7 @@ Event_db_repository::check_system_tables(THD *thd)
11851173 {
11861174 if (table_intact.check (tables.table , &event_table_def))
11871175 ret= 1 ;
1188- close_thread_tables (thd);
1176+ close_mysql_tables (thd);
11891177 }
11901178
11911179 DBUG_RETURN (test (ret));
0 commit comments