mirror of
https://github.com/MariaDB/server.git
synced 2025-11-27 05:41:41 +03:00
Implement syntax like: create table t1 (x int) with system versioning partition by system_time; which will create 1 history partition and 1 current partition. Also it is possible to specify the number of history partitions: create table t1 (x int) with system versioning partition by system_time partitions 5; which will create 4 history partitions (and 1 current partition). Tests: partition.test cases are duplicated where it is appropriate for default partitions. partition_rotation.test cases are replaced by default partitions where possible.
281 lines
12 KiB
Plaintext
281 lines
12 KiB
Plaintext
set time_zone= "+00:00";
|
|
call mtr.add_suppression("need more HISTORY partitions");
|
|
set timestamp=unix_timestamp('2001-02-03 10:20:30');
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day
|
|
subpartition by key (i) subpartitions 2
|
|
(partition p1 history, partition pn current);
|
|
set timestamp=unix_timestamp('2001-02-03 10:20:40');
|
|
insert t1 values (1);
|
|
delete from t1;
|
|
set timestamp=unix_timestamp('2001-02-04 10:20:50');
|
|
insert t1 values (2);
|
|
Warnings:
|
|
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
|
|
delete from t1;
|
|
Warnings:
|
|
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
|
|
select subpartition_name,partition_description,table_rows from information_schema.partitions where table_schema='test' and table_name='t1';
|
|
subpartition_name partition_description table_rows
|
|
p1sp0 2001-02-04 00:00:00 1
|
|
p1sp1 2001-02-04 00:00:00 1
|
|
pnsp0 CURRENT 0
|
|
pnsp1 CURRENT 0
|
|
set timestamp=unix_timestamp('2001-02-04 10:20:55');
|
|
alter table t1 add partition (partition p0 history, partition p2 history);
|
|
set timestamp=unix_timestamp('2001-02-04 10:30:00');
|
|
insert t1 values (4),(5);
|
|
set timestamp=unix_timestamp('2001-02-04 10:30:10');
|
|
update t1 set i=6 where i=5;
|
|
select subpartition_name,partition_description,table_rows from information_schema.partitions where table_schema='test' and table_name='t1';
|
|
subpartition_name partition_description table_rows
|
|
p1sp0 2001-02-04 00:00:00 1
|
|
p1sp1 2001-02-04 00:00:00 0
|
|
p0sp0 2001-02-05 00:00:00 1
|
|
p0sp1 2001-02-05 00:00:00 1
|
|
p2sp0 2001-02-06 00:00:00 0
|
|
p2sp1 2001-02-06 00:00:00 0
|
|
pnsp0 CURRENT 0
|
|
pnsp1 CURRENT 2
|
|
## pruning check
|
|
set @ts=(select partition_description from information_schema.partitions
|
|
where table_schema='test' and table_name='t1' and partition_name='p0' limit 1);
|
|
select * from t1;
|
|
i
|
|
4
|
|
6
|
|
explain partitions select * from t1;
|
|
id select_type table partitions type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL 2 Using where
|
|
explain partitions select * from t1 for system_time as of '2001-02-04 10:20:30';
|
|
id select_type table partitions type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 p0_p0sp0,p0_p0sp1,p2_p2sp0,p2_p2sp1,pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL # Using where
|
|
set @ts=(select row_end from t1 for system_time all where i=1);
|
|
select * from t1 for system_time all where row_end = @ts;
|
|
i
|
|
1
|
|
explain partitions select * from t1 for system_time all where row_end = @ts;
|
|
id select_type table partitions type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 p1_p1sp0,p1_p1sp1 # NULL NULL NULL NULL # #
|
|
## INTERVAL ... STARTS
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts 'a';
|
|
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'STARTS'
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts '00:00:00';
|
|
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'STARTS'
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts '2000-00-01 00:00:00';
|
|
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'STARTS'
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts 946684800;
|
|
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'STARTS'
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts '2000-01-01 00:00:00';
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 DAY STARTS TIMESTAMP'2000-01-01 00:00:00'
|
|
PARTITIONS 2
|
|
# Test STARTS warning
|
|
set timestamp= unix_timestamp('2000-01-01 00:00:00');
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 DAY STARTS TIMESTAMP'2000-01-01 00:00:00'
|
|
PARTITIONS 2
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts '2000-01-01 00:00:01';
|
|
Warnings:
|
|
Warning 4164 `t1`: STARTS is later than query time, first history partition may exceed INTERVAL value
|
|
# Test default STARTS rounding
|
|
set timestamp= unix_timestamp('1999-12-15 13:33:33');
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 second;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 SECOND STARTS TIMESTAMP'1999-12-15 13:33:33'
|
|
PARTITIONS 2
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 minute;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 MINUTE STARTS TIMESTAMP'1999-12-15 13:33:00'
|
|
PARTITIONS 2
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 hour;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR STARTS TIMESTAMP'1999-12-15 13:00:00'
|
|
PARTITIONS 2
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 DAY STARTS TIMESTAMP'1999-12-15 00:00:00'
|
|
PARTITIONS 2
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 month;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 MONTH STARTS TIMESTAMP'1999-12-15 00:00:00'
|
|
PARTITIONS 2
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 year;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 YEAR STARTS TIMESTAMP'1999-12-15 00:00:00'
|
|
PARTITIONS 2
|
|
# seconds equivalent of 1 day does not round:
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 86400 second;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 86400 SECOND STARTS TIMESTAMP'1999-12-15 13:33:33'
|
|
PARTITIONS 2
|
|
# STARTS value is in local time_zone:
|
|
set time_zone="+03:00";
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts '2000-01-01 00:00:00';
|
|
Warnings:
|
|
Warning 4164 `t1`: STARTS is later than query time, first history partition may exceed INTERVAL value
|
|
set timestamp= unix_timestamp('2000-01-01 00:00:00');
|
|
create or replace table t2 (i int) with system versioning
|
|
partition by system_time interval 1 day;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 DAY STARTS TIMESTAMP'2000-01-01 00:00:00'
|
|
PARTITIONS 2
|
|
show create table t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 DAY STARTS TIMESTAMP'2000-01-01 00:00:00'
|
|
PARTITIONS 2
|
|
set time_zone="+00:00";
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 DAY STARTS TIMESTAMP'1999-12-31 21:00:00'
|
|
PARTITIONS 2
|
|
show create table t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`i` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
|
|
PARTITION BY SYSTEM_TIME INTERVAL 1 DAY STARTS TIMESTAMP'1999-12-31 21:00:00'
|
|
PARTITIONS 2
|
|
# Test rotation
|
|
set timestamp= unix_timestamp('2001-01-01 00:00:00');
|
|
# it's ok to add partitions for past:
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts '2000-01-01 00:00:00'
|
|
partitions 3;
|
|
# we are warned when we push to present:
|
|
insert into t1 values (0);
|
|
Warnings:
|
|
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
|
|
set timestamp= unix_timestamp('2001-01-01 00:00:01');
|
|
update t1 set i= i + 1;
|
|
Warnings:
|
|
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
|
|
set timestamp= unix_timestamp('2001-01-01 00:00:02');
|
|
update t1 set i= i + 1;
|
|
Warnings:
|
|
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
|
|
select *, row_end from t1 partition (p0);
|
|
i row_end
|
|
select *, row_end from t1 partition (p1);
|
|
i row_end
|
|
0 2001-01-01 00:00:01.000000
|
|
1 2001-01-01 00:00:02.000000
|
|
set timestamp= unix_timestamp('2000-01-01 00:00:00');
|
|
# now we "overflow" first partition a bit:
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day starts '2000-01-03 00:00:00'
|
|
partitions 3;
|
|
Warnings:
|
|
Warning 4164 `t1`: STARTS is later than query time, first history partition may exceed INTERVAL value
|
|
insert into t1 values (0);
|
|
set timestamp= unix_timestamp('2000-01-01 00:00:01');
|
|
update t1 set i= i + 1;
|
|
set timestamp= unix_timestamp('2000-01-02 00:00:01');
|
|
update t1 set i= i + 1;
|
|
set timestamp= unix_timestamp('2000-01-03 00:00:01');
|
|
update t1 set i= i + 1;
|
|
set timestamp= unix_timestamp('2000-01-04 00:00:01');
|
|
update t1 set i= i + 1;
|
|
select *, row_end from t1 partition (p0);
|
|
i row_end
|
|
0 2000-01-01 00:00:01.000000
|
|
1 2000-01-02 00:00:01.000000
|
|
2 2000-01-03 00:00:01.000000
|
|
select *, row_end from t1 partition (p1);
|
|
i row_end
|
|
3 2000-01-04 00:00:01.000000
|
|
set timestamp= unix_timestamp('2000-01-01 00:00:00');
|
|
# and this is how it usually goes:
|
|
create or replace table t1 (i int) with system versioning
|
|
partition by system_time interval 1 day
|
|
partitions 3;
|
|
insert into t1 values (0);
|
|
set timestamp= unix_timestamp('2000-01-01 00:00:01');
|
|
update t1 set i= i + 1;
|
|
set timestamp= unix_timestamp('2000-01-02 00:00:01');
|
|
update t1 set i= i + 1;
|
|
set timestamp= unix_timestamp('2000-01-03 00:00:01');
|
|
update t1 set i= i + 1;
|
|
Warnings:
|
|
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
|
|
set timestamp= unix_timestamp('2000-01-04 00:00:01');
|
|
update t1 set i= i + 1;
|
|
Warnings:
|
|
Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p1`) is out of INTERVAL, need more HISTORY partitions
|
|
alter table t1 add partition (partition p2 history, partition p3 history);
|
|
select *, row_end from t1 partition (p0);
|
|
i row_end
|
|
0 2000-01-01 00:00:01.000000
|
|
select *, row_end from t1 partition (p1);
|
|
i row_end
|
|
1 2000-01-02 00:00:01.000000
|
|
select *, row_end from t1 partition (p2);
|
|
i row_end
|
|
2 2000-01-03 00:00:01.000000
|
|
select *, row_end from t1 partition (p3);
|
|
i row_end
|
|
3 2000-01-04 00:00:01.000000
|
|
drop tables t1, t2;
|