From: Konstantin Osipov Date: December 11 2009 12:24pm Subject: bzr commit into mysql-5.6-next-mr branch (kostja:3032) Bug#20667 List-Archive: http://lists.mysql.com/commits/93679 X-Bug: 20667 Message-Id: <20091211122429.1DE781E3E86@ibbur.local> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_isD3efc90WvhE+KX6Y5Asw)" --Boundary_(ID_isD3efc90WvhE+KX6Y5Asw) 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 of: ------------------------------------------------------------ 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:24:23 +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:24:23 +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:24:23 +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:24:23 +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:24:23 +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:24:23 +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:24:23 +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:24:23 +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_isD3efc90WvhE+KX6Y5Asw) 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: e2a16cd04458bd073135363898a7d7ac8ccb373d # timestamp: 2009-12-11 15:24:29 +0300 # source_branch: file:///home/kostja/work/6.0-codebase/ # base_revision_id: kostja@stripped # # Begin bundle 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 --Boundary_(ID_isD3efc90WvhE+KX6Y5Asw)--