From: Dmitry Lenev Date: April 13 2011 6:16am Subject: bzr commit into mysql-5.5 branch (Dmitry.Lenev:3439) Bug#11938039 List-Archive: http://lists.mysql.com/commits/135306 X-Bug: 11938039 Message-Id: <20110413061648.52D6374065D@bandersnatch> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1485380746==" --===============1485380746== 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:sven.sandberg@stripped 3439 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 06:16:40 +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 06:16:40 +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 06:16:40 +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; --===============1485380746== 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: d241433976f46066a2e7e655ac326cb63c6e93f1 # timestamp: 2011-04-13 10:16:48 +0400 # base_revision_id: sven.sandberg@stripped\ # o4bc3ospp5016hco # # Begin bundle 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 --===============1485380746==--