diff options
author | Sergei Golubchik <serg@mariadb.org> | 2020-06-25 18:51:45 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2020-07-04 01:44:47 +0200 |
commit | 4227dd2ac6659cf65e2fc583ae6060e301cd673c (patch) | |
tree | 297fa8a738505637f29604bc62b5f59177a489d0 | |
parent | 6c52931680a4a24da04d7de7b74321d9ff507745 (diff) | |
download | mariadb-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.result | 21 | ||||
-rw-r--r-- | mysql-test/main/temp_table.test | 33 | ||||
-rw-r--r-- | sql/sql_table.cc | 13 |
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) |