mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
BUG#21096: locking issue ; temporary table conflicts.
The problem was that during DROP TEMPORARY TABLE we tried to acquire the name lock, though temporary tables belongs to one connection, and no race is possible. The solution is to not use table name locking while executing DROP TEMPORARY TABLE. mysql-test/r/temp_table.result: Add result for bug#21096: locking issue ; temporary table conflicts. mysql-test/t/temp_table.test: Add test case for bug#21096: locking issue ; temporary table conflicts. sql/sql_table.cc: Do not use table name locking while executing DROP TEMPORARY TABLE.
This commit is contained in:
parent
04d60b3897
commit
4ed1ce6f58
3 changed files with 67 additions and 3 deletions
|
@ -108,3 +108,20 @@ d c
|
|||
bar 2
|
||||
foo 1
|
||||
drop table t1, t2;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (i INT);
|
||||
LOCK TABLE t1 WRITE;
|
||||
CREATE TEMPORARY TABLE t1 (i INT);
|
||||
The following command should not block
|
||||
DROP TEMPORARY TABLE t1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (i INT);
|
||||
CREATE TEMPORARY TABLE t2 (i INT);
|
||||
DROP TEMPORARY TABLE t2, t1;
|
||||
ERROR 42S02: Unknown table 't1'
|
||||
SELECT * FROM t2;
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
SELECT * FROM t1;
|
||||
i
|
||||
DROP TABLE t1;
|
||||
End of 4.1 tests.
|
||||
|
|
|
@ -99,4 +99,50 @@ insert into t2 values (NULL, 'foo'), (NULL, 'bar');
|
|||
select d, c from t1 left join t2 on b = c where a = 3 order by d;
|
||||
drop table t1, t2;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
# BUG#21096: locking issue ; temporary table conflicts.
|
||||
#
|
||||
# The problem was that on DROP TEMPORARY table name lock was acquired,
|
||||
# which should not be done.
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (i INT);
|
||||
|
||||
LOCK TABLE t1 WRITE;
|
||||
|
||||
connect (conn1, localhost, root,,);
|
||||
|
||||
CREATE TEMPORARY TABLE t1 (i INT);
|
||||
|
||||
--echo The following command should not block
|
||||
DROP TEMPORARY TABLE t1;
|
||||
|
||||
disconnect conn1;
|
||||
connection default;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Check that it's not possible to drop a base table with
|
||||
# DROP TEMPORARY statement.
|
||||
#
|
||||
CREATE TABLE t1 (i INT);
|
||||
CREATE TEMPORARY TABLE t2 (i INT);
|
||||
|
||||
--error 1051
|
||||
DROP TEMPORARY TABLE t2, t1;
|
||||
|
||||
# Table t2 should have been dropped.
|
||||
--error 1146
|
||||
SELECT * FROM t2;
|
||||
# But table t1 should still be there.
|
||||
SELECT * FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 4.1 tests.
|
||||
|
|
|
@ -214,7 +214,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
|||
bool some_tables_deleted=0, tmp_table_deleted=0, foreign_key_error=0;
|
||||
DBUG_ENTER("mysql_rm_table_part2");
|
||||
|
||||
if (lock_table_names(thd, tables))
|
||||
if (!drop_temporary && lock_table_names(thd, tables))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
for (table=tables ; table ; table=table->next)
|
||||
|
@ -311,7 +311,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
|||
}
|
||||
}
|
||||
|
||||
unlock_table_names(thd, tables);
|
||||
if (!drop_temporary)
|
||||
unlock_table_names(thd, tables);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue