diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-05 14:20:47 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-05 20:32:14 +0300 |
commit | 474290540a829edcc6a74be8c354053f330bf5de (patch) | |
tree | 0a7734e24b72949bdaafca5bca8f54d544af2c83 | |
parent | 69925c0d2e62a6754cb9e0056df91d162279f32a (diff) | |
download | mariadb-git-474290540a829edcc6a74be8c354053f330bf5de.tar.gz |
MDEV-22465: DROP indexed COLUMN is wrongly claimed to be ALGORITHM=INSTANT
ha_innobase::check_if_supported_inplace_alter(): Do not allow
ALGORITHM=INSTANT for operations that avoid a table rebuild
but involve dropping (or creating) secondary indexes.
-rw-r--r-- | mysql-test/suite/innodb/r/instant_alter,4k.rdiff | 4 | ||||
-rw-r--r-- | mysql-test/suite/innodb/r/instant_alter.result | 10 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/instant_alter.test | 11 | ||||
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 5 |
4 files changed, 25 insertions, 5 deletions
diff --git a/mysql-test/suite/innodb/r/instant_alter,4k.rdiff b/mysql-test/suite/innodb/r/instant_alter,4k.rdiff index 7a6774a0e10..83420bf4593 100644 --- a/mysql-test/suite/innodb/r/instant_alter,4k.rdiff +++ b/mysql-test/suite/innodb/r/instant_alter,4k.rdiff @@ -318,8 +318,8 @@ FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; instants --205 -+207 +-206 ++208 SET GLOBAL innodb_purge_rseg_truncate_frequency= @saved_frequency; SET GLOBAL innodb_instant_alter_column_allowed = @saved_allowance; # diff --git a/mysql-test/suite/innodb/r/instant_alter.result b/mysql-test/suite/innodb/r/instant_alter.result index 3ce1a2d8ccf..e0661557159 100644 --- a/mysql-test/suite/innodb/r/instant_alter.result +++ b/mysql-test/suite/innodb/r/instant_alter.result @@ -2812,11 +2812,19 @@ CREATE TABLE t1 (a INT, b INT, PRIMARY KEY(a,b)) ENGINE=InnoDB ROW_FORMAT=DYNAMI ALTER TABLE t1 MODIFY b INT FIRST; DROP TABLE t1; disconnect analyze; +# +# MDEV-22465: DROP COLUMN is wrongly claimed to be ALGORITHM=INSTANT +# +CREATE TABLE t1(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB; +ALTER TABLE t1 DROP b, ALGORITHM=INSTANT; +ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: DROP INDEX. Try ALGORITHM=NOCOPY +ALTER TABLE t1 DROP b, ALGORITHM=NOCOPY; +DROP TABLE t1; SELECT variable_value-@old_instant instants FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; instants -205 +206 SET GLOBAL innodb_purge_rseg_truncate_frequency= @saved_frequency; SET GLOBAL innodb_instant_alter_column_allowed = @saved_allowance; # diff --git a/mysql-test/suite/innodb/t/instant_alter.test b/mysql-test/suite/innodb/t/instant_alter.test index 8bbeb7fe94d..83dca4cb5a6 100644 --- a/mysql-test/suite/innodb/t/instant_alter.test +++ b/mysql-test/suite/innodb/t/instant_alter.test @@ -877,6 +877,17 @@ dec $format; let $redundant_4k= 0; } disconnect analyze; + +--echo # +--echo # MDEV-22465: DROP COLUMN is wrongly claimed to be ALGORITHM=INSTANT +--echo # + +CREATE TABLE t1(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 DROP b, ALGORITHM=INSTANT; +ALTER TABLE t1 DROP b, ALGORITHM=NOCOPY; +DROP TABLE t1; + SELECT variable_value-@old_instant instants FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 64607293ed9..eae26f86abc 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -2474,7 +2474,8 @@ next_column: } } - if (supports_instant) { + if (supports_instant && !(ha_alter_info->handler_flags + & INNOBASE_ALTER_NOREBUILD)) { DBUG_RETURN(HA_ALTER_INPLACE_INSTANT); } @@ -2584,7 +2585,7 @@ cannot_create_many_fulltext_index: online = false; } - if (need_rebuild || fts_need_rebuild) { + if ((need_rebuild && !supports_instant) || fts_need_rebuild) { ha_alter_info->handler_flags |= ALTER_RECREATE_TABLE; DBUG_RETURN(online ? HA_ALTER_INPLACE_COPY_NO_LOCK |