create or replace procedure drop_archives (in vtmd_name varchar(64)) begin declare archive_name varchar(64); declare cur_done bool default false; declare cur cursor for select cur_tmp.archive_name from cur_tmp; declare continue handler for not found set cur_done = true; set @tmp= concat(' create or replace temporary table cur_tmp as select vtmd.archive_name from ', vtmd_name, ' for system_time all as vtmd where vtmd.archive_name is not null group by vtmd.archive_name'); prepare stmt from @tmp; execute stmt; drop prepare stmt; open cur; fetch_loop: loop fetch cur into archive_name; if cur_done then leave fetch_loop; end if; set @tmp= concat('drop table ', archive_name); prepare stmt from @tmp; execute stmt; drop prepare stmt; end loop; drop table cur_tmp; end~~ create or replace procedure check_vtmd (in vtmd_name varchar(64)) begin set @tmp= concat(' create or replace temporary table tmp_vtmd with system versioning as select * from ', vtmd_name, ' for system_time all as vtmd'); prepare stmt from @tmp; execute stmt; drop prepare stmt; set @inf= 0xFFFFFFFFFFFFFFFF + 0; set @start= null; select start from tmp_vtmd for system_time all order by start limit 1 into @start; select @start > 0 and @start < @inf; select start >= @start as A_start, (@start:= end) and end = @inf as B_end, name, substr(archive_name, 1, instr(archive_name, '_')) as C_archive_name from tmp_vtmd for system_time all; drop table tmp_vtmd; end~~ create or replace procedure show_tables() begin show tables; select table_name, table_schema from information_schema.tables where table_schema not in ('mysql', 'performance_schema', 'information_schema', 'mtr') order by table_name; end~~ set versioning_alter_history= keep; create table t0 (z int) with system versioning; show tables; Tables_in_test t0 set versioning_alter_history= survive; create or replace table t0 (y int) with system versioning; show tables; Tables_in_test t0 t0_vtmd show create table t0_vtmd; Table Create Table t0_vtmd CREATE TABLE `t0_vtmd` ( `start` bigint(20) unsigned GENERATED ALWAYS AS ROW START COMMENT 'TRX_ID of table lifetime start', `end` bigint(20) unsigned GENERATED ALWAYS AS ROW END NOT NULL COMMENT 'TRX_ID of table lifetime end', `name` varchar(64) COLLATE utf8_bin NOT NULL COMMENT 'Table name during current lifetime period', `archive_name` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'Name of archive table', `col_renames` blob DEFAULT NULL COMMENT 'Column name mappings from previous lifetime', PRIMARY KEY (`end`), KEY `archive_name` (`archive_name`), PERIOD FOR SYSTEM_TIME (`start`, `end`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0 WITH SYSTEM VERSIONING call check_vtmd('t0_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 1 t0 NULL set versioning_alter_history= keep; drop table t0; set versioning_alter_history= survive; create table t0 (x int) with system versioning; ERROR HY000: VTMD error: `test.t0_vtmd` exists and not empty! drop table t0_vtmd; create table t0 (y int) with system versioning; create or replace table t0 (x int) with system versioning; insert into t0 values (1); set @t0= now(6); alter table t0 add column (y int); select * from t0 for system_time as of @t0; x 1 select * from t0; x y 1 NULL call check_vtmd('t0_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 t0 t0_ 1 0 t0 t0_ 1 1 t0 NULL call drop_archives('t0_vtmd'); drop table t0_vtmd; alter table t0 drop column y; call check_vtmd('t0_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 1 t0 t0_ call drop_archives('t0_vtmd'); set versioning_alter_history= keep; drop tables t0, t0_vtmd; set versioning_alter_history= survive; set versioning_alter_history= keep; create or replace table x0 (x int) with system versioning; set versioning_alter_history= survive; rename table x0 to d0; show tables; Tables_in_test d0 set versioning_alter_history= keep; drop table d0; set versioning_alter_history= survive; create or replace table x0 (x int) with system versioning; rename table x0 to d0; show tables; Tables_in_test d0 d0_vtmd call check_vtmd('d0_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 x0 NULL 1 1 d0 NULL set versioning_alter_history= keep; drop table d0; set versioning_alter_history= survive; create or replace table x0 (x int) with system versioning; rename table x0 to d0; ERROR HY000: VTMD error: `test.d0_vtmd` table already exists! show tables; Tables_in_test d0_vtmd x0 x0_vtmd drop table x0_vtmd; rename table x0 to d0; Warnings: Warning 4122 `test.d0_vtmd` table already exists! show tables; Tables_in_test d0 d0_vtmd rename table d0 to duck; rename table duck to bay; rename table bay to sheer; rename table sheer to t0; call check_vtmd('t0_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 x0 NULL 1 0 d0 NULL 1 0 duck NULL 1 0 bay NULL 1 0 sheer NULL 1 1 t0 NULL alter table t0 add column (y int); call check_vtmd('t0_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 x0 t0_ 1 0 d0 t0_ 1 0 duck t0_ 1 0 bay t0_ 1 0 sheer t0_ 1 0 t0 t0_ 1 1 t0 NULL alter table t0 add column (z int); alter table t0 drop column y; alter table t0 drop column z; create database db0; rename table t0 to db0.t0; show tables; Tables_in_test use db0; show tables; Tables_in_db0 t0 t0_vtmd call test.check_vtmd('db0.t0_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 x0 t0_ 1 0 d0 t0_ 1 0 duck t0_ 1 0 bay t0_ 1 0 sheer t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 1 t0 NULL create database db1; rename table t0 to db1.other_name; show tables; Tables_in_db0 use db1; show tables; Tables_in_db1 other_name other_name_vtmd call test.check_vtmd('db1.other_name_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 x0 t0_ 1 0 d0 t0_ 1 0 duck t0_ 1 0 bay t0_ 1 0 sheer t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 NULL 1 1 other_name NULL alter table other_name rename to t1; call test.check_vtmd('db1.t1_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 x0 t0_ 1 0 d0 t0_ 1 0 duck t0_ 1 0 bay t0_ 1 0 sheer t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 NULL 1 0 other_name NULL 1 1 t1 NULL alter table t1 rename to test.t2, add column (y int); use test; show tables; Tables_in_test t2 t2_vtmd call check_vtmd('t2_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 x0 t0_ 1 0 d0 t0_ 1 0 duck t0_ 1 0 bay t0_ 1 0 sheer t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t0_ 1 0 t0 t1_ 1 0 other_name t1_ 1 0 t1 t1_ 1 1 t2 NULL create or replace table t3 (x int) with system versioning; alter table t3 change x x bigint; alter table t3 change x x bigint after sys_trx_start; call check_vtmd('t3_vtmd'); @start > 0 and @start < @inf 1 A_start B_end name C_archive_name 1 0 t3 t3_ 1 0 t3 t3_ 1 1 t3 NULL set versioning_hide= auto; call show_tables(); Tables_in_test t2 t2_vtmd t3 t3_vtmd table_name table_schema t2 test t2_vtmd test t3 test t3_vtmd test set versioning_hide= implicit; call show_tables(); Tables_in_test t2 t2_vtmd t3 t3_vtmd table_name table_schema t2 test t2_vtmd test t3 test t3_vtmd test set versioning_hide= full; call show_tables(); Tables_in_test t2 t2_vtmd t3 t3_vtmd table_name table_schema t2 test t2_vtmd test t3 test t3_vtmd test set versioning_hide= never; call show_tables(); Tables_in_test t0_TIMESTAMP_SUFFIX t0_TIMESTAMP_SUFFIX t0_TIMESTAMP_SUFFIX t0_TIMESTAMP_SUFFIX t2 t2_vtmd t3 t3_TIMESTAMP_SUFFIX t3_TIMESTAMP_SUFFIX t3_vtmd table_name table_schema t0_TIMESTAMP_SUFFIX test t0_TIMESTAMP_SUFFIX test t0_TIMESTAMP_SUFFIX test t0_TIMESTAMP_SUFFIX test t1_TIMESTAMP_SUFFIX db1 t2 test t2_vtmd test t3 test t3_TIMESTAMP_SUFFIX test t3_TIMESTAMP_SUFFIX test t3_vtmd test set versioning_hide= auto; create or replace table u0_vtmd (x int) with system versioning; show tables; Tables_in_test t2 t2_vtmd t3 t3_vtmd u0_vtmd u0_vtmd_vtmd Warnings: Warning 4122 Table `test.u0_vtmd` is not a VTMD table set versioning_alter_history= survive; create or replace table t (x int) with system versioning; select * from t for system_time all; x sys_trx_start sys_trx_end drop database db0; drop database db1; drop database test; create database test;