From: Ingo Struewing Date: July 20 2009 12:48pm Subject: bzr commit into mysql-5.4 branch (ingo.struewing:2847) Bug#20667 List-Archive: http://lists.mysql.com/commits/79001 X-Bug: 20667 Message-Id: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_Btc396YIuT+qYWX+4K2sow)" --Boundary_(ID_Btc396YIuT+qYWX+4K2sow) 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-20 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/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. @ 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. 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-20 12:48:11 +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-20 12:48:11 +0000 @@ -60,3 +60,28 @@ 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) ENGINE=MyISAM; +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) ENGINE=MyISAM; +LOCK TABLE t2 WRITE; +TRUNCATE TABLE t1; +ERROR HY000: Table 't1' was not locked with LOCK TABLES +UNLOCK TABLES; +DROP TABLE t1; +DROP TABLE t2; +# End of 6.0 tests === 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-20 12:48:11 +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-20 12:48:11 +0000 @@ -69,3 +69,29 @@ 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) ENGINE=MyISAM; +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) ENGINE=MyISAM; +LOCK TABLE t2 WRITE; +--error ER_TABLE_NOT_LOCKED +TRUNCATE TABLE t1; +UNLOCK TABLES; +DROP TABLE t1; +DROP TABLE t2; + +--echo # End of 6.0 tests + === 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-20 12:48:11 +0000 @@ -1084,6 +1084,12 @@ bool mysql_truncate(THD *thd, TABLE_LIST bool error; 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,14 +1233,8 @@ end: thd->mdl_context.release_lock(mdl_request->ticket); thd->mdl_context.remove_request(mdl_request); } - } - else if (error) - { - if (mdl_request) - { - thd->mdl_context.release_lock(mdl_request->ticket); - thd->mdl_context.remove_request(mdl_request); - } + if (mdl_ticket) + mdl_ticket->downgrade_exclusive_lock(); } DBUG_RETURN(error); === 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-20 12:48:11 +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_Btc396YIuT+qYWX+4K2sow) 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: a716e4de665ee8c6dd049abbedd50335cbb13f12 # timestamp: 2009-07-20 14:48:16 +0200 # base_revision_id: hema@stripped # # Begin bundle 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 --Boundary_(ID_Btc396YIuT+qYWX+4K2sow)--