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);
|
CREATE TABLE t1 (a TEXT, id INT, b INT);
|
||||||
ALTER TABLE t1 DROP COLUMN a, ADD COLUMN c TEXT FIRST;
|
ALTER TABLE t1 DROP COLUMN a, ADD COLUMN c TEXT FIRST;
|
||||||
DROP TABLE t1;
|
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
|
End of 5.1 tests
|
||||||
CREATE TABLE t1(c CHAR(10),
|
CREATE TABLE t1(c CHAR(10),
|
||||||
i INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY);
|
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;
|
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
|
--echo End of 5.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -5326,6 +5326,12 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
if (drop)
|
if (drop)
|
||||||
{
|
{
|
||||||
drop_it.remove();
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
/* Check if field is changed */
|
/* Check if field is changed */
|
||||||
@ -5403,7 +5409,14 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
if (!def->after)
|
if (!def->after)
|
||||||
new_create_list.push_back(def);
|
new_create_list.push_back(def);
|
||||||
else if (def->after == first_keyword)
|
else if (def->after == first_keyword)
|
||||||
|
{
|
||||||
new_create_list.push_front(def);
|
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
|
else
|
||||||
{
|
{
|
||||||
Create_field *find;
|
Create_field *find;
|
||||||
@ -5419,6 +5432,10 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
find_it.after(def); // Put element after this
|
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;
|
alter_info->change_level= ALTER_TABLE_DATA_CHANGED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user