From: Dmitry Lenev Date: April 13 2011 5:43am Subject: bzr commit into mysql-5.5 branch (Dmitry.Lenev:3431) Bug#11938039 List-Archive: http://lists.mysql.com/commits/135305 X-Bug: 11938039 Message-Id: <20110413054324.C489574065D@bandersnatch> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0779737797==" --===============0779737797== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/dlenev/src/bzr/mysql-5.5-11938039/ based on revid:alexander.barkov@stripped 3431 Dmitry Lenev 2011-04-13 Bug#11938039 "RE-EXECUTION OF FRM-ONLY ALTER TABLE WITH RENAME CLAUSE FAILS OR ABORTS SERVER". Attempt to re-execute prepared ALTER TABLE statement which involves .FRM-only changes and also have RENAME clause led to unwarranted 'Table doesn't exist' error in production builds and assertion failure for debug builds. This problem stemmed from the fact that for such ALTER TABLE mysql_alter_table() code changed table list element for table to be altered when it tried to re-open table under new name. Since this change was not reverted back before next re-execution, it made this statement re-execution unsafe. This fix addresses this problem by avoiding changing table list element from the main table list in such a situation. Instead temporary TABLE_LIST object is used. @ mysql-test/r/alter_table.result Added test case for bug#11938039 "RE-EXECUTION OF FRM-ONLY ALTER TABLE WITH RENAME CLAUSE FAILS OR ABORTS SERVER". @ mysql-test/t/alter_table.test Added test case for bug#11938039 "RE-EXECUTION OF FRM-ONLY ALTER TABLE WITH RENAME CLAUSE FAILS OR ABORTS SERVER". @ sql/sql_table.cc Changed mysql_alter_table() not to modify table list element for the table being altered while re-opening table after .FRM-only changes. Doing this made .FRM-only ALTER TABLE which also had RENAME clause unsafe for re-execution. modified: mysql-test/r/alter_table.result mysql-test/t/alter_table.test sql/sql_table.cc === modified file 'mysql-test/r/alter_table.result' --- a/mysql-test/r/alter_table.result 2011-02-21 11:30:08 +0000 +++ b/mysql-test/r/alter_table.result 2011-04-13 05:43:17 +0000 @@ -1391,3 +1391,16 @@ CREATE DATABASE db1 CHARACTER SET utf8; CREATE TABLE db1.t1 (bar TINYTEXT, KEY (bar(100))); ALTER TABLE db1.t1 ADD baz INT; DROP DATABASE db1; +# +# Bug#11938039 RE-EXECUTION OF FRM-ONLY ALTER TABLE WITH RENAME +# CLAUSE FAILS OR ABORTS SERVER. +# +drop table if exists t1; +create table t1 (a int); +prepare stmt1 from 'alter table t1 alter column a set default 1, rename to t2'; +execute stmt1; +rename table t2 to t1; +# The below statement should succeed and not emit error or abort server. +execute stmt1; +deallocate prepare stmt1; +drop table t2; === modified file 'mysql-test/t/alter_table.test' --- a/mysql-test/t/alter_table.test 2011-02-21 11:30:08 +0000 +++ b/mysql-test/t/alter_table.test 2011-04-13 05:43:17 +0000 @@ -1159,3 +1159,20 @@ CREATE TABLE db1.t1 (bar TINYTEXT, KEY ( ALTER TABLE db1.t1 ADD baz INT; DROP DATABASE db1; + + +--echo # +--echo # Bug#11938039 RE-EXECUTION OF FRM-ONLY ALTER TABLE WITH RENAME +--echo # CLAUSE FAILS OR ABORTS SERVER. +--echo # +--disable_warnings +drop table if exists t1; +--enable_warnings +create table t1 (a int); +prepare stmt1 from 'alter table t1 alter column a set default 1, rename to t2'; +execute stmt1; +rename table t2 to t1; +--echo # The below statement should succeed and not emit error or abort server. +execute stmt1; +deallocate prepare stmt1; +drop table t2; === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2011-03-25 14:03:44 +0000 +++ b/sql/sql_table.cc 2011-04-13 05:43:17 +0000 @@ -6660,15 +6660,15 @@ bool mysql_alter_table(THD *thd,char *ne NO need to tamper with MERGE tables. The real open is done later. */ Open_table_context ot_ctx(thd, MYSQL_OPEN_REOPEN); - TABLE *t_table; + TABLE_LIST temp_table_list; + TABLE_LIST *t_table_list; if (new_name != table_name || new_db != db) { - table_list->alias= new_name; - table_list->table_name= new_name; - table_list->table_name_length= strlen(new_name); - table_list->db= new_db; - table_list->db_length= strlen(new_db); - table_list->mdl_request.ticket= target_mdl_request.ticket; + temp_table_list.init_one_table(new_db, strlen(new_db), + new_name, strlen(new_name), + new_name, TL_READ_NO_INSERT); + temp_table_list.mdl_request.ticket= target_mdl_request.ticket; + t_table_list= &temp_table_list; } else { @@ -6678,20 +6678,21 @@ bool mysql_alter_table(THD *thd,char *ne to request the lock. */ table_list->mdl_request.ticket= mdl_ticket; + t_table_list= table_list; } - if (open_table(thd, table_list, thd->mem_root, &ot_ctx)) + if (open_table(thd, t_table_list, thd->mem_root, &ot_ctx)) { goto err_with_mdl; } - t_table= table_list->table; /* Tell the handler that a new frm file is in place. */ - error= t_table->file->ha_create_handler_files(path, NULL, CHF_INDEX_FLAG, - create_info); + error= t_table_list->table->file->ha_create_handler_files(path, NULL, + CHF_INDEX_FLAG, + create_info); - DBUG_ASSERT(thd->open_tables == t_table); + DBUG_ASSERT(thd->open_tables == t_table_list->table); close_thread_table(thd, &thd->open_tables); - table_list->table= 0; + t_table_list->table= NULL; if (error) goto err_with_mdl; --===============0779737797== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.lenev@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.lenev@stripped # target_branch: file:///home/dlenev/src/bzr/mysql-5.5-11938039/ # testament_sha1: 43fb1de0075d2b285883e7e1656ea680a45c1f8f # timestamp: 2011-04-13 09:43:24 +0400 # base_revision_id: alexander.barkov@stripped\ # 1d7jq0ibki5rmcib # # Begin bundle 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 --===============0779737797==--