c7b25efc创建于 2021年12月29日历史提交
--
-- prepare: create tablespace dir
--
\! mkdir '@testtablespace@/hw_partition_interval_tsp4'
\! mkdir '@testtablespace@/hw_partition_interval_tsp5'
\! mkdir '@testtablespace@/hw_partition_interval_tsp6'
set timezone = 'PRC';
create tablespace hw_partition_interval_tsp4 location '@testtablespace@/hw_partition_interval_tsp4';
create tablespace hw_partition_interval_tsp5 location '@testtablespace@/hw_partition_interval_tsp5';
create tablespace hw_partition_interval_tsp6 location '@testtablespace@/hw_partition_interval_tsp6';

--
---- normal operates : create, insert, auto create and drop without table space
--
CREATE TABLE interval_normal_date (logdate date not null) 
PARTITION BY RANGE (logdate)
INTERVAL ('1 day')
(
	PARTITION interval_normal_date_p1 VALUES LESS THAN ('2020-03-01'),
	PARTITION interval_normal_date_p2 VALUES LESS THAN ('2020-05-01'),
	PARTITION interval_normal_date_p3 VALUES LESS THAN ('2020-06-01')
);

-- see about the info of the partitioned table in pg_partition
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- insert the record that is smaller than the lower boundary
insert into interval_normal_date values ('2020-02-20');
insert into interval_normal_date values ('2020-3-01');
insert into interval_normal_date values ('2020-3-02');
insert into interval_normal_date values ('2020-5-02');

-- no new interval range created
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- insert the record that is smaller than the lower boundary
insert into interval_normal_date values ('2020-6-01');
insert into interval_normal_date values ('2020-6-02');
insert into interval_normal_date values ('2020-6-03');

-- created two new interval ranges
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- inquire about data of the partition and the partitioned table
select * from interval_normal_date order by logdate;
select * from interval_normal_date partition (interval_normal_date_p1) order by logdate; 
select * from interval_normal_date partition (interval_normal_date_p2) order by logdate;
select * from interval_normal_date partition (interval_normal_date_p3) order by logdate;
-- first created interval range
select * from interval_normal_date partition (sys_p1) order by logdate;
-- second created interval range
select * from interval_normal_date partition (sys_p2) order by logdate;
-- third created interval range
select * from interval_normal_date partition (sys_p3) order by logdate;

-- drop range partition which is not next to interval range.
ALTER TABLE interval_normal_date DROP PARTITION interval_normal_date_p2;
-- see about the info of the partitioned table in pg_partition
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- drop interval range partition
ALTER TABLE interval_normal_date DROP PARTITION sys_p2;
-- see the info of the partitioned table in pg_partition, only reduce a interval range partition instance.
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- drop range partition which is next to interval range.
ALTER TABLE interval_normal_date DROP PARTITION interval_normal_date_p3;
-- the interval parttition will changed to range partition
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- insert the record to create droped range sys_p2, which will have a new relname.
insert into interval_normal_date values ('2020-6-02');
-- will add the new created interval partition. 
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- insert the record that is smaller than the lower boundary
insert into interval_normal_date values ('2020-3-02');
insert into interval_normal_date values ('2020-5-02');

-- inquire about data of the partition and the partitioned table
select * from interval_normal_date order by logdate;
select * from interval_normal_date partition (interval_normal_date_p1) order by logdate; 
-- first created interval range
select * from interval_normal_date partition (sys_p1) order by logdate;
-- third created interval range
select * from interval_normal_date partition (sys_p3) order by logdate;
-- fourth created interval range
select * from interval_normal_date partition (sys_p4) order by logdate;

-- Insert a future data
insert into interval_normal_date values ('2030-3-01');
insert into interval_normal_date values ('2040-06-20');

-- see about the info of the partitioned table in pg_partition
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

-- inquire about data of the partition and the partitioned table
select * from interval_normal_date order by logdate;
select * from interval_normal_date partition (sys_p5) order by logdate;
select * from interval_normal_date partition (sys_p6) order by logdate;

--
---- test truncate partitions without index
--

-- truncate a range partition
ALTER TABLE interval_normal_date truncate PARTITION interval_normal_date_p1;
select * from interval_normal_date partition (interval_normal_date_p1) order by logdate;

-- truncate a interval partition
ALTER TABLE interval_normal_date truncate PARTITION sys_p4;
select * from interval_normal_date partition (sys_p4) order by logdate;

-- truncate the partitioned table
truncate table interval_normal_date;
select * from interval_normal_date order by logdate;

--
---- merge and split partition are not supported yet;
--

-- split partition
ALTER TABLE interval_normal_date SPLIT PARTITION sys_p1 AT ('2020-04-01 00:00:00') INTO
(
    PARTITION sys_p1_1,
    PARTITION sys_p1_2
);

--
---- add partition is not supported;
--
ALTER TABLE interval_normal_date ADD PARTITION sys_10 VALUES LESS THAN ('2020-07-01');

--
---- alter partition name
--
ALTER TABLE interval_normal_date RENAME PARTITION sys_p5 To my_sys_p5;
ALTER TABLE interval_normal_date RENAME PARTITION FOR ('2020-06-02') To my_sys_p4;
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

ALTER TABLE interval_normal_date RENAME PARTITION sys_p6 To my_sys_p6;
insert into interval_normal_date values ('2040-06-21');
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

ALTER TABLE interval_normal_date RENAME PARTITION sys_p4 To sys_p1048575;
insert into interval_normal_date values ('2040-06-22');
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

ALTER TABLE interval_normal_date RENAME PARTITION sys_p4 To sys_p1048580;
insert into interval_normal_date values ('2040-06-24');
select relname, parttype, partstrategy, boundaries from pg_partition
	where parentid = (select oid from pg_class where relname = 'interval_normal_date')
	order by relname;

--clean up
drop table interval_normal_date;

--
---- the cstore table does not support interval partition;
--
create table partiton_table_001(
COL_1 smallint,
COL_2 char(30),
COL_3 int,
COL_4 date not null
)with (orientation = column)
PARTITION BY RANGE (COL_4)
INTERVAL ('1 month')
(
PARTITION partiton_table_001_p1 VALUES LESS THAN ('2020-03-01')
);

--
---- tablespace
--
--date
--create table insert_max_partition_num_date(col_date date)
--partition by range(col_date)
--interval ('1' day) store in (hw_partition_insert_tsp4, hw_partition_insert_tsp5, hw_partition_insert_tsp6)
--(
--	partition insert_max_partition_num_date_p1 values less than ('2012-1-25') tablespace hw_partition_insert_tsp4,
--	partition insert_max_partition_num_date_p2 values less than ('2012-2-25') tablespace hw_partition_insert_tsp5,
--	partition insert_max_partition_num_date_p3 values less than ('2012-3-25') tablespace hw_partition_insert_tsp6
--);

--
---- test with where conditions
--
--select * from interval_normal_date where logdate < '2020-06-01';
--ERROR:  pruning result(PartitionIdentifier) is invalid

--
---- test with maxvalue
--

--
---- test with null
--

--
---- test support interval type maxvalue
-- Hour, Day, month, timestamp, timestamptz, date 
--


--
---- test month interval increase, specific Feb
--

--
-- clean up
--
drop tablespace hw_partition_interval_tsp4;
drop tablespace hw_partition_interval_tsp5;
drop tablespace hw_partition_interval_tsp6;
\! rm -fr '@testtablespace@/hw_partition_interval_tsp4'
\! rm -fr '@testtablespace@/hw_partition_interval_tsp5'
\! rm -fr '@testtablespace@/hw_partition_interval_tsp6'