-- source include/have_innodb.inc -- source include/have_debug.inc CREATE OR REPLACE TABLE t1 ( a INT, b INT, row_start BIGINT UNSIGNED AS ROW START INVISIBLE, row_end BIGINT UNSIGNED AS ROW END INVISIBLE, PERIOD FOR SYSTEM_TIME(row_start, row_end) ) WITH SYSTEM VERSIONING ENGINE=INNODB; CREATE OR REPLACE TABLE t2 ( a INT WITHOUT SYSTEM VERSIONING, b INT, row_start BIGINT UNSIGNED AS ROW START INVISIBLE, row_end BIGINT UNSIGNED AS ROW END INVISIBLE, PERIOD FOR SYSTEM_TIME(row_start, row_end) ) WITH SYSTEM VERSIONING ENGINE=INNODB; INSERT INTO t1 VALUES (1,1); INSERT INTO t2 VALUES (1,1); SET @@SYSTEM_VERSIONING_ALTER_HISTORY=KEEP; --enable_info --echo # without rebuild ALTER TABLE t1 CHANGE a a INT WITHOUT SYSTEM VERSIONING, ALGORITHM=INSTANT; --error ER_ALTER_OPERATION_NOT_SUPPORTED ALTER TABLE t2 CHANGE a a INT WITH SYSTEM VERSIONING, ADD PRIMARY KEY pk (a), ALGORITHM=INSTANT; --echo # with rebuild ALTER TABLE t2 CHANGE a a INT WITH SYSTEM VERSIONING, ADD PRIMARY KEY pk (a); --disable_info --source include/restart_mysqld.inc UPDATE t1 SET a=2; SELECT COUNT(*) FROM t1 FOR SYSTEM_TIME ALL; UPDATE t2 SET a=2; SELECT COUNT(*) FROM t2 FOR SYSTEM_TIME ALL; DROP TABLE t1, t2; --echo # rollback ALTER TABLE: nothing should change CREATE TABLE t ( a INT, b INT, row_start BIGINT UNSIGNED AS ROW START INVISIBLE, row_end BIGINT UNSIGNED AS ROW END INVISIBLE, PERIOD FOR SYSTEM_TIME(row_start, row_end) ) WITH SYSTEM VERSIONING ENGINE=INNODB; INSERT INTO t VALUES (1, 1); SELECT C.PRTYPE FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS AS C JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES AS t ON C.TABLE_ID=t.TABLE_ID WHERE t.NAME='test/t' AND C.NAME='b'; SET @@SYSTEM_VERSIONING_ALTER_HISTORY=KEEP; SET @SAVED_DEBUG_DBUG = @@SESSION.DEBUG_DBUG; SET DEBUG_DBUG='+d,ib_commit_inplace_fail_1'; --error ER_INTERNAL_ERROR ALTER TABLE t CHANGE b b INT WITHOUT SYSTEM VERSIONING; SET DEBUG_DBUG = @SAVED_DEBUG_DBUG; SELECT C.PRTYPE FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS AS C JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES AS t ON C.TABLE_ID=t.TABLE_ID WHERE t.NAME='test/t' AND C.NAME='b'; SHOW CREATE TABLE t; SELECT COUNT(*) FROM t FOR SYSTEM_TIME ALL; UPDATE t SET b=11; SELECT COUNT(*) FROM t FOR SYSTEM_TIME ALL; DROP TABLE t;