From ab32ce9aa7fb09b2fb578e5bb44f004092bf1d89 Mon Sep 17 00:00:00 2001 From: Michael Widenius Date: Wed, 5 Jan 2011 15:09:06 +0200 Subject: [PATCH] ALTER TABLE IGNORE didn't ignore duplicates for unique add index for InnoDB --- mysql-test/suite/innodb/r/innodb_mysql.result | 7 +++++++ mysql-test/suite/innodb/t/innodb_mysql.test | 9 +++++++++ sql/sql_table.cc | 10 ++++++++++ 3 files changed, 26 insertions(+) diff --git a/mysql-test/suite/innodb/r/innodb_mysql.result b/mysql-test/suite/innodb/r/innodb_mysql.result index 86a51b337ff..08fb0bdfe2e 100644 --- a/mysql-test/suite/innodb/r/innodb_mysql.result +++ b/mysql-test/suite/innodb/r/innodb_mysql.result @@ -2617,6 +2617,13 @@ rows 3 Extra Using index DROP TABLE t1; # +# ALTER TABLE IGNORE didn't ignore duplicates for unique add index +# +create table t1 (a int primary key, b int) engine = innodb; +insert into t1 values (1,1),(2,1); +alter ignore table t1 add unique `main` (b); +drop table t1; +# End of 5.1 tests # # Test for bug #39932 "create table fails if column for FK is in different diff --git a/mysql-test/suite/innodb/t/innodb_mysql.test b/mysql-test/suite/innodb/t/innodb_mysql.test index 991440e54dd..177dabdc3e1 100644 --- a/mysql-test/suite/innodb/t/innodb_mysql.test +++ b/mysql-test/suite/innodb/t/innodb_mysql.test @@ -840,6 +840,15 @@ CREATE INDEX b ON t1(a,b,c,d); DROP TABLE t1; +--echo # +--echo # ALTER TABLE IGNORE didn't ignore duplicates for unique add index +--echo # + +create table t1 (a int primary key, b int) engine = innodb; +insert into t1 values (1,1),(2,1); +alter ignore table t1 add unique `main` (b); +drop table t1; + --echo # diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 8446ca46e3c..a7a0a96ce10 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -7136,6 +7136,16 @@ view_err: /* Non-primary unique key. */ needed_online_flags|= HA_ONLINE_ADD_UNIQUE_INDEX; needed_fast_flags|= HA_ONLINE_ADD_UNIQUE_INDEX_NO_WRITES; + if (ignore) + { + /* + If ignore is used, we have to remove all duplicate rows, + which require a full table copy. + */ + need_copy_table= ALTER_TABLE_DATA_CHANGED; + pk_changed= 2; // Don't change need_copy_table + break; + } } } else