Commit 2b992304 authored by Dmitry Lenev's avatar Dmitry Lenev

Merged fix for bug #12652385 - "61493: REORDERING COLUMNS

TO POSITION FIRST CAN CAUSE DATA TO BE CORRUPTED" into
mysql-5.5 tree.
parents 699f0c06 edfd31a0
......@@ -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);
......
......@@ -1073,6 +1073,33 @@ ALTER TABLE t1 DROP COLUMN a, ADD COLUMN c TEXT FIRST;
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
#
......
......@@ -5326,6 +5326,12 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
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 */
......@@ -5403,7 +5409,14 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
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;
......@@ -5419,6 +5432,10 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
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;
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment