mirror of
https://github.com/MariaDB/server.git
synced 2025-12-01 17:39:21 +03:00
Changing columns WITH/WITHOUT SYSTEM VERSIONING doens't require to read data at all. Thus it should be an instant operation. Patch also fixes a bug when ALTER_COLUMN_UNVERSIONED wasn't passed to InnoDB to change its internal structures. change_field_versioning_try(): apply WITH/WITHOUT SYSTEM VERSIONING change in SYS_COLUMNS for one field. change_fields_versioning_try(): apply WITH/WITHOUT SYSTEM VERSIONING change in SYS_COLUMNS for every changed field in a table. change_fields_versioning_cache(): update cache for versioning property of columns.
88 lines
2.2 KiB
Plaintext
88 lines
2.2 KiB
Plaintext
-- 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;
|