summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2020-06-25 18:51:45 +0200
committerSergei Golubchik <serg@mariadb.org>2020-07-04 01:44:47 +0200
commit4227dd2ac6659cf65e2fc583ae6060e301cd673c (patch)
tree297fa8a738505637f29604bc62b5f59177a489d0
parent6c52931680a4a24da04d7de7b74321d9ff507745 (diff)
downloadmariadb-git-4227dd2ac6659cf65e2fc583ae6060e301cd673c.tar.gz
continue DROP TEMPORARY TABLE t1, t2, t3 after error.
normal DROP TABLE with many tables continues after an error, trying to drop as many tables as possible. But DROP TEMPORARY TABLE was aborting on the first error. Change it to behave as DROP TABLE does.
-rw-r--r--mysql-test/main/temp_table.result21
-rw-r--r--mysql-test/main/temp_table.test33
-rw-r--r--sql/sql_table.cc13
3 files changed, 51 insertions, 16 deletions
diff --git a/mysql-test/main/temp_table.result b/mysql-test/main/temp_table.result
index 293b6d5cd77..64a5d9b681b 100644
--- a/mysql-test/main/temp_table.result
+++ b/mysql-test/main/temp_table.result
@@ -1,5 +1,3 @@
-drop table if exists t1,t2;
-drop view if exists v1;
#
# test basic creation of temporary tables together with normal table
#
@@ -602,3 +600,22 @@ DROP TEMPORARY TABLE t1;
#
# End of 10.2 tests
#
+create function f1() returns int
+begin
+drop temporary table t1, t2;
+return 1;
+end;
+$$
+create temporary table t1 (a int);
+create temporary table t2 (a int);
+insert t1 values (2);
+insert t2 values (3);
+select a,f1() from t1;
+ERROR HY000: Can't reopen table: 't1'
+drop function f1;
+drop temporary table t1;
+drop temporary table t2;
+ERROR 42S02: Unknown table 'test.t2'
+#
+# End of 10.5 tests
+#
diff --git a/mysql-test/main/temp_table.test b/mysql-test/main/temp_table.test
index dc5fe7f3cd0..ccaa5fb93e8 100644
--- a/mysql-test/main/temp_table.test
+++ b/mysql-test/main/temp_table.test
@@ -6,11 +6,6 @@
# Test of temporary tables
#
---disable_warnings
-drop table if exists t1,t2;
-drop view if exists v1;
---enable_warnings
-
--echo #
--echo # test basic creation of temporary tables together with normal table
--echo #
@@ -658,3 +653,31 @@ DROP TEMPORARY TABLE t1;
--echo #
--echo # End of 10.2 tests
--echo #
+
+#
+# DROP TEMPORARY TABLE fails in the middle
+#
+delimiter $$;
+create function f1() returns int
+begin
+ drop temporary table t1, t2;
+ return 1;
+end;
+$$
+delimiter ;$$
+
+create temporary table t1 (a int);
+create temporary table t2 (a int);
+insert t1 values (2);
+insert t2 values (3);
+--error ER_CANT_REOPEN_TABLE
+select a,f1() from t1;
+drop function f1;
+drop temporary table t1;
+--error ER_BAD_TABLE_ERROR
+drop temporary table t2;
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
+
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 2237d7bc70d..87257bc9ab4 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -2338,17 +2338,12 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
{
table_creation_was_logged= table->table->s->table_creation_was_logged;
if (thd->drop_temporary_table(table->table, &is_trans, true))
- {
- /*
- This is a very unlikely scenaro as dropping a temporary table
- should always work. Would be better if we tried to drop all
- temporary tables before giving the error.
- */
error= 1;
- goto err;
+ else
+ {
+ table->table= 0;
+ temporary_table_was_dropped= 1;
}
- table->table= 0;
- temporary_table_was_dropped= 1;
}
if ((drop_temporary && if_exists) || temporary_table_was_dropped)