From: Ingo Struewing Date: June 19 2009 2:45pm Subject: bzr commit into mysql-6.0-backup branch (ingo.struewing:2825) Bug#20667 List-Archive: http://lists.mysql.com/commits/76717 X-Bug: 20667 Message-Id: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_TZibqmRjKcpQQEDi9GblkQ)" --Boundary_(ID_TZibqmRjKcpQQEDi9GblkQ) 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-19 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-19 14:45:15 +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-06-19 14:45:15 +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-06-19 14:45:15 +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-06-19 14:45:15 +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_class.cc' --- a/sql/sql_class.cc 2009-06-12 02:01:08 +0000 +++ b/sql/sql_class.cc 2009-06-19 14:45:15 +0000 @@ -434,6 +434,41 @@ 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; + DBUG_ENTER("Locked_tables_list::get_table"); + DBUG_PRINT("enter", ("search: '%s'.'%s'", db, table_name)); + + for (tlist= m_locked_tables; tlist; tlist= tlist->next_global) + { + DBUG_PRINT("thd", ("tlist: '%s'.'%s' lock_type: %u", + tlist->db, tlist->table_name, tlist->lock_type)); + 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(table_name, tlist->table_name))) + break; + } + + DBUG_PRINT("exit", (tlist ? "match" : "not found")); + DBUG_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-19 14:45:15 +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-19 14:45:15 +0000 @@ -1143,24 +1143,46 @@ 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) + { + my_error(ER_TABLE_NOT_LOCKED, MYF(0), table_list->table_name); + DBUG_RETURN(TRUE); + } + if (table->reginfo.lock_type != TL_WRITE) + { + my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE, MYF(0), table_list->table_name); + DBUG_RETURN(TRUE); + } + if (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 +1209,16 @@ 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; + table= thd->locked_tables_list.get_table(table_list->db, + table_list->table_name); + if (table) + table->mdl_ticket->downgrade_exclusive_lock(); + } + 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-19 14:45:15 +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_TZibqmRjKcpQQEDi9GblkQ) 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: 12f42bfa5b918fd2bd10756f8b4728f31d234cb4 # timestamp: 2009-06-19 16:45:22 +0200 # source_branch: file:///home2/mydev/bzrroot/mysql-6.0-backup/ # base_revision_id: charles.bell@stripped\ # 1fha9uiwcqasiotj # # Begin bundle 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 --Boundary_(ID_TZibqmRjKcpQQEDi9GblkQ)--