From: Dmitry Lenev Date: June 16 2011 11:47pm Subject: bzr push into mysql-trunk branch (Dmitry.Lenev:3216 to 3217) Bug#12652385 List-Archive: http://lists.mysql.com/commits/139379 X-Bug: 12652385 Message-Id: <20110616234702.B28C67406A5@bandersnatch> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3217 Dmitry Lenev 2011-06-17 [merge] Merged fix for bug #12652385 - "61493: REORDERING COLUMNS TO POSITION FIRST CAN CAUSE DATA TO BE CORRUPTED" into mysql-trunk. modified: mysql-test/r/alter_table.result mysql-test/t/alter_table.test sql/sql_table.cc 3216 Matthias Leich 2011-06-16 [merge] Upmerge mysql-5.5 -> mysql-trunk modified: mysql-test/suite/perfschema/include/cleanup_helper.inc mysql-test/suite/perfschema/include/upgrade_check.inc mysql-test/suite/perfschema/r/selects.result mysql-test/suite/perfschema/t/selects.test === modified file 'mysql-test/r/alter_table.result' --- a/mysql-test/r/alter_table.result 2011-05-04 07:51:15 +0000 +++ b/mysql-test/r/alter_table.result 2011-06-16 23:45:58 +0000 @@ -1345,6 +1345,35 @@ DROP TABLE t1; CREATE TABLE t1 (a TEXT, id INT, b INT); ALTER TABLE t1 DROP COLUMN a, ADD COLUMN c TEXT FIRST; DROP TABLE t1; +# +# Test for bug #12652385 - "61493: REORDERING COLUMNS TO POSITION +# FIRST CAN CAUSE DATA TO BE CORRUPTED". +# +drop table if exists t1; +# Use MyISAM engine as the fact that InnoDB doesn't support +# in-place ALTER TABLE in cases when columns are being renamed +# hides some bugs. +create table t1 (i int, j int) engine=myisam; +insert into t1 value (1, 2); +# First, test for original problem described in the bug report. +select * from t1; +i j +1 2 +# Change of column order by the below ALTER TABLE statement should +# affect both column names and column contents. +alter table t1 modify column j int first; +select * from t1; +j i +2 1 +# Now test for similar problem with the same root. +# The below ALTER TABLE should change not only the name but +# also the value for the last column of the table. +alter table t1 drop column i, add column k int default 0; +select * from t1; +j k +2 0 +# Clean-up. +drop table t1; End of 5.1 tests CREATE TABLE t1(c CHAR(10), i INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY); === modified file 'mysql-test/t/alter_table.test' --- a/mysql-test/t/alter_table.test 2011-05-04 07:51:15 +0000 +++ b/mysql-test/t/alter_table.test 2011-06-16 23:45:58 +0000 @@ -1073,6 +1073,33 @@ ALTER TABLE t1 DROP COLUMN a, ADD COLUMN DROP TABLE t1; +--echo # +--echo # Test for bug #12652385 - "61493: REORDERING COLUMNS TO POSITION +--echo # FIRST CAN CAUSE DATA TO BE CORRUPTED". +--echo # +--disable_warnings +drop table if exists t1; +--enable_warnings +--echo # Use MyISAM engine as the fact that InnoDB doesn't support +--echo # in-place ALTER TABLE in cases when columns are being renamed +--echo # hides some bugs. +create table t1 (i int, j int) engine=myisam; +insert into t1 value (1, 2); +--echo # First, test for original problem described in the bug report. +select * from t1; +--echo # Change of column order by the below ALTER TABLE statement should +--echo # affect both column names and column contents. +alter table t1 modify column j int first; +select * from t1; +--echo # Now test for similar problem with the same root. +--echo # The below ALTER TABLE should change not only the name but +--echo # also the value for the last column of the table. +alter table t1 drop column i, add column k int default 0; +select * from t1; +--echo # Clean-up. +drop table t1; + + --echo End of 5.1 tests # === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2011-06-15 22:31:43 +0000 +++ b/sql/sql_table.cc 2011-06-16 23:45:58 +0000 @@ -5577,6 +5577,12 @@ mysql_prepare_alter_table(THD *thd, TABL if (drop) { drop_it.remove(); + /* + ALTER TABLE DROP COLUMN always changes table data even in cases + when new version of the table has the same structure as the old + one. + */ + alter_info->change_level= ALTER_TABLE_DATA_CHANGED; continue; } /* Check if field is changed */ @@ -5654,7 +5660,14 @@ mysql_prepare_alter_table(THD *thd, TABL if (!def->after) new_create_list.push_back(def); else if (def->after == first_keyword) + { new_create_list.push_front(def); + /* + Re-ordering columns in table can't be done using in-place algorithm + as it always changes table data. + */ + alter_info->change_level= ALTER_TABLE_DATA_CHANGED; + } else { Create_field *find; @@ -5670,6 +5683,10 @@ mysql_prepare_alter_table(THD *thd, TABL goto err; } find_it.after(def); // Put element after this + /* + Re-ordering columns in table can't be done using in-place algorithm + as it always changes table data. + */ alter_info->change_level= ALTER_TABLE_DATA_CHANGED; } } No bundle (reason: useless for push emails).