1418 lines
76 KiB
Plaintext
1418 lines
76 KiB
Plaintext
--
|
|
-- PARTITION_SPLIT
|
|
-- Tests for "ALTER TABLE ... SPLIT PARTITION ..." command
|
|
--
|
|
CREATE SCHEMA partition_split_schema;
|
|
SET search_path = partition_split_schema, public;
|
|
--
|
|
-- BY RANGE partitioning
|
|
--
|
|
--
|
|
-- Test for error codes
|
|
--
|
|
CREATE TABLE sales_range (salesman_id int, salesman_name varchar(30), sales_amount int, sales_date date) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
|
CREATE TABLE sales_feb_mar_apr2022 PARTITION OF sales_range FOR VALUES FROM ('2022-02-01') TO ('2022-05-01');
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
-- ERROR: relation "sales_xxx" does not exist
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_xxx INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: relation "sales_xxx" does not exist
|
|
-- ERROR: relation "sales_jan2022" already exists
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_jan2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: relation "sales_jan2022" already exists
|
|
-- ERROR: invalid bound specification for a range partition
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_jan2022 FOR VALUES IN ('2022-05-01', '2022-06-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: invalid bound specification for a range partition
|
|
LINE 2: (PARTITION sales_jan2022 FOR VALUES IN ('2022-05-01', '202...
|
|
^
|
|
-- ERROR: empty range bound specified for partition "sales_mar2022"
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-02-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: empty range bound specified for partition "sales_mar2022"
|
|
LINE 3: PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO...
|
|
^
|
|
DETAIL: Specified lower bound ('03-01-2022') is greater than or equal to upper bound ('02-01-2022').
|
|
--ERROR: list of split partitions should contains at least two items
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-10-01'));
|
|
ERROR: list of new partitions should contains at least two items
|
|
-- ERROR: lower bound of partition "sales_feb2022" is less than lower bound of split partition
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-01-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: lower bound of partition "sales_feb2022" is less than lower bound of split partition
|
|
LINE 2: (PARTITION sales_feb2022 FOR VALUES FROM ('2022-01-01') TO...
|
|
^
|
|
-- ERROR: name "sales_feb_mar_apr2022" already used
|
|
-- (We can create partition with the same name as split partition, but can't create two partitions with the same name)
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: name "sales_feb_mar_apr2022" already used
|
|
LINE 3: PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-03...
|
|
^
|
|
-- ERROR: name "sales_feb2022" already used
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_feb2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: name "sales_feb2022" already used
|
|
LINE 3: PARTITION sales_feb2022 FOR VALUES FROM ('2022-03-01') TO...
|
|
^
|
|
-- ERROR: "sales_feb_mar_apr2022" is not a partitioned table
|
|
ALTER TABLE sales_feb_mar_apr2022 SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_jan2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_feb2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: "sales_feb_mar_apr2022" is not a partitioned table
|
|
-- ERROR: upper bound of partition "sales_apr2022" is greater than upper bound of split partition
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-01'));
|
|
ERROR: upper bound of partition "sales_apr2022" is greater than upper bound of split partition
|
|
LINE 4: ... sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-0...
|
|
^
|
|
-- ERROR: lower bound of partition "sales_mar2022" is not equals to upper bound of previous partition
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-02-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_feb2022"
|
|
LINE 3: PARTITION sales_mar2022 FOR VALUES FROM ('2022-02-01') TO...
|
|
^
|
|
-- Tests for spaces between partitions, them should be executed without DEFAULT partition
|
|
ALTER TABLE sales_range DETACH PARTITION sales_others;
|
|
-- ERROR: lower bound of partition "sales_feb2022" is not equals to lower bound of split partition
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-02') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
ERROR: lower bound of partition "sales_feb2022" is not equals to lower bound of split partition
|
|
LINE 2: (PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-02') TO...
|
|
^
|
|
DROP TABLE sales_range;
|
|
DROP TABLE sales_others;
|
|
--
|
|
-- Add rows into partitioned table then split partition
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
|
CREATE TABLE sales_feb_mar_apr2022 PARTITION OF sales_range FOR VALUES FROM ('2022-02-01') TO ('2022-05-01');
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
INSERT INTO sales_range VALUES (1, 'May', 1000, '2022-01-31');
|
|
INSERT INTO sales_range VALUES (2, 'Smirnoff', 500, '2022-02-10');
|
|
INSERT INTO sales_range VALUES (3, 'Ford', 2000, '2022-04-30');
|
|
INSERT INTO sales_range VALUES (4, 'Ivanov', 750, '2022-04-13');
|
|
INSERT INTO sales_range VALUES (5, 'Deev', 250, '2022-04-07');
|
|
INSERT INTO sales_range VALUES (6, 'Poirot', 150, '2022-02-11');
|
|
INSERT INTO sales_range VALUES (7, 'Li', 175, '2022-03-08');
|
|
INSERT INTO sales_range VALUES (8, 'Ericsson', 185, '2022-02-23');
|
|
INSERT INTO sales_range VALUES (9, 'Muller', 250, '2022-03-11');
|
|
INSERT INTO sales_range VALUES (10, 'Halder', 350, '2022-01-28');
|
|
INSERT INTO sales_range VALUES (11, 'Trump', 380, '2022-04-06');
|
|
INSERT INTO sales_range VALUES (12, 'Plato', 350, '2022-03-19');
|
|
INSERT INTO sales_range VALUES (13, 'Gandi', 377, '2022-01-09');
|
|
INSERT INTO sales_range VALUES (14, 'Smith', 510, '2022-05-04');
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
SELECT * FROM sales_range;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(14 rows)
|
|
|
|
SELECT * FROM sales_jan2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_feb2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_mar2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_apr2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_others;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
14 | Smith | 510 | 05-04-2022
|
|
(1 row)
|
|
|
|
DROP TABLE sales_range CASCADE;
|
|
--
|
|
-- Add split partition then add rows into partitioned table
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
|
CREATE TABLE sales_feb_mar_apr2022 PARTITION OF sales_range FOR VALUES FROM ('2022-02-01') TO ('2022-05-01');
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
INSERT INTO sales_range VALUES (1, 'May', 1000, '2022-01-31');
|
|
INSERT INTO sales_range VALUES (2, 'Smirnoff', 500, '2022-02-10');
|
|
INSERT INTO sales_range VALUES (3, 'Ford', 2000, '2022-04-30');
|
|
INSERT INTO sales_range VALUES (4, 'Ivanov', 750, '2022-04-13');
|
|
INSERT INTO sales_range VALUES (5, 'Deev', 250, '2022-04-07');
|
|
INSERT INTO sales_range VALUES (6, 'Poirot', 150, '2022-02-11');
|
|
INSERT INTO sales_range VALUES (7, 'Li', 175, '2022-03-08');
|
|
INSERT INTO sales_range VALUES (8, 'Ericsson', 185, '2022-02-23');
|
|
INSERT INTO sales_range VALUES (9, 'Muller', 250, '2022-03-11');
|
|
INSERT INTO sales_range VALUES (10, 'Halder', 350, '2022-01-28');
|
|
INSERT INTO sales_range VALUES (11, 'Trump', 380, '2022-04-06');
|
|
INSERT INTO sales_range VALUES (12, 'Plato', 350, '2022-03-19');
|
|
INSERT INTO sales_range VALUES (13, 'Gandi', 377, '2022-01-09');
|
|
INSERT INTO sales_range VALUES (14, 'Smith', 510, '2022-05-04');
|
|
SELECT * FROM sales_range;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(14 rows)
|
|
|
|
SELECT * FROM sales_jan2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_feb2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_mar2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_apr2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_others;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
14 | Smith | 510 | 05-04-2022
|
|
(1 row)
|
|
|
|
DROP TABLE sales_range CASCADE;
|
|
--
|
|
-- Test for:
|
|
-- * composite partition key;
|
|
-- * GENERATED column;
|
|
-- * column with DEFAULT value.
|
|
--
|
|
CREATE TABLE sales_date (salesman_name VARCHAR(30), sales_year INT, sales_month INT, sales_day INT,
|
|
sales_date VARCHAR(10) GENERATED ALWAYS AS
|
|
(LPAD(sales_year::text, 4, '0') || '.' || LPAD(sales_month::text, 2, '0') || '.' || LPAD(sales_day::text, 2, '0')) STORED,
|
|
sales_department VARCHAR(30) DEFAULT 'Sales department')
|
|
PARTITION BY RANGE (sales_year, sales_month, sales_day);
|
|
CREATE TABLE sales_dec2022 PARTITION OF sales_date FOR VALUES FROM (2021, 12, 1) TO (2022, 1, 1);
|
|
CREATE TABLE sales_jan_feb2022 PARTITION OF sales_date FOR VALUES FROM (2022, 1, 1) TO (2022, 3, 1);
|
|
CREATE TABLE sales_other PARTITION OF sales_date FOR VALUES FROM (2022, 3, 1) TO (MAXVALUE, MAXVALUE, MAXVALUE);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager1', 2021, 12, 7);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager2', 2021, 12, 8);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager3', 2022, 1, 1);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager1', 2022, 2, 4);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager2', 2022, 1, 2);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager3', 2022, 2, 1);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager1', 2022, 3, 3);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager2', 2022, 3, 4);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager3', 2022, 5, 1);
|
|
SELECT * FROM sales_date;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager1 | 2021 | 12 | 7 | 2021.12.07 | Sales department
|
|
Manager2 | 2021 | 12 | 8 | 2021.12.08 | Sales department
|
|
Manager3 | 2022 | 1 | 1 | 2022.01.01 | Sales department
|
|
Manager1 | 2022 | 2 | 4 | 2022.02.04 | Sales department
|
|
Manager2 | 2022 | 1 | 2 | 2022.01.02 | Sales department
|
|
Manager3 | 2022 | 2 | 1 | 2022.02.01 | Sales department
|
|
Manager1 | 2022 | 3 | 3 | 2022.03.03 | Sales department
|
|
Manager2 | 2022 | 3 | 4 | 2022.03.04 | Sales department
|
|
Manager3 | 2022 | 5 | 1 | 2022.05.01 | Sales department
|
|
(9 rows)
|
|
|
|
SELECT * FROM sales_dec2022;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager1 | 2021 | 12 | 7 | 2021.12.07 | Sales department
|
|
Manager2 | 2021 | 12 | 8 | 2021.12.08 | Sales department
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_jan_feb2022;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager3 | 2022 | 1 | 1 | 2022.01.01 | Sales department
|
|
Manager1 | 2022 | 2 | 4 | 2022.02.04 | Sales department
|
|
Manager2 | 2022 | 1 | 2 | 2022.01.02 | Sales department
|
|
Manager3 | 2022 | 2 | 1 | 2022.02.01 | Sales department
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_other;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager1 | 2022 | 3 | 3 | 2022.03.03 | Sales department
|
|
Manager2 | 2022 | 3 | 4 | 2022.03.04 | Sales department
|
|
Manager3 | 2022 | 5 | 1 | 2022.05.01 | Sales department
|
|
(3 rows)
|
|
|
|
ALTER TABLE sales_date SPLIT PARTITION sales_jan_feb2022 INTO
|
|
(PARTITION sales_jan2022 FOR VALUES FROM (2022, 1, 1) TO (2022, 2, 1),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (2022, 2, 1) TO (2022, 3, 1));
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager1', 2022, 1, 10);
|
|
INSERT INTO sales_date(salesman_name, sales_year, sales_month, sales_day) VALUES ('Manager2', 2022, 2, 10);
|
|
SELECT * FROM sales_date;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager1 | 2021 | 12 | 7 | 2021.12.07 | Sales department
|
|
Manager2 | 2021 | 12 | 8 | 2021.12.08 | Sales department
|
|
Manager3 | 2022 | 1 | 1 | 2022.01.01 | Sales department
|
|
Manager2 | 2022 | 1 | 2 | 2022.01.02 | Sales department
|
|
Manager1 | 2022 | 1 | 10 | 2022.01.10 | Sales department
|
|
Manager1 | 2022 | 2 | 4 | 2022.02.04 | Sales department
|
|
Manager3 | 2022 | 2 | 1 | 2022.02.01 | Sales department
|
|
Manager2 | 2022 | 2 | 10 | 2022.02.10 | Sales department
|
|
Manager1 | 2022 | 3 | 3 | 2022.03.03 | Sales department
|
|
Manager2 | 2022 | 3 | 4 | 2022.03.04 | Sales department
|
|
Manager3 | 2022 | 5 | 1 | 2022.05.01 | Sales department
|
|
(11 rows)
|
|
|
|
SELECT * FROM sales_dec2022;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager1 | 2021 | 12 | 7 | 2021.12.07 | Sales department
|
|
Manager2 | 2021 | 12 | 8 | 2021.12.08 | Sales department
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_jan2022;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager3 | 2022 | 1 | 1 | 2022.01.01 | Sales department
|
|
Manager2 | 2022 | 1 | 2 | 2022.01.02 | Sales department
|
|
Manager1 | 2022 | 1 | 10 | 2022.01.10 | Sales department
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_feb2022;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager1 | 2022 | 2 | 4 | 2022.02.04 | Sales department
|
|
Manager3 | 2022 | 2 | 1 | 2022.02.01 | Sales department
|
|
Manager2 | 2022 | 2 | 10 | 2022.02.10 | Sales department
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_other;
|
|
salesman_name | sales_year | sales_month | sales_day | sales_date | sales_department
|
|
---------------+------------+-------------+-----------+------------+------------------
|
|
Manager1 | 2022 | 3 | 3 | 2022.03.03 | Sales department
|
|
Manager2 | 2022 | 3 | 4 | 2022.03.04 | Sales department
|
|
Manager3 | 2022 | 5 | 1 | 2022.05.01 | Sales department
|
|
(3 rows)
|
|
|
|
--ERROR: relation "sales_jan_feb2022" does not exist
|
|
SELECT * FROM sales_jan_feb2022;
|
|
ERROR: relation "sales_jan_feb2022" does not exist
|
|
LINE 1: SELECT * FROM sales_jan_feb2022;
|
|
^
|
|
DROP TABLE sales_date CASCADE;
|
|
--
|
|
-- Test: split DEFAULT partition; using a index on partition key; check index after split
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
CREATE INDEX sales_range_sales_date_idx ON sales_range USING btree (sales_date);
|
|
INSERT INTO sales_range VALUES (1, 'May', 1000, '2022-01-31');
|
|
INSERT INTO sales_range VALUES (2, 'Smirnoff', 500, '2022-02-10');
|
|
INSERT INTO sales_range VALUES (3, 'Ford', 2000, '2022-04-30');
|
|
INSERT INTO sales_range VALUES (4, 'Ivanov', 750, '2022-04-13');
|
|
INSERT INTO sales_range VALUES (5, 'Deev', 250, '2022-04-07');
|
|
INSERT INTO sales_range VALUES (6, 'Poirot', 150, '2022-02-11');
|
|
INSERT INTO sales_range VALUES (7, 'Li', 175, '2022-03-08');
|
|
INSERT INTO sales_range VALUES (8, 'Ericsson', 185, '2022-02-23');
|
|
INSERT INTO sales_range VALUES (9, 'Muller', 250, '2022-03-11');
|
|
INSERT INTO sales_range VALUES (10, 'Halder', 350, '2022-01-28');
|
|
INSERT INTO sales_range VALUES (11, 'Trump', 380, '2022-04-06');
|
|
INSERT INTO sales_range VALUES (12, 'Plato', 350, '2022-03-19');
|
|
INSERT INTO sales_range VALUES (13, 'Gandi', 377, '2022-01-09');
|
|
INSERT INTO sales_range VALUES (14, 'Smith', 510, '2022-05-04');
|
|
SELECT * FROM sales_others;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
7 | Li | 175 | 03-08-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(11 rows)
|
|
|
|
SELECT * FROM pg_indexes WHERE tablename = 'sales_others' and schemaname = 'partition_split_schema';
|
|
schemaname | tablename | indexname | tablespace | indexdef
|
|
------------------------+--------------+-----------------------------+------------+----------------------------------------------------------------------------------------------------------
|
|
partition_split_schema | sales_others | sales_others_sales_date_idx | | CREATE INDEX sales_others_sales_date_idx ON partition_split_schema.sales_others USING btree (sales_date)
|
|
(1 row)
|
|
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'),
|
|
PARTITION sales_others DEFAULT);
|
|
-- Use indexscan for test indexes
|
|
SET enable_indexscan = ON;
|
|
SET enable_seqscan = OFF;
|
|
SELECT * FROM sales_feb2022 where sales_date > '2022-01-01';
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_mar2022 where sales_date > '2022-01-01';
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_apr2022 where sales_date > '2022-01-01';
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
11 | Trump | 380 | 04-06-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_others where sales_date > '2022-01-01';
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
14 | Smith | 510 | 05-04-2022
|
|
(1 row)
|
|
|
|
SET enable_indexscan = ON;
|
|
SET enable_seqscan = ON;
|
|
SELECT * FROM pg_indexes WHERE tablename = 'sales_feb2022' and schemaname = 'partition_split_schema';
|
|
schemaname | tablename | indexname | tablespace | indexdef
|
|
------------------------+---------------+------------------------------+------------+------------------------------------------------------------------------------------------------------------
|
|
partition_split_schema | sales_feb2022 | sales_feb2022_sales_date_idx | | CREATE INDEX sales_feb2022_sales_date_idx ON partition_split_schema.sales_feb2022 USING btree (sales_date)
|
|
(1 row)
|
|
|
|
SELECT * FROM pg_indexes WHERE tablename = 'sales_mar2022' and schemaname = 'partition_split_schema';
|
|
schemaname | tablename | indexname | tablespace | indexdef
|
|
------------------------+---------------+------------------------------+------------+------------------------------------------------------------------------------------------------------------
|
|
partition_split_schema | sales_mar2022 | sales_mar2022_sales_date_idx | | CREATE INDEX sales_mar2022_sales_date_idx ON partition_split_schema.sales_mar2022 USING btree (sales_date)
|
|
(1 row)
|
|
|
|
SELECT * FROM pg_indexes WHERE tablename = 'sales_apr2022' and schemaname = 'partition_split_schema';
|
|
schemaname | tablename | indexname | tablespace | indexdef
|
|
------------------------+---------------+------------------------------+------------+------------------------------------------------------------------------------------------------------------
|
|
partition_split_schema | sales_apr2022 | sales_apr2022_sales_date_idx | | CREATE INDEX sales_apr2022_sales_date_idx ON partition_split_schema.sales_apr2022 USING btree (sales_date)
|
|
(1 row)
|
|
|
|
SELECT * FROM pg_indexes WHERE tablename = 'sales_others' and schemaname = 'partition_split_schema';
|
|
schemaname | tablename | indexname | tablespace | indexdef
|
|
------------------------+--------------+------------------------------+------------+-----------------------------------------------------------------------------------------------------------
|
|
partition_split_schema | sales_others | sales_others_sales_date_idx1 | | CREATE INDEX sales_others_sales_date_idx1 ON partition_split_schema.sales_others USING btree (sales_date)
|
|
(1 row)
|
|
|
|
DROP TABLE sales_range CASCADE;
|
|
--
|
|
-- Test: some cases for split DEFAULT partition (different bounds)
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date INT) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
-- sales_error intersects with sales_dec2022 (lower bound)
|
|
-- ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_error FOR VALUES FROM (20211230) TO (20220201),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
|
PARTITION sales_others DEFAULT);
|
|
ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
|
LINE 3: PARTITION sales_error FOR VALUES FROM (20211230) TO (2022...
|
|
^
|
|
-- sales_error intersects with sales_feb2022 (upper bound)
|
|
-- ERROR: lower bound of partition "sales_feb2022" conflicts with upper bound of previous partition "sales_error"
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_error FOR VALUES FROM (20220101) TO (20220202),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
|
PARTITION sales_others DEFAULT);
|
|
ERROR: lower bound of partition "sales_feb2022" conflicts with upper bound of previous partition "sales_error"
|
|
LINE 4: PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20...
|
|
^
|
|
-- sales_error intersects with sales_dec2022 (inside bound)
|
|
-- ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_error FOR VALUES FROM (20211210) TO (20211220),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
|
PARTITION sales_others DEFAULT);
|
|
ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
|
LINE 3: PARTITION sales_error FOR VALUES FROM (20211210) TO (2021...
|
|
^
|
|
-- sales_error intersects with sales_dec2022 (exact the same bounds)
|
|
-- ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_error FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
|
PARTITION sales_others DEFAULT);
|
|
ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
|
LINE 3: PARTITION sales_error FOR VALUES FROM (20211201) TO (2022...
|
|
^
|
|
-- ERROR: any partition in the list should be DEFAULT because split partition is DEFAULT
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_jan2022 FOR VALUES FROM (20220101) TO (20220201),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301));
|
|
ERROR: any partition in the list should be DEFAULT because split partition is DEFAULT
|
|
LINE 2: (PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20...
|
|
^
|
|
-- no error: bounds of sales_noerror between sales_dec2022 and sales_feb2022
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_noerror FOR VALUES FROM (20220110) TO (20220120),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
|
PARTITION sales_others DEFAULT);
|
|
DROP TABLE sales_range;
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date INT) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
-- no error: bounds of sales_noerror equals to lower and upper bounds of sales_dec2022 and sales_feb2022
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
|
PARTITION sales_noerror FOR VALUES FROM (20210101) TO (20210201),
|
|
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
|
PARTITION sales_others DEFAULT);
|
|
DROP TABLE sales_range;
|
|
--
|
|
-- Test: split partition with CHECK and FOREIGN KEY CONSTRAINTs on partitioned table
|
|
--
|
|
CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30));
|
|
INSERT INTO salesmans VALUES (1, 'Poirot');
|
|
CREATE TABLE sales_range (
|
|
salesman_id INT REFERENCES salesmans(salesman_id),
|
|
sales_amount INT CHECK (sales_amount > 1),
|
|
sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
|
CREATE TABLE sales_feb_mar_apr2022 PARTITION OF sales_range FOR VALUES FROM ('2022-02-01') TO ('2022-05-01');
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_feb_mar_apr2022'::regclass::oid;
|
|
pg_get_constraintdef | conname | conkey
|
|
-------------------------------------------------------------+--------------------------------+--------
|
|
CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2}
|
|
FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1}
|
|
(2 rows)
|
|
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
|
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
|
-- We should see the same CONSTRAINTs as on sales_feb_mar_apr2022 partition
|
|
SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_feb2022'::regclass::oid;
|
|
pg_get_constraintdef | conname | conkey
|
|
-------------------------------------------------------------+--------------------------------+--------
|
|
CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2}
|
|
FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1}
|
|
(2 rows)
|
|
|
|
SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_mar2022'::regclass::oid;
|
|
pg_get_constraintdef | conname | conkey
|
|
-------------------------------------------------------------+--------------------------------+--------
|
|
CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2}
|
|
FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1}
|
|
(2 rows)
|
|
|
|
SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_apr2022'::regclass::oid;
|
|
pg_get_constraintdef | conname | conkey
|
|
-------------------------------------------------------------+--------------------------------+--------
|
|
CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2}
|
|
FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1}
|
|
(2 rows)
|
|
|
|
-- ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_salesman_id_check"
|
|
INSERT INTO sales_range VALUES (1, 0, '2022-03-11');
|
|
ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_sales_amount_check"
|
|
DETAIL: Failing row contains (1, 0, 03-11-2022).
|
|
-- ERROR: insert or update on table "sales_mar2022" violates foreign key constraint "sales_range_salesman_id_fkey"
|
|
INSERT INTO sales_range VALUES (-1, 10, '2022-03-11');
|
|
ERROR: insert or update on table "sales_mar2022" violates foreign key constraint "sales_range_salesman_id_fkey"
|
|
DETAIL: Key (salesman_id)=(-1) is not present in table "salesmans".
|
|
-- ok
|
|
INSERT INTO sales_range VALUES (1, 10, '2022-03-11');
|
|
DROP TABLE sales_range CASCADE;
|
|
DROP TABLE salesmans CASCADE;
|
|
--
|
|
-- Test: split partition on partitioned table in case exists FOREIGN KEY reference from another table
|
|
--
|
|
CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
|
CREATE TABLE sales (salesman_id INT REFERENCES salesmans(salesman_id), sales_amount INT, sales_date DATE);
|
|
CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10);
|
|
CREATE TABLE salesmans10_40 PARTITION OF salesmans FOR VALUES FROM (10) TO (40);
|
|
INSERT INTO salesmans VALUES (1, 'Poirot');
|
|
INSERT INTO salesmans VALUES (10, 'May');
|
|
INSERT INTO salesmans VALUES (19, 'Ivanov');
|
|
INSERT INTO salesmans VALUES (20, 'Smirnoff');
|
|
INSERT INTO salesmans VALUES (30, 'Ford');
|
|
INSERT INTO sales VALUES (1, 100, '2022-03-01');
|
|
INSERT INTO sales VALUES (1, 110, '2022-03-02');
|
|
INSERT INTO sales VALUES (10, 150, '2022-03-01');
|
|
INSERT INTO sales VALUES (10, 90, '2022-03-03');
|
|
INSERT INTO sales VALUES (19, 200, '2022-03-04');
|
|
INSERT INTO sales VALUES (20, 50, '2022-03-12');
|
|
INSERT INTO sales VALUES (20, 170, '2022-03-02');
|
|
INSERT INTO sales VALUES (30, 30, '2022-03-04');
|
|
SELECT * FROM salesmans01_10;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
1 | Poirot
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans10_40;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
10 | May
|
|
19 | Ivanov
|
|
20 | Smirnoff
|
|
30 | Ford
|
|
(4 rows)
|
|
|
|
ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO
|
|
(PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20),
|
|
PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30),
|
|
PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40));
|
|
SELECT * FROM salesmans01_10;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
1 | Poirot
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans10_20;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
10 | May
|
|
19 | Ivanov
|
|
(2 rows)
|
|
|
|
SELECT * FROM salesmans20_30;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
20 | Smirnoff
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans30_40;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
30 | Ford
|
|
(1 row)
|
|
|
|
-- ERROR: insert or update on table "sales" violates foreign key constraint "sales_salesman_id_fkey"
|
|
INSERT INTO sales VALUES (40, 50, '2022-03-04');
|
|
ERROR: insert or update on table "sales" violates foreign key constraint "sales_salesman_id_fkey"
|
|
DETAIL: Key (salesman_id)=(40) is not present in table "salesmans".
|
|
-- ok
|
|
INSERT INTO sales VALUES (30, 50, '2022-03-04');
|
|
DROP TABLE sales CASCADE;
|
|
DROP TABLE salesmans CASCADE;
|
|
--
|
|
-- Test: split partition of partitioned table with triggers
|
|
--
|
|
CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
|
CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10);
|
|
CREATE TABLE salesmans10_40 PARTITION OF salesmans FOR VALUES FROM (10) TO (40);
|
|
INSERT INTO salesmans VALUES (1, 'Poirot');
|
|
CREATE OR REPLACE FUNCTION after_insert_row_trigger() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$
|
|
BEGIN
|
|
RAISE NOTICE 'trigger(%) called: action = %, when = %, level = %', TG_ARGV[0], TG_OP, TG_WHEN, TG_LEVEL;
|
|
RETURN NULL;
|
|
END;
|
|
$BODY$;
|
|
CREATE TRIGGER salesmans_after_insert_statement_trigger
|
|
AFTER INSERT
|
|
ON salesmans
|
|
FOR EACH STATEMENT
|
|
EXECUTE PROCEDURE after_insert_row_trigger('salesmans');
|
|
CREATE TRIGGER salesmans_after_insert_row_trigger
|
|
AFTER INSERT
|
|
ON salesmans
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE after_insert_row_trigger('salesmans');
|
|
-- 2 triggers should fire here (row + statement):
|
|
INSERT INTO salesmans VALUES (10, 'May');
|
|
NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW
|
|
NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = STATEMENT
|
|
-- 1 trigger should fire here (row):
|
|
INSERT INTO salesmans10_40 VALUES (19, 'Ivanov');
|
|
NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW
|
|
ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO
|
|
(PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20),
|
|
PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30),
|
|
PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40));
|
|
-- 2 triggers should fire here (row + statement):
|
|
INSERT INTO salesmans VALUES (20, 'Smirnoff');
|
|
NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW
|
|
NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = STATEMENT
|
|
-- 1 trigger should fire here (row):
|
|
INSERT INTO salesmans30_40 VALUES (30, 'Ford');
|
|
NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW
|
|
SELECT * FROM salesmans01_10;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
1 | Poirot
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans10_20;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
10 | May
|
|
19 | Ivanov
|
|
(2 rows)
|
|
|
|
SELECT * FROM salesmans20_30;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
20 | Smirnoff
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans30_40;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
30 | Ford
|
|
(1 row)
|
|
|
|
DROP TABLE salesmans CASCADE;
|
|
DROP FUNCTION after_insert_row_trigger();
|
|
--
|
|
-- Test: split partition witch identity column
|
|
-- If split partition column is identity-column, columns of new partitions are identity-columns too.
|
|
--
|
|
CREATE TABLE salesmans(salesman_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
|
CREATE TABLE salesmans1_2 PARTITION OF salesmans FOR VALUES FROM (1) TO (2);
|
|
-- Create new partition with identity-column:
|
|
CREATE TABLE salesmans2_5(salesman_id INT NOT NULL, salesman_name VARCHAR(30));
|
|
ALTER TABLE salesmans ATTACH PARTITION salesmans2_5 FOR VALUES FROM (2) TO (5);
|
|
INSERT INTO salesmans (salesman_name) VALUES ('Poirot');
|
|
INSERT INTO salesmans (salesman_name) VALUES ('Ivanov');
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans1_2'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
-- Split partition has identity-column:
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_5'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
ALTER TABLE salesmans SPLIT PARTITION salesmans2_5 INTO
|
|
(PARTITION salesmans2_3 FOR VALUES FROM (2) TO (3),
|
|
PARTITION salesmans3_4 FOR VALUES FROM (3) TO (4),
|
|
PARTITION salesmans4_5 FOR VALUES FROM (4) TO (5));
|
|
INSERT INTO salesmans (salesman_name) VALUES ('May');
|
|
INSERT INTO salesmans (salesman_name) VALUES ('Ford');
|
|
SELECT * FROM salesmans1_2;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
1 | Poirot
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans2_3;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
2 | Ivanov
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans3_4;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
3 | May
|
|
(1 row)
|
|
|
|
SELECT * FROM salesmans4_5;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
4 | Ford
|
|
(1 row)
|
|
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans1_2'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
-- New partitions have identity-columns:
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_3'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans3_4'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans4_5'::regclass::oid;
|
|
attname | attidentity | attgenerated
|
|
---------------+-------------+--------------
|
|
salesman_id | a |
|
|
salesman_name | |
|
|
(2 rows)
|
|
|
|
DROP TABLE salesmans CASCADE;
|
|
--
|
|
-- Test: split partition with deleted columns
|
|
--
|
|
CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
|
CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10);
|
|
-- Create new partition with some deleted columns:
|
|
CREATE TABLE salesmans10_40(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, d2 INT, d3 DATE, salesman_name VARCHAR(30));
|
|
INSERT INTO salesmans10_40 VALUES ('dummy value 1', 19, 100, now(), 'Ivanov');
|
|
INSERT INTO salesmans10_40 VALUES ('dummy value 2', 20, 101, now(), 'Smirnoff');
|
|
ALTER TABLE salesmans10_40 DROP COLUMN d1;
|
|
ALTER TABLE salesmans10_40 DROP COLUMN d2;
|
|
ALTER TABLE salesmans10_40 DROP COLUMN d3;
|
|
ALTER TABLE salesmans ATTACH PARTITION salesmans10_40 FOR VALUES FROM (10) TO (40);
|
|
INSERT INTO salesmans VALUES (1, 'Poirot');
|
|
INSERT INTO salesmans VALUES (10, 'May');
|
|
INSERT INTO salesmans VALUES (30, 'Ford');
|
|
ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO
|
|
(PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20),
|
|
PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30),
|
|
PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40));
|
|
select * from salesmans01_10;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
1 | Poirot
|
|
(1 row)
|
|
|
|
select * from salesmans10_20;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
19 | Ivanov
|
|
10 | May
|
|
(2 rows)
|
|
|
|
select * from salesmans20_30;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
20 | Smirnoff
|
|
(1 row)
|
|
|
|
select * from salesmans30_40;
|
|
salesman_id | salesman_name
|
|
-------------+---------------
|
|
30 | Ford
|
|
(1 row)
|
|
|
|
DROP TABLE salesmans CASCADE;
|
|
--
|
|
-- Test: split sub-partition
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
|
CREATE TABLE sales_feb2022 PARTITION OF sales_range FOR VALUES FROM ('2022-02-01') TO ('2022-03-01');
|
|
CREATE TABLE sales_mar2022 PARTITION OF sales_range FOR VALUES FROM ('2022-03-01') TO ('2022-04-01');
|
|
CREATE TABLE sales_apr2022 (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_apr_all PARTITION OF sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01');
|
|
ALTER TABLE sales_range ATTACH PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01');
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
CREATE INDEX sales_range_sales_date_idx ON sales_range USING btree (sales_date);
|
|
INSERT INTO sales_range VALUES (1, 'May', 1000, '2022-01-31');
|
|
INSERT INTO sales_range VALUES (2, 'Smirnoff', 500, '2022-02-10');
|
|
INSERT INTO sales_range VALUES (3, 'Ford', 2000, '2022-04-30');
|
|
INSERT INTO sales_range VALUES (4, 'Ivanov', 750, '2022-04-13');
|
|
INSERT INTO sales_range VALUES (5, 'Deev', 250, '2022-04-07');
|
|
INSERT INTO sales_range VALUES (6, 'Poirot', 150, '2022-02-11');
|
|
INSERT INTO sales_range VALUES (7, 'Li', 175, '2022-03-08');
|
|
INSERT INTO sales_range VALUES (8, 'Ericsson', 185, '2022-02-23');
|
|
INSERT INTO sales_range VALUES (9, 'Muller', 250, '2022-03-11');
|
|
INSERT INTO sales_range VALUES (10, 'Halder', 350, '2022-01-28');
|
|
INSERT INTO sales_range VALUES (11, 'Trump', 380, '2022-04-06');
|
|
INSERT INTO sales_range VALUES (12, 'Plato', 350, '2022-03-19');
|
|
INSERT INTO sales_range VALUES (13, 'Gandi', 377, '2022-01-09');
|
|
INSERT INTO sales_range VALUES (14, 'Smith', 510, '2022-05-04');
|
|
SELECT * FROM sales_range;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(14 rows)
|
|
|
|
SELECT * FROM sales_apr2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
(4 rows)
|
|
|
|
ALTER TABLE sales_apr2022 SPLIT PARTITION sales_apr_all INTO
|
|
(PARTITION sales_apr2022_01_10 FOR VALUES FROM ('2022-04-01') TO ('2022-04-10'),
|
|
PARTITION sales_apr2022_10_20 FOR VALUES FROM ('2022-04-10') TO ('2022-04-20'),
|
|
PARTITION sales_apr2022_20_30 FOR VALUES FROM ('2022-04-20') TO ('2022-05-01'));
|
|
SELECT * FROM sales_range;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(14 rows)
|
|
|
|
SELECT * FROM sales_apr2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_apr2022_01_10;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_apr2022_10_20;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
(1 row)
|
|
|
|
SELECT * FROM sales_apr2022_20_30;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
3 | Ford | 2000 | 04-30-2022
|
|
(1 row)
|
|
|
|
DROP TABLE sales_range;
|
|
--
|
|
-- BY LIST partitioning
|
|
--
|
|
--
|
|
-- Test: specific errors for BY LIST partitioning
|
|
--
|
|
CREATE TABLE sales_list
|
|
(salesman_id INT,
|
|
salesman_name VARCHAR(30),
|
|
sales_state VARCHAR(20),
|
|
sales_amount INT,
|
|
sales_date DATE)
|
|
PARTITION BY LIST (sales_state);
|
|
CREATE TABLE sales_nord PARTITION OF sales_list FOR VALUES IN ('Oslo', 'St. Petersburg', 'Helsinki');
|
|
CREATE TABLE sales_all PARTITION OF sales_list FOR VALUES IN ('Warsaw', 'Lisbon', 'New York', 'Madrid', 'Bejing', 'Berlin', 'Delhi', 'Kyiv', 'Vladivostok');
|
|
CREATE TABLE sales_others PARTITION OF sales_list DEFAULT;
|
|
-- ERROR: partition "sales_east" would overlap partition "sales_nord"
|
|
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
|
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok', 'Helsinki'),
|
|
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Kyiv'));
|
|
ERROR: new partition "sales_east" would overlap with another (not split) partition "sales_nord"
|
|
LINE 3: ... FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok', 'Helsinki'...
|
|
^
|
|
-- ERROR: new partition "sales_west" would overlap with another new partition "sales_central"
|
|
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
|
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
|
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Lisbon', 'Kyiv'));
|
|
ERROR: new partition "sales_west" would overlap with another new partition "sales_central"
|
|
LINE 2: (PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York',...
|
|
^
|
|
-- ERROR: new partition "sales_west" cannot have NULL value because split partition does not have
|
|
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid', NULL),
|
|
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
|
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Kyiv'));
|
|
ERROR: new partition "sales_west" cannot have NULL value because split partition does not have
|
|
LINE 2: ...s_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid', NULL),
|
|
^
|
|
DROP TABLE sales_list;
|
|
--
|
|
-- Test: two specific errors for BY LIST partitioning:
|
|
-- * new partitions not has NULL value that split partition has.
|
|
-- * new partitions not has a value that split partition has.
|
|
--
|
|
CREATE TABLE sales_list
|
|
(salesman_id INT,
|
|
salesman_name VARCHAR(30),
|
|
sales_state VARCHAR(20),
|
|
sales_amount INT,
|
|
sales_date DATE)
|
|
PARTITION BY LIST (sales_state);
|
|
CREATE TABLE sales_nord PARTITION OF sales_list FOR VALUES IN ('Helsinki', 'St. Petersburg', 'Oslo');
|
|
CREATE TABLE sales_all PARTITION OF sales_list FOR VALUES IN ('Warsaw', 'Lisbon', 'New York', 'Madrid', 'Bejing', 'Berlin', 'Delhi', 'Kyiv', 'Vladivostok', NULL);
|
|
-- ERROR: new partitions not have value NULL but split partition has
|
|
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
|
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
|
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Kyiv'));
|
|
ERROR: new partitions not have value NULL but split partition has
|
|
-- ERROR: new partitions not have value 'Kyiv' but split partition has
|
|
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
|
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
|
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', NULL));
|
|
ERROR: new partitions not have value 'Kyiv' but split partition has
|
|
DROP TABLE sales_list;
|
|
--
|
|
-- Test: BY LIST partitioning, SPLIT PARTITION with data
|
|
--
|
|
CREATE TABLE sales_list
|
|
(salesman_id SERIAL,
|
|
salesman_name VARCHAR(30),
|
|
sales_state VARCHAR(20),
|
|
sales_amount INT,
|
|
sales_date DATE)
|
|
PARTITION BY LIST (sales_state);
|
|
CREATE INDEX sales_list_salesman_name_idx ON sales_list USING btree (salesman_name);
|
|
CREATE INDEX sales_list_sales_state_idx ON sales_list USING btree (sales_state);
|
|
CREATE TABLE sales_nord PARTITION OF sales_list FOR VALUES IN ('Helsinki', 'St. Petersburg', 'Oslo');
|
|
CREATE TABLE sales_all PARTITION OF sales_list FOR VALUES IN ('Warsaw', 'Lisbon', 'New York', 'Madrid', 'Bejing', 'Berlin', 'Delhi', 'Kyiv', 'Vladivostok');
|
|
CREATE TABLE sales_others PARTITION OF sales_list DEFAULT;
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Trump', 'Bejing', 1000, '2022-03-01');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Smirnoff', 'New York', 500, '2022-03-03');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Ford', 'St. Petersburg', 2000, '2022-03-05');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Ivanov', 'Warsaw', 750, '2022-03-04');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Deev', 'Lisbon', 250, '2022-03-07');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Poirot', 'Berlin', 1000, '2022-03-01');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('May', 'Oslo', 1200, '2022-03-06');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Li', 'Vladivostok', 1150, '2022-03-09');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('May', 'Oslo', 1200, '2022-03-11');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Halder', 'Helsinki', 800, '2022-03-02');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Muller', 'Madrid', 650, '2022-03-05');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Smith', 'Kyiv', 350, '2022-03-10');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Gandi', 'Warsaw', 150, '2022-03-08');
|
|
INSERT INTO sales_list (salesman_name, sales_state, sales_amount, sales_date) VALUES ('Plato', 'Lisbon', 950, '2022-03-05');
|
|
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
|
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
|
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Kyiv'));
|
|
SELECT * FROM sales_list;
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+----------------+--------------+------------
|
|
1 | Trump | Bejing | 1000 | 03-01-2022
|
|
8 | Li | Vladivostok | 1150 | 03-09-2022
|
|
4 | Ivanov | Warsaw | 750 | 03-04-2022
|
|
6 | Poirot | Berlin | 1000 | 03-01-2022
|
|
12 | Smith | Kyiv | 350 | 03-10-2022
|
|
13 | Gandi | Warsaw | 150 | 03-08-2022
|
|
3 | Ford | St. Petersburg | 2000 | 03-05-2022
|
|
7 | May | Oslo | 1200 | 03-06-2022
|
|
9 | May | Oslo | 1200 | 03-11-2022
|
|
10 | Halder | Helsinki | 800 | 03-02-2022
|
|
2 | Smirnoff | New York | 500 | 03-03-2022
|
|
5 | Deev | Lisbon | 250 | 03-07-2022
|
|
11 | Muller | Madrid | 650 | 03-05-2022
|
|
14 | Plato | Lisbon | 950 | 03-05-2022
|
|
(14 rows)
|
|
|
|
SELECT * FROM sales_west;
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+-------------+--------------+------------
|
|
2 | Smirnoff | New York | 500 | 03-03-2022
|
|
5 | Deev | Lisbon | 250 | 03-07-2022
|
|
11 | Muller | Madrid | 650 | 03-05-2022
|
|
14 | Plato | Lisbon | 950 | 03-05-2022
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_east;
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+-------------+--------------+------------
|
|
1 | Trump | Bejing | 1000 | 03-01-2022
|
|
8 | Li | Vladivostok | 1150 | 03-09-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_nord;
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+----------------+--------------+------------
|
|
3 | Ford | St. Petersburg | 2000 | 03-05-2022
|
|
7 | May | Oslo | 1200 | 03-06-2022
|
|
9 | May | Oslo | 1200 | 03-11-2022
|
|
10 | Halder | Helsinki | 800 | 03-02-2022
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_central;
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+-------------+--------------+------------
|
|
4 | Ivanov | Warsaw | 750 | 03-04-2022
|
|
6 | Poirot | Berlin | 1000 | 03-01-2022
|
|
12 | Smith | Kyiv | 350 | 03-10-2022
|
|
13 | Gandi | Warsaw | 150 | 03-08-2022
|
|
(4 rows)
|
|
|
|
-- Use indexscan for test indexes after split partition
|
|
SET enable_indexscan = ON;
|
|
SET enable_seqscan = OFF;
|
|
SELECT * FROM sales_central WHERE sales_state = 'Warsaw';
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+-------------+--------------+------------
|
|
4 | Ivanov | Warsaw | 750 | 03-04-2022
|
|
13 | Gandi | Warsaw | 150 | 03-08-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_list WHERE sales_state = 'Warsaw';
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+-------------+--------------+------------
|
|
4 | Ivanov | Warsaw | 750 | 03-04-2022
|
|
13 | Gandi | Warsaw | 150 | 03-08-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_list WHERE salesman_name = 'Ivanov';
|
|
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
|
-------------+---------------+-------------+--------------+------------
|
|
4 | Ivanov | Warsaw | 750 | 03-04-2022
|
|
(1 row)
|
|
|
|
SET enable_indexscan = ON;
|
|
SET enable_seqscan = ON;
|
|
DROP TABLE sales_list;
|
|
--
|
|
-- Test for:
|
|
-- * split DEFAULT partition to partitions with spaces between bounds;
|
|
-- * random order of partitions in SPLIT PARTITION command.
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
INSERT INTO sales_range VALUES (1, 'May', 1000, '2022-01-31');
|
|
INSERT INTO sales_range VALUES (2, 'Smirnoff', 500, '2022-02-09');
|
|
INSERT INTO sales_range VALUES (3, 'Ford', 2000, '2022-04-30');
|
|
INSERT INTO sales_range VALUES (4, 'Ivanov', 750, '2022-04-13');
|
|
INSERT INTO sales_range VALUES (5, 'Deev', 250, '2022-04-07');
|
|
INSERT INTO sales_range VALUES (6, 'Poirot', 150, '2022-02-07');
|
|
INSERT INTO sales_range VALUES (7, 'Li', 175, '2022-03-08');
|
|
INSERT INTO sales_range VALUES (8, 'Ericsson', 185, '2022-02-23');
|
|
INSERT INTO sales_range VALUES (9, 'Muller', 250, '2022-03-11');
|
|
INSERT INTO sales_range VALUES (10, 'Halder', 350, '2022-01-28');
|
|
INSERT INTO sales_range VALUES (11, 'Trump', 380, '2022-04-06');
|
|
INSERT INTO sales_range VALUES (12, 'Plato', 350, '2022-03-19');
|
|
INSERT INTO sales_range VALUES (13, 'Gandi', 377, '2022-01-09');
|
|
INSERT INTO sales_range VALUES (14, 'Smith', 510, '2022-05-04');
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|
(PARTITION sales_others DEFAULT,
|
|
PARTITION sales_mar2022_1decade FOR VALUES FROM ('2022-03-01') TO ('2022-03-10'),
|
|
PARTITION sales_jan2022_1decade FOR VALUES FROM ('2022-01-01') TO ('2022-01-10'),
|
|
PARTITION sales_feb2022_1decade FOR VALUES FROM ('2022-02-01') TO ('2022-02-10'),
|
|
PARTITION sales_apr2022_1decade FOR VALUES FROM ('2022-04-01') TO ('2022-04-10'));
|
|
SELECT * FROM sales_jan2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
13 | Gandi | 377 | 01-09-2022
|
|
(1 row)
|
|
|
|
SELECT * FROM sales_feb2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
2 | Smirnoff | 500 | 02-09-2022
|
|
6 | Poirot | 150 | 02-07-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_mar2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
7 | Li | 175 | 03-08-2022
|
|
(1 row)
|
|
|
|
SELECT * FROM sales_apr2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_others;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(8 rows)
|
|
|
|
DROP TABLE sales_range;
|
|
--
|
|
-- Test for:
|
|
-- * split non-DEFAULT partition to partitions with spaces between bounds;
|
|
-- * random order of partitions in SPLIT PARTITION command.
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_all PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-05-01');
|
|
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
|
INSERT INTO sales_range VALUES (1, 'May', 1000, '2022-01-31');
|
|
INSERT INTO sales_range VALUES (2, 'Smirnoff', 500, '2022-02-09');
|
|
INSERT INTO sales_range VALUES (3, 'Ford', 2000, '2022-04-30');
|
|
INSERT INTO sales_range VALUES (4, 'Ivanov', 750, '2022-04-13');
|
|
INSERT INTO sales_range VALUES (5, 'Deev', 250, '2022-04-07');
|
|
INSERT INTO sales_range VALUES (6, 'Poirot', 150, '2022-02-07');
|
|
INSERT INTO sales_range VALUES (7, 'Li', 175, '2022-03-08');
|
|
INSERT INTO sales_range VALUES (8, 'Ericsson', 185, '2022-02-23');
|
|
INSERT INTO sales_range VALUES (9, 'Muller', 250, '2022-03-11');
|
|
INSERT INTO sales_range VALUES (10, 'Halder', 350, '2022-01-28');
|
|
INSERT INTO sales_range VALUES (11, 'Trump', 380, '2022-04-06');
|
|
INSERT INTO sales_range VALUES (12, 'Plato', 350, '2022-03-19');
|
|
INSERT INTO sales_range VALUES (13, 'Gandi', 377, '2022-01-09');
|
|
INSERT INTO sales_range VALUES (14, 'Smith', 510, '2022-05-04');
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_mar2022_1decade FOR VALUES FROM ('2022-03-01') TO ('2022-03-10'),
|
|
PARTITION sales_jan2022_1decade FOR VALUES FROM ('2022-01-01') TO ('2022-01-10'),
|
|
PARTITION sales_feb2022_1decade FOR VALUES FROM ('2022-02-01') TO ('2022-02-10'),
|
|
PARTITION sales_apr2022_1decade FOR VALUES FROM ('2022-04-01') TO ('2022-04-10'));
|
|
SELECT * FROM sales_jan2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
13 | Gandi | 377 | 01-09-2022
|
|
(1 row)
|
|
|
|
SELECT * FROM sales_feb2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
2 | Smirnoff | 500 | 02-09-2022
|
|
6 | Poirot | 150 | 02-07-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_mar2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
7 | Li | 175 | 03-08-2022
|
|
(1 row)
|
|
|
|
SELECT * FROM sales_apr2022_1decade;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
(2 rows)
|
|
|
|
SELECT * FROM sales_others;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
14 | Smith | 510 | 05-04-2022
|
|
1 | May | 1000 | 01-31-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
(8 rows)
|
|
|
|
DROP TABLE sales_range;
|
|
--
|
|
-- Test for split non-DEFAULT partition to DEFAULT partition + partitions
|
|
-- with spaces between bounds.
|
|
--
|
|
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
|
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
|
CREATE TABLE sales_all PARTITION OF sales_range FOR VALUES FROM ('2022-02-01') TO ('2022-05-01');
|
|
INSERT INTO sales_range VALUES (1, 'May', 1000, '2022-01-31');
|
|
INSERT INTO sales_range VALUES (2, 'Smirnoff', 500, '2022-02-10');
|
|
INSERT INTO sales_range VALUES (3, 'Ford', 2000, '2022-04-30');
|
|
INSERT INTO sales_range VALUES (4, 'Ivanov', 750, '2022-04-13');
|
|
INSERT INTO sales_range VALUES (5, 'Deev', 250, '2022-04-07');
|
|
INSERT INTO sales_range VALUES (6, 'Poirot', 150, '2022-02-11');
|
|
INSERT INTO sales_range VALUES (7, 'Li', 175, '2022-03-08');
|
|
INSERT INTO sales_range VALUES (8, 'Ericsson', 185, '2022-02-23');
|
|
INSERT INTO sales_range VALUES (9, 'Muller', 250, '2022-03-11');
|
|
INSERT INTO sales_range VALUES (10, 'Halder', 350, '2022-01-28');
|
|
INSERT INTO sales_range VALUES (11, 'Trump', 380, '2022-04-06');
|
|
INSERT INTO sales_range VALUES (12, 'Plato', 350, '2022-03-19');
|
|
INSERT INTO sales_range VALUES (13, 'Gandi', 377, '2022-01-09');
|
|
ALTER TABLE sales_range SPLIT PARTITION sales_all INTO
|
|
(PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'),
|
|
PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
|
PARTITION sales_others DEFAULT);
|
|
INSERT INTO sales_range VALUES (14, 'Smith', 510, '2022-05-04');
|
|
SELECT * FROM sales_range;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(14 rows)
|
|
|
|
SELECT * FROM sales_jan2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
1 | May | 1000 | 01-31-2022
|
|
10 | Halder | 350 | 01-28-2022
|
|
13 | Gandi | 377 | 01-09-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_feb2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
2 | Smirnoff | 500 | 02-10-2022
|
|
6 | Poirot | 150 | 02-11-2022
|
|
8 | Ericsson | 185 | 02-23-2022
|
|
(3 rows)
|
|
|
|
SELECT * FROM sales_apr2022;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
3 | Ford | 2000 | 04-30-2022
|
|
4 | Ivanov | 750 | 04-13-2022
|
|
5 | Deev | 250 | 04-07-2022
|
|
11 | Trump | 380 | 04-06-2022
|
|
(4 rows)
|
|
|
|
SELECT * FROM sales_others;
|
|
salesman_id | salesman_name | sales_amount | sales_date
|
|
-------------+---------------+--------------+------------
|
|
7 | Li | 175 | 03-08-2022
|
|
9 | Muller | 250 | 03-11-2022
|
|
12 | Plato | 350 | 03-19-2022
|
|
14 | Smith | 510 | 05-04-2022
|
|
(4 rows)
|
|
|
|
DROP TABLE sales_range;
|
|
--
|
|
DROP SCHEMA partition_split_schema;
|