From: Dmitry Lenev Date: April 12 2011 1:13pm Subject: bzr commit into mysql-5.5 branch (Dmitry.Lenev:3431) Bug#11938039 List-Archive: http://lists.mysql.com/commits/135269 X-Bug: 11938039 Message-Id: <20110412131313.663477406AA@bandersnatch> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0188259254==" --===============0188259254== 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-12 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-12 13:13:05 +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-12 13:13:05 +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-12 13:13:05 +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; --===============0188259254== 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: ebca13665e8f5594f9c47c9af4b4c3179cba476d # timestamp: 2011-04-12 17:13:13 +0400 # base_revision_id: alexander.barkov@stripped\ # 1d7jq0ibki5rmcib # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWdlIWnoABIdfgFAQeff//3/n n+C////wYArvn3272t9x68hVIt9Rvu3es1yKPF5PbCnXoHPCSSaaAqfpMTaT0npT9U09TemVD9Uy NAZDQaAGQSUE0MQ0Ep5MoaHqaDIYmgANAAAQp6kZAADE9TQ0ZGjINNNA00BkaABIimmSmNU0PSep k8owmhoD1DIA0PUADQIpFTwQTNGlNk1B6mCaaYg9JkaA0aaBiBJEIyE0xBNkmJoBBEPUDamaj0mj RkPKRI6WRxR2mvhruT1nZO7J7P39SW7YrZ3yRETbXcYPhhxRtDKMIn+6B8TfTdQ2xF+cBEmCn6OJ x7XP1vHMS2OpZRHpY8F46X1ZWkGNHPxZIlJy+B/i+rSusBVCLSAkJjdKZ+Kz9GV6/jhz7z1tzBBE Qhp7ALDTuXzA40vevhnYuzzaY361VHZrVhAQ7YRTQfvb50aujvWfM6HcyPuQ9XTp/VHzRkfgjpdF GsClNRqRyMPQ7aIqKyL9ah6pa/+QU5Jv3E0cxHUeOVSEGD0MsSLOynYDycsDB+BAdJ/4GaSgiT22 Wf3jUanldOSpQUFURpZU8rSNYMXDDTuMtswJl5bdELig44xVyKtT/4NzjGogMIDqzGBiLGV5GM72 wLO4OHMJ4QdCpvEXb78JOeUyyjdDnWWRerBPqThLmcMMzM2pDFOoCGvSAhIjirH2bu7WDMn2YkZw TJYRQyGkaDITT7iFUR0mG0MRd4Bx0KFCS9Efmj3i+SVQS7VqWMIwEUMqKJxPbK1ajzXp7J93gRIQ 13+T1kOZnfRToJF9DKoQ0RDE1W8pSULwbhqmksWWDK/i7bheSrFb6lhooqqqAQKMgmUaz/CK0Fll C0YFCwjDE5YLGZypbq06LFE5kTArKiVWFR9FkkRjsIX4uWkQcz+clpEamCWox5NVQBW0IW3jBoZD ehHYjLGBvLLNQhquEwZY4yrqIMKahGAjRQIU186M1ozmmbLliKD+FvH4d3xEZExZp3o27tEYrcQj mOYqBRbIIKRGOZn9C/sq2SML+ER+3ILlrEjNrKAwjErdcDuHFM4610vkcyVU7S0YTHB126UFiMWa t+Fa+1TVtq0wt3PQffLjguE0LJEx0Ldr1bS1SK5l6e2pXSueJuEEWjMtpIa2hw6sVs4ObTRNJ0up mxzJPsGw1k06JDiGqjE46jyIamm3Zw7I9o0g3ncoh2EhhbW+mG/yHIrtU4qYiWyrNxJ1FC/o4jXw wE6BPurbFMYVLVv49TzXeowERkTmXauPXbMsE2W51RAeLlGE7Clg1bBK4zbkbCeIiFXLEsrWsmQt ztNZsKHOylY+RGRbwHZnttTW7pPRhA3pycssC64URNcpGDnszxxKGNREzHll7rjFgiu1+daqGFAg wZkzGdTmk6xVvLtdikQVBkXMjar73SdZiULzAusm0YW4XUZSL3jJ8FfW007wBgeuU5IqTxZweNdd BWucGhazXBFgOYggzeIKaOXkkvdyhj8a3Eptv7HVvrS8gvMpUmvJ0pNLSOle+hOEoMUERDEdgB+N qmA74GSifltVn7V9hkbZzohED9os3QiE2gdyVLmS2t7UvplhOd+1vdgTtmlRNLHvSyRoqTWpU2He l4DOl+9hygULiTbWuSXpVLCZEkmBL9KVI6igiuS4gNgoSExpspiS6yaL712yWBIDtZrAKkURGSPR yZjaWo2orRBFQqEdmzRojVkPSdG/4GPgDB6cJDPTEDrw9z0pStqokRcHzGxl1D6nVVgNmxUWXmLg 6WsrEe7/eUvXmyAWu17z4nyy2IDXXjh/MpvI5NURYJilqVH1vVWVh5jjOTleeUmVBfUuwzDqcizt yi03PkaI+q6SOkWOMgtCIP+HarNZ73Do+4RBc3CZHScW829d5MMpvYOhptnqYC87U2nAqMyGrgz1 muCtkrg3YUzyLzyc2fPYQyLjAiYhvGsKd/4yvWLjRaxGSOSxIqI6AyTq5Abtp5vSu1owQOw1rjMD HIaLrLFNxjdsxN7K9BmSmhmwkXSRBQ3FaC7AocFWmz+BUaNx1GdoxqCW3qE9fp5r2rXzLPU7wZdL +CwxCDNiaje+lK/GM74C6Ia4Dv7sksLruRTBAxkATBnOK0FK5CAlsZYGzCZSAvrwlTiMvGTw0Py9 xVLtqcqLeS1K/bk6d5CasTguTHBR3ddpuBu5H+eoFJ1XD38Lyw1VmdZP09aEG48G5HG4juaOE622 /q/U6zKzaywCQyXDyiMZ7g/dEQ0ZpRDvTAprJkkBqmzEu9u5l77ZLlFdMxGnjxDHKLKMJcosaE9A UUmFYstwMsFGiVk1qXIR2JjawTID6Ht4nUJhv/JcvXJMrl728zYnFLW5UwXPqV1ebAyOG48otNZs 7CgEK16Lko1qhDbMNKjNcC+8R4hQzGKbJVJ9wFmqx/UwS4Ebl0DKzyqlNE9hm0rYpkd415lahSFr YrhW2ZcipWI/jlH1iOUvikUkN+svRcvPuNymYFumJU7r0irz5q6tObQ4upPVhyUnAG1hkbBV3chZ h9rAmPcSL3Qp9mwQ6rieHStWratFieV4H0Ojcbni2ZnHyiYnxjzb7Da5pjcEMYQmOaibv0EyEswF xd4G0oCGBiFYIShAgSSzCYSz1OWpzuEWxq8VmTDIFDoxfiXECCTCDAjku8tbu57FfEtGEHFfY8MD e24WW7FI4++aUwoNPMbBEOUyqv1nLS6oJgyjNyh1AOOC3W9snlQlfmxLbkSUh4GA2msKcaQNsgqK QaOF7SVQFQmLqthD0XqrFMOfoq9R87ErBguZOyK3CXu0ojhtGAhubxV954nbVA559JDxBxBrS3jI 09maqE3Hq8LzBOmBvqgMheUQ9B4L0Dn9G7MzRZnapBpxBMGHJHg6ZG5lEKkW/otFHHo/iWCpGOir coXSdTlbsgu63YrihjKEEEQbkMiPHJOiDGtFkJkkacn2NMNxvZdQhMiRIINSLjL2IlwrcJzavfBe Ahy5e9ZyPheVN1ChrCGQV3BaMmYtETPeOSG5lYQU16kZSD3M9q+UjshdoO+HBQp2LFwl2DMPcy2K BaJnW+9GvBXeB9y5ta7u7vd3p2JlXSXhtvFjTY00MGJrEOpEIMBMuGEEQwl1ruIlQx2FD76pku6U KuI5GHZKNlY5J4Jhb4uGDGsMxgYTC59Yhgw2u2ihdLETUX7fr9SAg1h7hkkzAOwVOwXHNDFGIXbn 2RB7D208unjMHYSieYcyA8BP3HRXBH2szJfvhnMw6nc+4qarYBjYkzi2qcYENATlII/CJVksi1tn VWHiw2v4fYdV8lEcgthpEmi02A8IZORwA0uXf6iPLAzUrsdonf5WOOY8jVVUJVRWXEk3inHskHhj TozOPTsCYhL7pYUk5GQFNpokSshHmcjmWlswqYWxDWIykv+LuSKcKEhspC09AA== --===============0188259254==--