From e8b9d8d38cac3ca4c18a09a29601791390323bbb Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 29 Apr 2021 13:13:04 +0200 Subject: MDEV-25530 Error 1451 on slave: Cannot delete or update a parent row: a foreign key constraint fails after dfb41fddf6 tables that failed to drop are excluded from the binlogged DROP TABLE statement. It means that the slave should not expect any errors when executing DROP TABLE, and the binlog should report that no error has happened, even if it was. Do not write error code into the binlogged DROP TABLE, and remove all code that was needed to compute it. --- sql/sql_table.cc | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) (limited to 'sql/sql_table.cc') diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 79979d05033..6330c09e2e8 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2238,7 +2238,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, uint not_found_errors= 0; int error= 0; int non_temp_tables_count= 0; - bool non_tmp_error= 0; bool trans_tmp_table_deleted= 0, non_trans_tmp_table_deleted= 0; bool non_tmp_table_deleted= 0; bool is_drop_tmp_if_exists_added= 0; @@ -2304,7 +2303,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, { bool is_trans= 0, temporary_table_was_dropped= 0; bool table_creation_was_logged= 0; - bool local_non_tmp_error= 0, wrong_drop_sequence= 0; + bool wrong_drop_sequence= 0; bool table_dropped= 0; const LEX_CSTRING db= table->db; const LEX_CSTRING table_name= table->table_name; @@ -2469,7 +2468,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, */ wrong_drop_sequence= drop_sequence && hton; was_table|= wrong_drop_sequence; - local_non_tmp_error= 1; error= table_type == TABLE_TYPE_UNKNOWN ? ENOENT : -1; tdc_remove_table(thd, db.str, table_name.str); } @@ -2562,7 +2560,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, table_dropped= 1; } } - local_non_tmp_error|= MY_TEST(error); } /* @@ -2580,8 +2577,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, ferror= ha_delete_table_force(thd, path, &db, &table_name); if (!ferror) { - /* Table existed and was deleted */ - local_non_tmp_error= 0; table_dropped= 1; error= 0; } @@ -2655,12 +2650,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, didn't exists */ if (if_exists && non_existing_table_error(error)) - { error= 0; - local_non_tmp_error= 0; - } - - non_tmp_error|= local_non_tmp_error; if (!error && table_dropped) { @@ -2774,12 +2764,10 @@ err: normal_tables.chop(); built_query.append(normal_tables.ptr(), normal_tables.length()); built_query.append(" /* generated by server */"); - int error_code = non_tmp_error ? thd->get_stmt_da()->sql_errno() : 0; error |= (thd->binlog_query(THD::STMT_QUERY_TYPE, built_query.ptr(), built_query.length(), - TRUE, FALSE, FALSE, - error_code) > 0); + TRUE, FALSE, FALSE, 0) > 0); } } } -- cgit v1.2.1