From: Ingo Struewing Date: June 18 2009 2:28pm Subject: bzr commit into mysql-6.0-backup branch (ingo.struewing:2825) Bug#20667 List-Archive: http://lists.mysql.com/commits/76579 X-Bug: 20667 Message-Id: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_FL8b8lVWQeEiMwnNb7ydPQ)" --Boundary_(ID_FL8b8lVWQeEiMwnNb7ydPQ) 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-1/ based on revid:charles.bell@stripped 2825 Ingo Struewing 2009-06-18 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_class.cc Bug#20667 - Truncate table fails for a write locked table Added implementation for Locked_tables_list::get_table(). @ sql/sql_class.h Bug#20667 - Truncate table fails for a write locked table Added declaration for Locked_tables_list::get_table(). @ sql/sql_delete.cc Bug#20667 - Truncate table fails for a write locked table Added two 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_class.cc sql/sql_class.h 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-06-18 14:28:23 +0000 @@ -1053,15 +1053,20 @@ 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 +ERROR HY000: MyISAM table 't1' is in use (most likely by a MERGE table). Try FLUSH TABLES. SELECT * FROM t3; c1 1 @@ -1096,18 +1101,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-06-18 14:28:23 +0000 @@ -60,3 +60,18 @@ 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; +DROP TABLE t1; +# 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-06-18 14:28:23 +0000 @@ -688,12 +688,17 @@ 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); +--error ER_UNKNOWN_ERROR TRUNCATE TABLE t1; SELECT * FROM t3; UNLOCK TABLES; @@ -719,14 +724,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-06-18 14:28:23 +0000 @@ -69,3 +69,17 @@ 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; +DROP TABLE t1; + +--echo # End of 6.0 tests + === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2009-06-12 02:01:08 +0000 +++ b/sql/sql_class.cc 2009-06-18 14:28:23 +0000 @@ -434,6 +434,36 @@ bool Drop_table_error_handler::handle_co } +/** + Find a table in the list of locked tables. + + @param[in] db database name + @param[in] table_name table name + + @return table pointer + @retval NULL error +*/ + +TABLE *Locked_tables_list::get_table(const char *db, + const char *table_name) +{ + TABLE_LIST *tlist; + + for (tlist= m_locked_tables; tlist; tlist= tlist->next_global) + { + if (!(lower_case_table_names ? + my_strcasecmp(system_charset_info, db, tlist->db) : + strcmp(db, tlist->db)) && + !(lower_case_table_names ? + my_strcasecmp(system_charset_info, table_name, tlist->table_name) : + strcmp(db, tlist->db))) + break; + } + + return tlist ? tlist->table : NULL; +} + + THD::THD() :Statement(&main_lex, &main_mem_root, CONVENTIONAL_EXECUTION, /* statement id */ 0), === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2009-06-12 02:01:08 +0000 +++ b/sql/sql_class.h 2009-06-18 14:28:23 +0000 @@ -1251,6 +1251,7 @@ public: bool remove_from_locked_tables); void unlink_all_closed_tables(); bool reopen_tables(THD *thd); + TABLE *get_table(const char *db, const char *table_name); }; === modified file 'sql/sql_delete.cc' --- a/sql/sql_delete.cc 2009-05-31 12:05:01 +0000 +++ b/sql/sql_delete.cc 2009-06-18 14:28:23 +0000 @@ -1143,24 +1143,36 @@ 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()) + + if (thd->locked_tables_mode) { - thd->mdl_context.remove_request(mdl_request); - DBUG_RETURN(TRUE); + table= thd->locked_tables_list.get_table(table_list->db, + table_list->table_name); + if (!table || wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN)) + DBUG_RETURN(TRUE); + close_all_tables_for_name(thd, table->s, FALSE); + } + else + { + /* + 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()) + { + 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); } /* @@ -1187,7 +1199,12 @@ end: write_bin_log(thd, TRUE, thd->query, thd->query_length); my_ok(thd); // This should return record count } - if (mdl_request) + if (thd->locked_tables_mode) + { + if (thd->locked_tables_list.reopen_tables(thd)) + error= TRUE; + } + else if (mdl_request) { thd->mdl_context.release_lock(mdl_request->ticket); thd->mdl_context.remove_request(mdl_request); === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2009-06-12 02:01:08 +0000 +++ b/sql/sql_parse.cc 2009-06-18 14:28:23 +0000 @@ -3376,7 +3376,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_FL8b8lVWQeEiMwnNb7ydPQ) 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-1/ # testament_sha1: 4ef53096623e62d6e835d21b20b0b16bfb7e3516 # timestamp: 2009-06-18 16:28:29 +0200 # base_revision_id: charles.bell@stripped\ # 1fha9uiwcqasiotj # # Begin bundle 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 --Boundary_(ID_FL8b8lVWQeEiMwnNb7ydPQ)--