From 67dbff680e52bf60bbdf48587b5c68cbe47cf094 Mon Sep 17 00:00:00 2001 From: Alexander Nozdrin Date: Thu, 22 Oct 2009 22:22:53 +0400 Subject: [PATCH] Backporting a patch for Bug#43138. That patch had been already backported to 5.1 partially. This patch brings what was left to mysql-next-mr. Original revisions in 6.0: ------------------------------------------------------------ revno: 2617.31.26 committer: Alexander Nozdrin branch nick: 6.0-rt-bug43138.3 timestamp: Thu 2009-04-30 19:31:30 +0400 message: Fix for Bug#43138: DROP DATABASE failure does not clean up message list. The problem was that the high-level function mysql_rm_db() invoked low-level mysql_rm_table_part2(), which reported low-level error (Unknown table) if SE refused to delete a table. Also when mysql_rm_table_part2() reported an error, it didn't add corresponding warning into the list (because it is used from other places where such behaviour is required). The fix is to 1. Remove no_warnings_for_error usage from sql_table.cc 2. Improve internal error handler support in THD, so that a stack of error handlers is allowed. 3. Create an internal error handler (Drop_table_error_handler) to silence useless warnings. 4. Use the handler in DROP DATABASE and DROP TABLE statements. ------------------------------------------------------------ revno: 2617.69.38 committer: Alexander Nozdrin branch nick: mysql-next-bugfixing-bug37431 timestamp: Mon 2009-08-24 21:52:09 +0400 message: A test case for Bug#37431 (DROP TABLE does not report errors correctly). ------------------------------------------------------------ revno: 2617.31.29 committer: Dmitry Lenev branch nick: mysql-6.0-runtime timestamp: Fri 2009-05-01 17:37:34 +0400 message: Follow-up for fix for bug "Bug#43138: DROP DATABASE failure does not clean up message list". Fixed drop.test failure under non-debug server by moving part of test dependent on debug-only feature to separate .test file, which won't be run for non-debug versions of server. ------------------------------------------------------------ revno: 2617.45.17 committer: Sergei Golubchik branch nick: 6.0-maria timestamp: Wed 2009-05-13 20:08:58 +0200 message: followup for bug#43138 if delete fails with a permission denied error, we want to show it ------------------------------------------------------------ The patch was backported to 5.1 in scope of Bug#42364 by the following revision: ------------------------------------------------------------ revno: 2497.975.3 committer: Sergey Glukhov branch nick: mysql-5.1-bugteam timestamp: Fri 2009-07-03 13:22:06 +0500 message: Bug#42364 SHOW ERRORS returns empty resultset after dropping non existent table enabled message storing into error message list for 'drop table' command ------------------------------------------------------------ --- mysql-test/r/drop.result | 14 ++++++++++++++ mysql-test/t/drop.test | 21 +++++++++++++++++++++ sql/sql_class.cc | 2 +- sql/sql_table.cc | 6 ++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result index b798b49dd34..42739b10d50 100644 --- a/mysql-test/r/drop.result +++ b/mysql-test/r/drop.result @@ -121,3 +121,17 @@ ERROR 42000: Incorrect table name '#mysql50#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa use test; drop database mysqltestbug26703; End of 5.1 tests + +# -- +# -- Bug#37431 (DROP TABLE does not report errors correctly). +# -- +DROP TABLE IF EXISTS t1; +DROP TABLE t1; +ERROR 42S02: Unknown table 't1' +SHOW WARNINGS; +Level Code Message +Error 1051 Unknown table 't1' + +# -- +# -- End of Bug#37431. +# -- diff --git a/mysql-test/t/drop.test b/mysql-test/t/drop.test index bb4dd3e11f9..6be4ea25007 100644 --- a/mysql-test/t/drop.test +++ b/mysql-test/t/drop.test @@ -202,3 +202,24 @@ use test; drop database mysqltestbug26703; --echo End of 5.1 tests + +########################################################################### + +--echo +--echo # -- +--echo # -- Bug#37431 (DROP TABLE does not report errors correctly). +--echo # -- + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +--error ER_BAD_TABLE_ERROR +DROP TABLE t1; + +SHOW WARNINGS; + +--echo +--echo # -- +--echo # -- End of Bug#37431. +--echo # -- diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 456ff0cb3c5..1c586415ce9 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -390,7 +390,7 @@ char *thd_security_context(THD *thd, char *buffer, unsigned int length, /** - Implementation of Drop_table_error_handler::handle_error(). + Implementation of Drop_table_error_handler::handle_condition(). The reason in having this implementation is to silence technical low-level warnings during DROP TABLE operation. Currently we don't want to expose the following warnings during DROP TABLE: diff --git a/sql/sql_table.cc b/sql/sql_table.cc index e6f9bb9e5e3..2d7f85384a1 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2054,6 +2054,12 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, } DBUG_PRINT("table", ("table: 0x%lx s: 0x%lx", (long) table->table, table->table ? (long) table->table->s : (long) -1)); + + DBUG_EXECUTE_IF("bug43138", + my_printf_error(ER_BAD_TABLE_ERROR, + ER(ER_BAD_TABLE_ERROR), MYF(0), + table->table_name);); + } /* It's safe to unlock LOCK_open: we have an exclusive lock