From: Ingo Struewing Date: July 21 2009 4:53pm Subject: bzr commit into mysql-5.4 branch (ingo.struewing:2847) Bug#20667 List-Archive: http://lists.mysql.com/commits/79116 X-Bug: 20667 Message-Id: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_xZQI8uF5IUm2dmKa121ZZg)" --Boundary_(ID_xZQI8uF5IUm2dmKa121ZZg) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home2/mydev/bzrroot/mysql-6.0-bug20667-2/ based on revid:hema@stripped 2847 Ingo Struewing 2009-07-21 Bug#20667 - Truncate table fails for a write locked table TRUNCATE TABLE was not allowed under LOCK TABLES. The patch removes this restriction. mysql_truncate() does now handle that case. @ mysql-test/r/merge.result Bug#20667 - Truncate table fails for a write locked table Updated test result. @ mysql-test/r/truncate.result Bug#20667 - Truncate table fails for a write locked table Updated test result. @ mysql-test/r/truncate_coverage.result Bug#20667 - Truncate table fails for a write locked table New test result. @ mysql-test/t/merge.test Bug#20667 - Truncate table fails for a write locked table Updated test case due to now working TRUNCATE under LOCK TABLES. Added some SELECTs to show that child tables are truncated. @ mysql-test/t/truncate.test Bug#20667 - Truncate table fails for a write locked table Added test cases for TRUNCATE under LOCK TABLE. @ mysql-test/t/truncate_coverage.test Bug#20667 - Truncate table fails for a write locked table New test file. Coverage tests for TRUNCATE. @ sql/sql_delete.cc Bug#20667 - Truncate table fails for a write locked table Added branches for thd->locked_tables_mode. @ sql/sql_parse.cc Bug#20667 - Truncate table fails for a write locked table Deleted rejection of TRUNCATE in case of LOCK TABLES. added: mysql-test/r/truncate_coverage.result mysql-test/t/truncate_coverage.test modified: mysql-test/r/merge.result mysql-test/r/truncate.result mysql-test/t/merge.test mysql-test/t/truncate.test sql/sql_delete.cc sql/sql_parse.cc === modified file 'mysql-test/r/merge.result' --- a/mysql-test/r/merge.result 2009-04-22 10:02:28 +0000 +++ b/mysql-test/r/merge.result 2009-07-21 16:53:40 +0000 @@ -1053,18 +1053,21 @@ c1 LOCK TABLE t1 WRITE, t2 WRITE, t3 WRITE; INSERT INTO t1 VALUES (1); TRUNCATE TABLE t3; -ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 -1 -2 +UNLOCK TABLES; +SELECT * FROM t1; +c1 +SELECT * FROM t2; +c1 # # Truncate child table under locked tables. +LOCK TABLE t1 WRITE, t2 WRITE, t3 WRITE; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (2); TRUNCATE TABLE t1; -ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 -1 2 UNLOCK TABLES; DROP TABLE t1, t2, t3; @@ -1096,18 +1099,24 @@ INSERT INTO t1 VALUES (1); CREATE TABLE t4 (c1 INT, INDEX(c1)); LOCK TABLE t4 WRITE; TRUNCATE TABLE t3; -ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 -1 -2 +SELECT * FROM t1; +c1 +SELECT * FROM t2; +c1 # # Truncate temporary child table under locked tables. +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (2); TRUNCATE TABLE t1; -ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 -1 +2 +SELECT * FROM t1; +c1 +SELECT * FROM t2; +c1 2 UNLOCK TABLES; DROP TABLE t1, t2, t3, t4; === modified file 'mysql-test/r/truncate.result' --- a/mysql-test/r/truncate.result 2007-04-17 10:32:01 +0000 +++ b/mysql-test/r/truncate.result 2009-07-21 16:53:40 +0000 @@ -1,4 +1,4 @@ -drop table if exists t1; +drop table if exists t1, t2; create table t1 (a integer, b integer,c1 CHAR(10)); insert into t1 (a) values (1),(2); truncate table t1; @@ -60,3 +60,89 @@ truncate table v1; ERROR 42S02: Table 'test.v1' doesn't exist drop view v1; drop table t1; +# +# Bug#20667 - Truncate table fails for a write locked table +# +CREATE TABLE t1 (c1 INT); +LOCK TABLE t1 WRITE; +INSERT INTO t1 VALUES (1); +SELECT * FROM t1; +c1 +1 +TRUNCATE TABLE t1; +SELECT * FROM t1; +c1 +UNLOCK TABLES; +LOCK TABLE t1 READ; +TRUNCATE TABLE t1; +ERROR HY000: Table 't1' was locked with a READ lock and can't be updated +UNLOCK TABLES; +CREATE TABLE t2 (c1 INT); +LOCK TABLE t2 WRITE; +TRUNCATE TABLE t1; +ERROR HY000: Table 't1' was not locked with LOCK TABLES +UNLOCK TABLES; +CREATE VIEW v1 AS SELECT t1.c1 FROM t1,t2 WHERE t1.c1 = t2.c1; +INSERT INTO t1 VALUES (1), (2), (3); +INSERT INTO t2 VALUES (1), (3), (4); +SELECT * FROM v1; +c1 +1 +3 +TRUNCATE v1; +ERROR 42S02: Table 'test.v1' doesn't exist +SELECT * FROM v1; +c1 +1 +3 +LOCK TABLE t1 WRITE; +SELECT * FROM v1; +ERROR HY000: Table 'v1' was not locked with LOCK TABLES +TRUNCATE v1; +ERROR 42S02: Table 'test.v1' doesn't exist +SELECT * FROM v1; +ERROR HY000: Table 'v1' was not locked with LOCK TABLES +UNLOCK TABLES; +LOCK TABLE t1 WRITE, t2 WRITE; +SELECT * FROM v1; +ERROR HY000: Table 'v1' was not locked with LOCK TABLES +TRUNCATE v1; +ERROR 42S02: Table 'test.v1' doesn't exist +SELECT * FROM v1; +ERROR HY000: Table 'v1' was not locked with LOCK TABLES +UNLOCK TABLES; +LOCK TABLE v1 WRITE; +SELECT * FROM v1; +c1 +1 +3 +TRUNCATE v1; +ERROR 42S02: Table 'test.v1' doesn't exist +SELECT * FROM v1; +c1 +1 +3 +UNLOCK TABLES; +LOCK TABLE t1 WRITE, t2 WRITE, v1 WRITE; +SELECT * FROM v1; +c1 +1 +3 +TRUNCATE v1; +ERROR 42S02: Table 'test.v1' doesn't exist +SELECT * FROM v1; +c1 +1 +3 +UNLOCK TABLES; +DROP VIEW v1; +DROP TABLE t1, t2; +CREATE PROCEDURE p1() SET @a = 5; +TRUNCATE p1; +ERROR 42S02: Table 'test.p1' doesn't exist +SHOW CREATE PROCEDURE p1; +Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation +p1 CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`() +SET @a = 5 latin1 latin1_swedish_ci latin1_swedish_ci +DROP PROCEDURE p1; +# End of 6.0 tests === added file 'mysql-test/r/truncate_coverage.result' --- a/mysql-test/r/truncate_coverage.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/truncate_coverage.result 2009-07-21 16:53:40 +0000 @@ -0,0 +1,70 @@ +SET DEBUG_SYNC='RESET'; +DROP TABLE IF EXISTS t1; +# +# Bug#20667 - Truncate table fails for a write locked table +# +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1); +# +# connection con1 +START TRANSACTION; +INSERT INTO t1 VALUES (2); +# +# connection default +LOCK TABLE t1 WRITE; +SET DEBUG_SYNC='mdl_upgrade_shared_lock_to_exclusive SIGNAL waiting'; +TRUNCATE TABLE t1; +# +# connection con1 +SET DEBUG_SYNC='now WAIT_FOR waiting'; +KILL QUERY @id; +COMMIT; +# +# connection default +ERROR 70100: Query execution was interrupted +UNLOCK TABLES; +DROP TABLE t1; +SET DEBUG_SYNC='RESET'; +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1); +# +# connection con1 +START TRANSACTION; +INSERT INTO t1 VALUES (2); +# +# connection default +LOCK TABLE t1 WRITE; +SET DEBUG_SYNC='mdl_upgrade_shared_lock_to_exclusive SIGNAL waiting'; +TRUNCATE TABLE t1; +# +# connection con1 +SET DEBUG_SYNC='now WAIT_FOR waiting'; +COMMIT; +# +# connection default +ERROR 42S02: Table 'test.t1' doesn't exist +UNLOCK TABLES; +DROP TABLE t1; +ERROR 42S02: Unknown table 't1' +SET DEBUG_SYNC='RESET'; +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1); +# +# connection con1 +START TRANSACTION; +INSERT INTO t1 VALUES (2); +# +# connection default +SET DEBUG_SYNC='mdl_acquire_exclusive_locks_wait SIGNAL waiting'; +TRUNCATE TABLE t1; +# +# connection con1 +SET DEBUG_SYNC='now WAIT_FOR waiting'; +KILL QUERY @id; +COMMIT; +# +# connection default +ERROR 70100: Query execution was interrupted +UNLOCK TABLES; +DROP TABLE t1; +SET DEBUG_SYNC='RESET'; === modified file 'mysql-test/t/merge.test' --- a/mysql-test/t/merge.test 2009-04-22 10:02:28 +0000 +++ b/mysql-test/t/merge.test 2009-07-21 16:53:40 +0000 @@ -688,12 +688,16 @@ SELECT * FROM t3; --echo # Truncate MERGE table under locked tables. LOCK TABLE t1 WRITE, t2 WRITE, t3 WRITE; INSERT INTO t1 VALUES (1); ---error ER_LOCK_OR_ACTIVE_TRANSACTION TRUNCATE TABLE t3; SELECT * FROM t3; +UNLOCK TABLES; +SELECT * FROM t1; +SELECT * FROM t2; --echo # --echo # Truncate child table under locked tables. ---error ER_LOCK_OR_ACTIVE_TRANSACTION +LOCK TABLE t1 WRITE, t2 WRITE, t3 WRITE; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (2); TRUNCATE TABLE t1; SELECT * FROM t3; UNLOCK TABLES; @@ -719,14 +723,18 @@ SELECT * FROM t3; INSERT INTO t1 VALUES (1); CREATE TABLE t4 (c1 INT, INDEX(c1)); LOCK TABLE t4 WRITE; ---error ER_LOCK_OR_ACTIVE_TRANSACTION TRUNCATE TABLE t3; SELECT * FROM t3; +SELECT * FROM t1; +SELECT * FROM t2; --echo # --echo # Truncate temporary child table under locked tables. ---error ER_LOCK_OR_ACTIVE_TRANSACTION +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (2); TRUNCATE TABLE t1; SELECT * FROM t3; +SELECT * FROM t1; +SELECT * FROM t2; UNLOCK TABLES; DROP TABLE t1, t2, t3, t4; === modified file 'mysql-test/t/truncate.test' --- a/mysql-test/t/truncate.test 2007-04-17 10:32:01 +0000 +++ b/mysql-test/t/truncate.test 2009-07-21 16:53:40 +0000 @@ -2,7 +2,7 @@ # Test of truncate # --disable_warnings -drop table if exists t1; +drop table if exists t1, t2; --enable_warnings create table t1 (a integer, b integer,c1 CHAR(10)); @@ -69,3 +69,76 @@ drop table t1; # End of 5.0 tests +--echo # +--echo # Bug#20667 - Truncate table fails for a write locked table +--echo # +CREATE TABLE t1 (c1 INT); +LOCK TABLE t1 WRITE; +INSERT INTO t1 VALUES (1); +SELECT * FROM t1; +TRUNCATE TABLE t1; +SELECT * FROM t1; +UNLOCK TABLES; +# +LOCK TABLE t1 READ; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +TRUNCATE TABLE t1; +UNLOCK TABLES; +# +CREATE TABLE t2 (c1 INT); +LOCK TABLE t2 WRITE; +--error ER_TABLE_NOT_LOCKED +TRUNCATE TABLE t1; +UNLOCK TABLES; +# +CREATE VIEW v1 AS SELECT t1.c1 FROM t1,t2 WHERE t1.c1 = t2.c1; +INSERT INTO t1 VALUES (1), (2), (3); +INSERT INTO t2 VALUES (1), (3), (4); +SELECT * FROM v1; +--error ER_NO_SUCH_TABLE +TRUNCATE v1; +SELECT * FROM v1; +# +LOCK TABLE t1 WRITE; +--error ER_TABLE_NOT_LOCKED +SELECT * FROM v1; +--error ER_NO_SUCH_TABLE +TRUNCATE v1; +--error ER_TABLE_NOT_LOCKED +SELECT * FROM v1; +UNLOCK TABLES; +# +LOCK TABLE t1 WRITE, t2 WRITE; +--error ER_TABLE_NOT_LOCKED +SELECT * FROM v1; +--error ER_NO_SUCH_TABLE +TRUNCATE v1; +--error ER_TABLE_NOT_LOCKED +SELECT * FROM v1; +UNLOCK TABLES; +# +LOCK TABLE v1 WRITE; +SELECT * FROM v1; +--error ER_NO_SUCH_TABLE +TRUNCATE v1; +SELECT * FROM v1; +UNLOCK TABLES; +# +LOCK TABLE t1 WRITE, t2 WRITE, v1 WRITE; +SELECT * FROM v1; +--error ER_NO_SUCH_TABLE +TRUNCATE v1; +SELECT * FROM v1; +UNLOCK TABLES; +# +DROP VIEW v1; +DROP TABLE t1, t2; +# +CREATE PROCEDURE p1() SET @a = 5; +--error ER_NO_SUCH_TABLE +TRUNCATE p1; +SHOW CREATE PROCEDURE p1; +DROP PROCEDURE p1; + +--echo # End of 6.0 tests + === added file 'mysql-test/t/truncate_coverage.test' --- a/mysql-test/t/truncate_coverage.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/truncate_coverage.test 2009-07-21 16:53:40 +0000 @@ -0,0 +1,155 @@ +# +# Code coverage testing of TRUNCATE TABLE. +# +# Ingo Struewing, 2009-07-20 +# + +--source include/have_debug_sync.inc +SET DEBUG_SYNC='RESET'; + +--let $MYSQLD_DATADIR= `SELECT @@datadir` + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +--echo # +--echo # Bug#20667 - Truncate table fails for a write locked table +--echo # +######## +# Attack wait_while_table_is_used(). Kill query while trying to +# upgrade MDL. +# +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1); +# +# Start a transaction and execute a DML in it. Since 5.4.4 this leaves +# a shared meta data lock (MDL) behind. TRUNCATE shall block on it. +# +--echo # +--echo # connection con1 +--connect (con1, localhost, root,,) +START TRANSACTION; +INSERT INTO t1 VALUES (2); +# +# Get connection id of default connection. +# Lock the table and start TRUNCATE, which will block on MDL upgrade. +# +--echo # +--echo # connection default +--connection default +let $ID= `SELECT @id := CONNECTION_ID()`; +LOCK TABLE t1 WRITE; +SET DEBUG_SYNC='mdl_upgrade_shared_lock_to_exclusive SIGNAL waiting'; +send TRUNCATE TABLE t1; +# +# Get the default connection ID into a variable in an invisible statement. +# Kill the TRUNCATE query. This shall result in an error return +# from wait_while_table_is_used(). +# +--echo # +--echo # connection con1 +--connection con1 +SET DEBUG_SYNC='now WAIT_FOR waiting'; +let $invisible_assignment_in_select = `SELECT @id := $ID`; +KILL QUERY @id; +COMMIT; +--disconnect con1 +--echo # +--echo # connection default +--connection default +--error ER_QUERY_INTERRUPTED +reap; +UNLOCK TABLES; +DROP TABLE t1; +SET DEBUG_SYNC='RESET'; +######## +# Attack reopen_tables(). Remove form file. +# +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1); +# +# Start a transaction and execute a DML in it. Since 5.4.4 this leaves +# a shared meta data lock (MDL) behind. TRUNCATE shall block on it. +# +--echo # +--echo # connection con1 +--connect (con1, localhost, root,,) +START TRANSACTION; +INSERT INTO t1 VALUES (2); +# +# Lock the table and start TRUNCATE, which will block on MDL upgrade. +# +--echo # +--echo # connection default +--connection default +LOCK TABLE t1 WRITE; +SET DEBUG_SYNC='mdl_upgrade_shared_lock_to_exclusive SIGNAL waiting'; +send TRUNCATE TABLE t1; +# +# Remove datafile. +# Commit to let TRUNCATE continue. +# +--echo # +--echo # connection con1 +--connection con1 +SET DEBUG_SYNC='now WAIT_FOR waiting'; +--remove_file $MYSQLD_DATADIR/test/t1.frm +COMMIT; +--disconnect con1 +--echo # +--echo # connection default +--connection default +--error ER_NO_SUCH_TABLE +reap; +UNLOCK TABLES; +--error ER_BAD_TABLE_ERROR +DROP TABLE t1; +SET DEBUG_SYNC='RESET'; +######## +# Attack acquire_exclusive_locks(). Hold a global read lock. +# Non-LOCK TABLE case. +# +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1); +# +# Start a transaction and execute a DML in it. Since 5.4.4 this leaves +# a shared meta data lock (MDL) behind. TRUNCATE shall block on it. +# +--echo # +--echo # connection con1 +--connect (con1, localhost, root,,) +START TRANSACTION; +INSERT INTO t1 VALUES (2); +# +# Get connection id of default connection. +# Start TRUNCATE, which will block on acquire_exclusive_locks(). +# +--echo # +--echo # connection default +--connection default +let $ID= `SELECT @id := CONNECTION_ID()`; +SET DEBUG_SYNC='mdl_acquire_exclusive_locks_wait SIGNAL waiting'; +send TRUNCATE TABLE t1; +# +# Get the default connection ID into a variable in an invisible statement. +# Kill the TRUNCATE query. This shall result in an error return +# from wait_while_table_is_used(). +# +--echo # +--echo # connection con1 +--connection con1 +SET DEBUG_SYNC='now WAIT_FOR waiting'; +let $invisible_assignment_in_select = `SELECT @id := $ID`; +KILL QUERY @id; +COMMIT; +--disconnect con1 +--echo # +--echo # connection default +--connection default +--error ER_QUERY_INTERRUPTED +reap; +UNLOCK TABLES; +DROP TABLE t1; +SET DEBUG_SYNC='RESET'; + === modified file 'sql/sql_delete.cc' --- a/sql/sql_delete.cc 2009-06-19 09:28:44 +0000 +++ b/sql/sql_delete.cc 2009-07-21 16:53:40 +0000 @@ -1081,9 +1081,15 @@ bool mysql_truncate(THD *thd, TABLE_LIST HA_CREATE_INFO create_info; char path[FN_REFLEN + 1]; TABLE *table; - bool error; + bool error= TRUE; uint path_length; MDL_request *mdl_request= NULL; + /* + Is set if we're under LOCK TABLES, and used + to downgrade the exclusive lock after the + table was truncated. + */ + MDL_ticket *mdl_ticket= NULL; Ha_global_schema_lock_guard global_schema_lock_guard(thd); DBUG_ENTER("mysql_truncate"); @@ -1129,6 +1135,12 @@ bool mysql_truncate(THD *thd, TABLE_LIST if (!dont_send_ok) { enum legacy_db_type table_type; + /* + FIXME: Code of TRUNCATE breaks the meta-data + locking protocol since it tries to find out the table storage + engine and therefore accesses table in some way without holding + any kind of meta-data lock. + */ mysql_frm_type(thd, path, &table_type); if (table_type == DB_TYPE_UNKNOWN) { @@ -1143,24 +1155,47 @@ bool mysql_truncate(THD *thd, TABLE_LIST if (table_type == DB_TYPE_NDBCLUSTER) global_schema_lock_guard.lock(); - /* - FIXME: Actually code of TRUNCATE breaks meta-data locking protocol since - tries to get table enging and therefore accesses table in some way - without holding any kind of meta-data lock. - */ - mdl_request= MDL_request::create(0, table_list->db, - table_list->table_name, thd->mem_root); - mdl_request->set_type(MDL_EXCLUSIVE); - thd->mdl_context.add_request(mdl_request); - if (thd->mdl_context.acquire_exclusive_locks()) + + mysql_ha_rm_tables(thd, table_list); + + if (thd->locked_tables_mode) { - thd->mdl_context.remove_request(mdl_request); - DBUG_RETURN(TRUE); + if (!(table= find_write_locked_table(thd->open_tables, table_list->db, + table_list->table_name))) + DBUG_RETURN(TRUE); + mdl_ticket= table->mdl_ticket; + if (wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN)) + goto end; + close_all_tables_for_name(thd, table->s, FALSE); + } + else + { + /* + Even though we could use the previous execution branch + here just as well, we must not try to open the table: + MySQL manual documents that TRUNCATE can be used to + repair a damaged table, i.e. a table that can not be + fully "opened". In particular MySQL manual says: + + As long as the table format file tbl_name.frm is valid, + the table can be re-created as an empty table with TRUNCATE + TABLE, even if the data or index files have become corrupted. + */ + + mdl_request= MDL_request::create(0, table_list->db, + table_list->table_name, thd->mem_root); + mdl_request->set_type(MDL_EXCLUSIVE); + thd->mdl_context.add_request(mdl_request); + if (thd->mdl_context.acquire_exclusive_locks()) + { + thd->mdl_context.remove_request(mdl_request); + DBUG_RETURN(TRUE); + } + pthread_mutex_lock(&LOCK_open); + tdc_remove_table(thd, TDC_RT_REMOVE_ALL, table_list->db, + table_list->table_name); + pthread_mutex_unlock(&LOCK_open); } - pthread_mutex_lock(&LOCK_open); - tdc_remove_table(thd, TDC_RT_REMOVE_ALL, table_list->db, - table_list->table_name); - pthread_mutex_unlock(&LOCK_open); } /* @@ -1178,6 +1213,12 @@ bool mysql_truncate(THD *thd, TABLE_LIST end: if (!dont_send_ok) { + if (thd->locked_tables_mode && thd->locked_tables_list.reopen_tables(thd)) + thd->locked_tables_list.unlink_all_closed_tables(); + /* + Even if we failed to reopen some tables, + the operation itself succeeded, write the binlog. + */ if (!error) { /* @@ -1192,15 +1233,10 @@ end: thd->mdl_context.release_lock(mdl_request->ticket); thd->mdl_context.remove_request(mdl_request); } + if (mdl_ticket) + mdl_ticket->downgrade_exclusive_lock(); } - else if (error) - { - if (mdl_request) - { - thd->mdl_context.release_lock(mdl_request->ticket); - thd->mdl_context.remove_request(mdl_request); - } - } + DBUG_PRINT("exit", ("error: %d", error)); DBUG_RETURN(error); trunc_by_del: === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2009-07-10 12:31:32 +0000 +++ b/sql/sql_parse.cc 2009-07-21 16:53:40 +0000 @@ -3316,7 +3316,7 @@ end_with_restore_list: Don't allow this within a transaction because we want to use re-generate table */ - if (thd->locked_tables_mode || thd->active_transaction()) + if (thd->active_transaction()) { my_message(ER_LOCK_OR_ACTIVE_TRANSACTION, ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0)); --Boundary_(ID_xZQI8uF5IUm2dmKa121ZZg) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/ingo.struewing@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/ingo.struewing@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: ingo.struewing@stripped # target_branch: file:///home2/mydev/bzrroot/mysql-6.0-bug20667-2/ # testament_sha1: f8535ac67c7231848ac78f5acf02016e4952b3a1 # timestamp: 2009-07-21 18:53:45 +0200 # source_branch: file:///home2/mydev/bzrroot/mysql-6.0-backup/ # base_revision_id: hema@stripped # # Begin bundle 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 COX/4u5IpwoSHbdgsOA= --Boundary_(ID_xZQI8uF5IUm2dmKa121ZZg)--