summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-03-16 17:51:09 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2020-03-16 18:02:14 +0200
commit163dc5f919d3a8bf12288a8653d4c90e75809acc (patch)
treefb0f1dabc326b5f16dde5e2d32c32d2df8ff0bbb
parent5b4b2635769c6a05ac971762207802915c0c43c3 (diff)
downloadmariadb-git-bb-10.4-MDEV-20590.tar.gz
MDEV-20590: Extend innodb_file_format for 10.4bb-10.4-MDEV-20590
* mapped (default): Like 'append', but allow the metadata record to store a column map, to support instant add/drop/reorder (MDEV-15562) * strict_mapped: Like 'mapped', but on ALTER TABLE, if a table (or partition) is not in the 10.4-compatible format in some future version of the server, force the table to be rebuilt.
-rw-r--r--mysql-test/suite/innodb/r/instant_alter,4k.rdiff4
-rw-r--r--mysql-test/suite/innodb/r/instant_alter.result88
-rw-r--r--mysql-test/suite/innodb/t/instant_alter.test30
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_file_format_basic.result14
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb.result4
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_file_format_basic.test4
-rw-r--r--storage/innobase/handler/ha_innodb.cc8
-rw-r--r--storage/innobase/handler/handler0alter.cc22
8 files changed, 155 insertions, 19 deletions
diff --git a/mysql-test/suite/innodb/r/instant_alter,4k.rdiff b/mysql-test/suite/innodb/r/instant_alter,4k.rdiff
index 61e4ee8449c..dd7d6f99b3e 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
+-208
++210
SET GLOBAL innodb_purge_rseg_truncate_frequency= @saved_frequency;
SET GLOBAL innodb_file_format = @saved_format;
#
diff --git a/mysql-test/suite/innodb/r/instant_alter.result b/mysql-test/suite/innodb/r/instant_alter.result
index fd46466c49e..6d8ff3e6f10 100644
--- a/mysql-test/suite/innodb/r/instant_alter.result
+++ b/mysql-test/suite/innodb/r/instant_alter.result
@@ -2,7 +2,7 @@
# MDEV-11369: Instant ADD COLUMN for InnoDB
#
SET @saved_format = @@GLOBAL.innodb_file_format;
-SET GLOBAL innodb_file_format = append;
+SET GLOBAL innodb_file_format = DEFAULT;
call mtr.add_suppression("Cannot add field `.*` in table `test`.`.*` because after adding it, the row size is");
CREATE TABLE t(a INT UNIQUE)ENGINE=InnoDB ROW_FORMAT=COMPACT;
ALTER TABLE t ADD e INT, ROW_FORMAT=COMPRESSED;
@@ -947,7 +947,11 @@ ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
SET GLOBAL innodb_file_format = strict_append;
ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
ALTER TABLE t1 ADD c TEXT, ALGORITHM=INSTANT;
SET GLOBAL innodb_file_format = barracuda;
ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
@@ -958,8 +962,30 @@ ALTER TABLE t1 MODIFY a INT DEFAULT 0;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
+SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
+SET GLOBAL innodb_file_format = mapped;
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = strict_append;
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY a INT DEFAULT 0, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY a INT DEFAULT 0;
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
+ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
DROP TABLE t1;
-SET GLOBAL innodb_file_format = @saved_format;
+SET GLOBAL innodb_file_format = DEFAULT;
CREATE TABLE t1
(id INT PRIMARY KEY, c2 INT UNIQUE,
c3 POINT NOT NULL DEFAULT ST_GeomFromText('POINT(3 4)'),
@@ -1850,7 +1876,11 @@ ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
SET GLOBAL innodb_file_format = strict_append;
ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
ALTER TABLE t1 ADD c TEXT, ALGORITHM=INSTANT;
SET GLOBAL innodb_file_format = barracuda;
ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
@@ -1861,8 +1891,30 @@ ALTER TABLE t1 MODIFY a INT DEFAULT 0;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
+SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
+SET GLOBAL innodb_file_format = mapped;
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = strict_append;
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY a INT DEFAULT 0, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY a INT DEFAULT 0;
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
+ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
DROP TABLE t1;
-SET GLOBAL innodb_file_format = @saved_format;
+SET GLOBAL innodb_file_format = DEFAULT;
CREATE TABLE t1
(id INT PRIMARY KEY, c2 INT UNIQUE,
c3 POINT NOT NULL DEFAULT ST_GeomFromText('POINT(3 4)'),
@@ -2753,7 +2805,11 @@ ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
SET GLOBAL innodb_file_format = strict_append;
ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
ALTER TABLE t1 ADD c TEXT, ALGORITHM=INSTANT;
SET GLOBAL innodb_file_format = barracuda;
ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
@@ -2764,14 +2820,36 @@ ALTER TABLE t1 MODIFY a INT DEFAULT 0;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_barracuda. Try ALGORITHM=INPLACE
+SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=append. Try ALGORITHM=INPLACE
+SET GLOBAL innodb_file_format = mapped;
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = strict_append;
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY a INT DEFAULT 0, ALGORITHM=INSTANT;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: innodb_file_format=strict_append. Try ALGORITHM=INPLACE
+ALTER TABLE t1 MODIFY a INT DEFAULT 0;
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
+ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
DROP TABLE t1;
-SET GLOBAL innodb_file_format = @saved_format;
+SET GLOBAL innodb_file_format = DEFAULT;
disconnect analyze;
SELECT variable_value-@old_instant instants
FROM information_schema.global_status
WHERE variable_name = 'innodb_instant_alter_column';
instants
-205
+208
SET GLOBAL innodb_purge_rseg_truncate_frequency= @saved_frequency;
SET GLOBAL innodb_file_format = @saved_format;
#
diff --git a/mysql-test/suite/innodb/t/instant_alter.test b/mysql-test/suite/innodb/t/instant_alter.test
index 1b097ce5ddf..acce43a4a50 100644
--- a/mysql-test/suite/innodb/t/instant_alter.test
+++ b/mysql-test/suite/innodb/t/instant_alter.test
@@ -5,7 +5,7 @@
--echo #
SET @saved_format = @@GLOBAL.innodb_file_format;
-SET GLOBAL innodb_file_format = append;
+SET GLOBAL innodb_file_format = DEFAULT;
call mtr.add_suppression("Cannot add field `.*` in table `test`.`.*` because after adding it, the row size is");
@@ -844,7 +844,11 @@ SET GLOBAL innodb_file_format = strict_barracuda;
ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
SET GLOBAL innodb_file_format = strict_append;
ALTER TABLE t1 ADD b TEXT, ALGORITHM=INSTANT;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
SET GLOBAL innodb_file_format = append;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
ALTER TABLE t1 ADD c TEXT, ALGORITHM=INSTANT;
SET GLOBAL innodb_file_format = barracuda;
ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
@@ -855,8 +859,30 @@ ALTER TABLE t1 MODIFY a INT DEFAULT 0, ALGORITHM=INSTANT;
ALTER TABLE t1 MODIFY a INT DEFAULT 0;
--disable_info
ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 DROP b, ALGORITHM=INSTANT;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = append;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = mapped;
+ALTER TABLE t1 MODIFY b TEXT FIRST, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = append;
+ALTER TABLE t1 MODIFY a INT DEFAULT 1, ALGORITHM=INSTANT;
+SET GLOBAL innodb_file_format = strict_append;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 ADD d TEXT AFTER a, ALGORITHM=INSTANT;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 MODIFY a INT DEFAULT 0, ALGORITHM=INSTANT;
+--enable_info
+ALTER TABLE t1 MODIFY a INT DEFAULT 0;
+--disable_info
+ALTER TABLE t1 MODIFY a INT DEFAULT NULL, ALGORITHM=INSTANT;
DROP TABLE t1;
-SET GLOBAL innodb_file_format = @saved_format;
+SET GLOBAL innodb_file_format = DEFAULT;
dec $format;
let $redundant_4k= 0;
diff --git a/mysql-test/suite/sys_vars/r/innodb_file_format_basic.result b/mysql-test/suite/sys_vars/r/innodb_file_format_basic.result
index 2eec95c4a19..08b92f8213f 100644
--- a/mysql-test/suite/sys_vars/r/innodb_file_format_basic.result
+++ b/mysql-test/suite/sys_vars/r/innodb_file_format_basic.result
@@ -23,11 +23,19 @@ ERROR 42000: Variable 'innodb_file_format' can't be set to the value of '-1'
select @@global.innodb_file_format;
@@global.innodb_file_format
barracuda
-set global innodb_file_format=4;
-ERROR 42000: Variable 'innodb_file_format' can't be set to the value of '4'
+set global innodb_file_format=6;
+ERROR 42000: Variable 'innodb_file_format' can't be set to the value of '6'
select @@global.innodb_file_format;
@@global.innodb_file_format
barracuda
+set global innodb_file_format=5;
+select @@global.innodb_file_format;
+@@global.innodb_file_format
+strict_mapped
+set global innodb_file_format=4;
+select @@global.innodb_file_format;
+@@global.innodb_file_format
+mapped
set global innodb_file_format=3;
select @@global.innodb_file_format;
@@global.innodb_file_format
@@ -47,5 +55,5 @@ barracuda
set global innodb_file_format=default;
select @@global.innodb_file_format;
@@global.innodb_file_format
-append
+mapped
SET GLOBAL innodb_file_format = @start_global_value;
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
index 1c33d2a64e5..bec29ce3575 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
@@ -815,14 +815,14 @@ READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_FILE_FORMAT
SESSION_VALUE NULL
-DEFAULT_VALUE append
+DEFAULT_VALUE mapped
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE ENUM
VARIABLE_COMMENT File format constraint for native ALTER TABLE
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST barracuda,strict_barracuda,append,strict_append
+ENUM_VALUE_LIST barracuda,strict_barracuda,append,strict_append,mapped,strict_mapped
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_FILE_PER_TABLE
diff --git a/mysql-test/suite/sys_vars/t/innodb_file_format_basic.test b/mysql-test/suite/sys_vars/t/innodb_file_format_basic.test
index 32a06d77f83..277a10a620b 100644
--- a/mysql-test/suite/sys_vars/t/innodb_file_format_basic.test
+++ b/mysql-test/suite/sys_vars/t/innodb_file_format_basic.test
@@ -18,6 +18,10 @@ set global innodb_file_format=1.1;
set global innodb_file_format=-1;
select @@global.innodb_file_format;
--error ER_WRONG_VALUE_FOR_VAR
+set global innodb_file_format=6;
+select @@global.innodb_file_format;
+set global innodb_file_format=5;
+select @@global.innodb_file_format;
set global innodb_file_format=4;
select @@global.innodb_file_format;
set global innodb_file_format=3;
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index a893b0b2b83..b972fdde51d 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -461,8 +461,10 @@ static TYPELIB innodb_change_buffering_typelib = {
const char* innodb_file_format_names[] = {
"barracuda", /* compatible with MariaDB 5.5 to 10.2 */
"strict_barracuda", /* force rebuild on ALTER TABLE if needed */
- "append",/* allow instant ADD COLUMN */
- "strict_append", /* ditto; but maybe require rebuild in 10.4 */
+ "append",/* allow instant ADD COLUMN at the end */
+ "strict_append", /* ditto; but only in 10.3 compatible format */
+ "mapped",/* allow instant DROP COLUMN or reordering columns */
+ "strict_mapped",/* ditto; but only in 10.4 compatible format */
NullS
};
@@ -19028,7 +19030,7 @@ static MYSQL_SYSVAR_ENUM(flush_method, innodb_flush_method,
static MYSQL_SYSVAR_ENUM(file_format, innodb_file_format,
PLUGIN_VAR_RQCMDARG,
- "File format constraint for native ALTER TABLE", NULL, NULL, 2/*add*/,
+ "File format constraint for native ALTER TABLE", NULL, NULL, 4/*mapped*/,
&innodb_file_format_typelib);
static MYSQL_SYSVAR_STR(large_prefix, innodb_large_prefix,
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index 670e6704de9..daf87ef1f9c 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -2003,7 +2003,9 @@ ha_innobase::check_if_supported_inplace_alter(
switch (innodb_file_format) {
case 0: /* barracuda */
if (!(ha_alter_info->handler_flags
- & ALTER_ADD_STORED_BASE_COLUMN)) {
+ & (ALTER_ADD_STORED_BASE_COLUMN
+ | ALTER_STORED_COLUMN_ORDER
+ | ALTER_DROP_STORED_COLUMN))) {
break;
}
reason_rebuild = "innodb_file_format=barracuda";
@@ -2017,12 +2019,28 @@ ha_innobase::check_if_supported_inplace_alter(
break;
case 1: /* strict_barracuda */
if ((ha_alter_info->handler_flags
- & ALTER_ADD_STORED_BASE_COLUMN)
+ & (ALTER_ADD_STORED_BASE_COLUMN
+ | ALTER_STORED_COLUMN_ORDER
+ | ALTER_DROP_STORED_COLUMN))
|| m_prebuilt->table->is_instant()) {
reason_rebuild = "innodb_file_format=strict_barracuda";
goto innodb_file_format_rebuild_reason;
}
break;
+ case 2: /* append */
+ if (ha_alter_info->handler_flags
+ & (ALTER_STORED_COLUMN_ORDER | ALTER_DROP_STORED_COLUMN)) {
+ reason_rebuild = "innodb_file_format=append";
+ goto innodb_file_format_rebuild_reason;
+ }
+ break;
+ case 3: /* strict_append */
+ if ((ha_alter_info->handler_flags
+ & (ALTER_STORED_COLUMN_ORDER | ALTER_DROP_STORED_COLUMN))
+ || m_prebuilt->table->instant) {
+ reason_rebuild = "innodb_file_format=strict_append";
+ goto innodb_file_format_rebuild_reason;
+ }
}
switch (ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE) {