From: Konstantin Osipov Date: December 11 2009 12:13pm Subject: bzr commit into mysql-5.6-next-mr branch (kostja:3032) Bug#20667 List-Archive: http://lists.mysql.com/commits/93678 X-Bug: 20667 Message-Id: <20091211121352.54E9E1E3E74@ibbur.local> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_EaGHP7OmCMeY/EHy7eTW7g)" --Boundary_(ID_EaGHP7OmCMeY/EHy7eTW7g) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///opt/local/work/next-4284/ based on revid:kostja@stripped 3032 Konstantin Osipov 2009-12-11 Backport: ------------------------------------------------------------ 2599.161.3 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-12-10 10:53:20 +0000 +++ b/mysql-test/r/merge.result 2009-12-11 12:13:37 +0000 @@ -1046,18 +1046,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; @@ -1089,18 +1092,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 2009-12-09 09:29:36 +0000 +++ b/mysql-test/r/truncate.result 2009-12-11 12:13:37 +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; @@ -61,6 +61,91 @@ ERROR 42S02: Table 'test.v1' doesn't exi 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; +# # Bug#46452 Crash in MDL, HANDLER OPEN + TRUNCATE TABLE # DROP TABLE IF EXISTS t1; === 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-12-11 12:13:37 +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-12-10 10:53:20 +0000 +++ b/mysql-test/t/merge.test 2009-12-11 12:13:37 +0000 @@ -675,12 +675,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; @@ -706,14 +710,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 2009-12-09 09:29:36 +0000 +++ b/mysql-test/t/truncate.test 2009-12-11 12:13:37 +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)); @@ -70,6 +70,77 @@ 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 # --echo # Bug#46452 Crash in MDL, HANDLER OPEN + TRUNCATE TABLE --echo # --disable_warnings === 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-12-11 12:13:37 +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-12-10 08:21:38 +0000 +++ b/sql/sql_delete.cc 2009-12-11 12:13:37 +0000 @@ -1098,9 +1098,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; + /* + 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; bool has_mdl_lock= FALSE; DBUG_ENTER("mysql_truncate"); @@ -1119,7 +1125,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST goto trunc_by_del; table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK); - + close_temporary_table(thd, table, 0, 0); // Don't free share ha_create_table(thd, share->normalized_path.str, share->db.str, share->table_name.str, &create_info, 1); @@ -1177,21 +1183,47 @@ bool mysql_truncate(THD *thd, TABLE_LIST thd->lex->alter_info.flags & ALTER_ADMIN_PARTITION) goto trunc_by_del; - mdl_request.init(MDL_key::TABLE, table_list->db, table_list->table_name, MDL_EXCLUSIVE); - if (thd->mdl_context.acquire_exclusive_lock(&mdl_request)) - DBUG_RETURN(TRUE); - has_mdl_lock= 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); + if (thd->locked_tables_mode) + { + 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.init(MDL_key::TABLE, table_list->db, table_list->table_name, + MDL_EXCLUSIVE); + if (thd->mdl_context.acquire_exclusive_lock(&mdl_request)) + DBUG_RETURN(TRUE); + has_mdl_lock= 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); + } } - // Remove the .frm extension AIX 5.2 64-bit compiler bug (BUG#16155): this - // crashes, replacement works. *(path + path_length - reg_ext_length)= - // '\0'; + /* + Remove the .frm extension AIX 5.2 64-bit compiler bug (BUG#16155): this + crashes, replacement works. *(path + path_length - reg_ext_length)= + '\0'; + */ path[path_length - reg_ext_length] = 0; pthread_mutex_lock(&LOCK_open); error= ha_create_table(thd, path, table_list->db, table_list->table_name, @@ -1202,6 +1234,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(thd, NULL, 0); + /* + Even if we failed to reopen some tables, + the operation itself succeeded, write the binlog. + */ if (!error) { /* @@ -1213,12 +1251,11 @@ end: } if (has_mdl_lock) thd->mdl_context.release_lock(mdl_request.ticket); + if (mdl_ticket) + mdl_ticket->downgrade_exclusive_lock(); } - else if (error) - { - if (has_mdl_lock) - thd->mdl_context.release_lock(mdl_request.ticket); - } + + DBUG_PRINT("exit", ("error: %d", error)); DBUG_RETURN(error); trunc_by_del: === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2009-12-10 14:09:00 +0000 +++ b/sql/sql_parse.cc 2009-12-11 12:13:37 +0000 @@ -3078,7 +3078,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_EaGHP7OmCMeY/EHy7eTW7g) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/kostja@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/kostja@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kostja@stripped # target_branch: file:///opt/local/work/next-4284/ # testament_sha1: c67a112883ce4879a2507388afccfc3f2d64d1ad # timestamp: 2009-12-11 15:13:51 +0300 # source_branch: file:///home/kostja/work/6.0-codebase/ # base_revision_id: kostja@stripped # # Begin bundle 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 --Boundary_(ID_EaGHP7OmCMeY/EHy7eTW7g)--