mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 14:02:32 +01:00
Backport of revno: 2617.68.36
--------------------------------------------- This is a patch for bug#47098 assert in MDL_context::destroy on HANDLER <damaged merge table> OPEN. The assert occurs in MDL_context::destroy when the connection is terminated, because all mdl_tickets have not been released. MERGE tables do not support being opened using the HANDLER ... OPEN command, and trying to do so will result in an error. In the event of an error, all tables that are opened, should be closed again. The fix for bug#45781 made sure that this also works for MERGE tables, which causes multiple tables to be opened. This fix extends the fix for bug#45781, by ensuring that also all locks are released, when MERGE tables are involved.
This commit is contained in:
parent
fb545cf9d8
commit
1642f67b40
3 changed files with 69 additions and 1 deletions
|
@ -2502,4 +2502,34 @@ c1
|
||||||
DROP TRIGGER t2_au;
|
DROP TRIGGER t2_au;
|
||||||
DROP FUNCTION f1;
|
DROP FUNCTION f1;
|
||||||
DROP TABLE tm1, t1, t2, t3, t4, t5;
|
DROP TABLE tm1, t1, t2, t3, t4, t5;
|
||||||
|
#
|
||||||
|
# Bug47098 assert in MDL_context::destroy on HANDLER
|
||||||
|
# <damaged merge table> OPEN
|
||||||
|
#
|
||||||
|
# Test that merge tables are closed correctly when opened using
|
||||||
|
# HANDLER ... OPEN.
|
||||||
|
# The general case.
|
||||||
|
DROP TABLE IF EXISTS t1, t2, t3;
|
||||||
|
# Connection con1.
|
||||||
|
CREATE TABLE t1 (c1 int);
|
||||||
|
CREATE TABLE t2 (c1 int);
|
||||||
|
CREATE TABLE t3 (c1 int) ENGINE = MERGE UNION (t1,t2);
|
||||||
|
START TRANSACTION;
|
||||||
|
HANDLER t3 OPEN;
|
||||||
|
ERROR HY000: Table storage engine for 't3' doesn't have this option
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
|
# Connection default.
|
||||||
|
# Disconnecting con1, all mdl_tickets must have been released.
|
||||||
|
# The bug-specific case.
|
||||||
|
# Connection con1.
|
||||||
|
CREATE TABLE t1 (c1 int);
|
||||||
|
CREATE TABLE t2 (c1 int);
|
||||||
|
CREATE TABLE t3 (c1 int) ENGINE = MERGE UNION (t1,t2);
|
||||||
|
DROP TABLE t2;
|
||||||
|
START TRANSACTION;
|
||||||
|
HANDLER t3 OPEN;
|
||||||
|
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||||
|
DROP TABLE t1, t3;
|
||||||
|
# Connection default.
|
||||||
|
# Disconnecting con1, all mdl_tickets must have been released.
|
||||||
End of 6.0 tests
|
End of 6.0 tests
|
||||||
|
|
|
@ -1985,6 +1985,43 @@ DROP TRIGGER t2_au;
|
||||||
DROP FUNCTION f1;
|
DROP FUNCTION f1;
|
||||||
DROP TABLE tm1, t1, t2, t3, t4, t5;
|
DROP TABLE tm1, t1, t2, t3, t4, t5;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug47098 assert in MDL_context::destroy on HANDLER
|
||||||
|
--echo # <damaged merge table> OPEN
|
||||||
|
--echo #
|
||||||
|
--echo # Test that merge tables are closed correctly when opened using
|
||||||
|
--echo # HANDLER ... OPEN.
|
||||||
|
--echo # The general case.
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1, t2, t3;
|
||||||
|
--enable_warnings
|
||||||
|
--echo # Connection con1.
|
||||||
|
connect (con1,localhost,root,,);
|
||||||
|
CREATE TABLE t1 (c1 int);
|
||||||
|
CREATE TABLE t2 (c1 int);
|
||||||
|
CREATE TABLE t3 (c1 int) ENGINE = MERGE UNION (t1,t2);
|
||||||
|
START TRANSACTION;
|
||||||
|
--error ER_ILLEGAL_HA
|
||||||
|
HANDLER t3 OPEN;
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
|
--echo # Connection default.
|
||||||
|
connection default;
|
||||||
|
--echo # Disconnecting con1, all mdl_tickets must have been released.
|
||||||
|
disconnect con1;
|
||||||
|
--echo # The bug-specific case.
|
||||||
|
--echo # Connection con1.
|
||||||
|
connect (con1,localhost,root,,);
|
||||||
|
CREATE TABLE t1 (c1 int);
|
||||||
|
CREATE TABLE t2 (c1 int);
|
||||||
|
CREATE TABLE t3 (c1 int) ENGINE = MERGE UNION (t1,t2);
|
||||||
|
DROP TABLE t2;
|
||||||
|
START TRANSACTION;
|
||||||
|
--error ER_WRONG_MRG_TABLE
|
||||||
|
HANDLER t3 OPEN;
|
||||||
|
DROP TABLE t1, t3;
|
||||||
|
--echo # Connection default.
|
||||||
|
connection default;
|
||||||
|
--echo # Disconnecting con1, all mdl_tickets must have been released.
|
||||||
|
disconnect con1;
|
||||||
|
|
||||||
--echo End of 6.0 tests
|
--echo End of 6.0 tests
|
||||||
|
|
|
@ -321,6 +321,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
|
||||||
can close a single table only.
|
can close a single table only.
|
||||||
*/
|
*/
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
|
thd->mdl_context.release_all_locks();
|
||||||
my_error(ER_ILLEGAL_HA, MYF(0), hash_tables->alias);
|
my_error(ER_ILLEGAL_HA, MYF(0), hash_tables->alias);
|
||||||
error= TRUE;
|
error= TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue