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)