Merged fix for bug #12652385 - "61493: REORDERING COLUMNS
TO POSITION FIRST CAN CAUSE DATA TO BE CORRUPTED" into mysql-5.5 tree.
This commit is contained in:
commit
c1f520607c
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user