Merge pull request #2359 from citusdata/pg11_features

Add regression tests related to new PG11 partitioning features
pull/2364/head
Murat Tuncer 2018-09-06 19:39:06 +03:00 committed by GitHub
commit 0c1bb26448
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 1017 additions and 24 deletions

View File

@ -18,15 +18,21 @@ SELECT substring(:'server_version', '\d+')::int AS server_version;
-- 1-) Distributing partitioned table -- 1-) Distributing partitioned table
-- create partitioned table -- create partitioned table
CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time); CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time);
CREATE TABLE partitioning_hash_test(id int, subid int) PARTITION BY HASH(subid);
-- create its partitions -- create its partitions
CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01'); CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01');
CREATE TABLE partitioning_hash_test_0 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE partitioning_hash_test_1 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
-- load some data and distribute tables -- load some data and distribute tables
INSERT INTO partitioning_test VALUES (1, '2009-06-06'); INSERT INTO partitioning_test VALUES (1, '2009-06-06');
INSERT INTO partitioning_test VALUES (2, '2010-07-07'); INSERT INTO partitioning_test VALUES (2, '2010-07-07');
INSERT INTO partitioning_test_2009 VALUES (3, '2009-09-09'); INSERT INTO partitioning_test_2009 VALUES (3, '2009-09-09');
INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03'); INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03');
INSERT INTO partitioning_hash_test VALUES (1, 2);
INSERT INTO partitioning_hash_test VALUES (2, 13);
INSERT INTO partitioning_hash_test VALUES (3, 7);
INSERT INTO partitioning_hash_test VALUES (4, 4);
-- distribute partitioned table -- distribute partitioned table
SELECT create_distributed_table('partitioning_test', 'id'); SELECT create_distributed_table('partitioning_test', 'id');
NOTICE: Copying data from local table... NOTICE: Copying data from local table...
@ -36,6 +42,14 @@ NOTICE: Copying data from local table...
(1 row) (1 row)
SELECT create_distributed_table('partitioning_hash_test', 'id');
NOTICE: Copying data from local table...
NOTICE: Copying data from local table...
create_distributed_table
--------------------------
(1 row)
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
id | time id | time
@ -46,6 +60,15 @@ SELECT * FROM partitioning_test ORDER BY 1;
4 | 03-03-2010 4 | 03-03-2010
(4 rows) (4 rows)
SELECT * FROM partitioning_hash_test ORDER BY 1;
id | subid
----+-------
1 | 2
2 | 13
3 | 7
4 | 4
(4 rows)
-- see partitioned table and its partitions are distributed -- see partitioned table and its partitions are distributed
SELECT SELECT
logicalrelid logicalrelid
@ -76,6 +99,35 @@ ORDER BY
partitioning_test_2010 | 4 partitioning_test_2010 | 4
(3 rows) (3 rows)
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
ORDER BY 1;
logicalrelid
--------------------------
partitioning_hash_test
partitioning_hash_test_0
partitioning_hash_test_1
(3 rows)
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
WHERE logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
GROUP BY
logicalrelid
ORDER BY
1,2;
logicalrelid | count
--------------------------+-------
partitioning_hash_test | 4
partitioning_hash_test_0 | 4
partitioning_hash_test_1 | 4
(3 rows)
-- 2-) Creating partition of a distributed table -- 2-) Creating partition of a distributed table
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01'); CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
-- new partition is automatically distributed as well -- new partition is automatically distributed as well
@ -141,6 +193,21 @@ ORDER BY
partitioning_test_2012 | 4 partitioning_test_2012 | 4
(2 rows) (2 rows)
-- try to insert a new data to hash partitioned table
-- no partition is defined for value 5
INSERT INTO partitioning_hash_test VALUES (8, 5);
ERROR: no partition of relation "partitioning_hash_test_1660012" found for row
DETAIL: Partition key of the failing row contains (subid) = (5).
CONTEXT: while executing command on localhost:57637
INSERT INTO partitioning_hash_test VALUES (9, 12);
ERROR: no partition of relation "partitioning_hash_test_1660015" found for row
DETAIL: Partition key of the failing row contains (subid) = (12).
CONTEXT: while executing command on localhost:57638
CREATE TABLE partitioning_hash_test_2 (id int, subid int);
INSERT INTO partitioning_hash_test_2 VALUES (8, 5);
ALTER TABLE partitioning_hash_test ATTACH PARTITION partitioning_hash_test_2 FOR VALUES WITH (MODULUS 3, REMAINDER 2);
NOTICE: Copying data from local table...
INSERT INTO partitioning_hash_test VALUES (9, 12);
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
id | time id | time
@ -153,6 +220,17 @@ SELECT * FROM partitioning_test ORDER BY 1;
6 | 07-07-2012 6 | 07-07-2012
(6 rows) (6 rows)
SELECT * FROM partitioning_hash_test ORDER BY 1;
id | subid
----+-------
1 | 2
2 | 13
3 | 7
4 | 4
8 | 5
9 | 12
(6 rows)
-- 4-) Attaching distributed table to distributed table -- 4-) Attaching distributed table to distributed table
CREATE TABLE partitioning_test_2013(id int, time date); CREATE TABLE partitioning_test_2013(id int, time date);
SELECT create_distributed_table('partitioning_test_2013', 'id'); SELECT create_distributed_table('partitioning_test_2013', 'id');
@ -343,12 +421,70 @@ SELECT * FROM partitioning_test WHERE id = 9 OR id = 10 ORDER BY 1;
----+------ ----+------
(0 rows) (0 rows)
-- create default partition
CREATE TABLE partitioning_test_default PARTITION OF partitioning_test DEFAULT;
\d+ partitioning_test
Table "public.partitioning_test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+---------+--------------+-------------
id | integer | | | | plain | |
time | date | | | | plain | |
Partition key: RANGE ("time")
Partitions: partitioning_test_2009 FOR VALUES FROM ('01-01-2009') TO ('01-01-2010'),
partitioning_test_2010 FOR VALUES FROM ('01-01-2010') TO ('01-01-2011'),
partitioning_test_2011 FOR VALUES FROM ('01-01-2011') TO ('01-01-2012'),
partitioning_test_2012 FOR VALUES FROM ('01-01-2012') TO ('01-01-2013'),
partitioning_test_2013 FOR VALUES FROM ('01-01-2013') TO ('01-01-2014'),
partitioning_test_default DEFAULT
INSERT INTO partitioning_test VALUES(21, '2014-02-02');
INSERT INTO partitioning_test VALUES(22, '2015-04-02');
-- see they are inserted into default partition
SELECT * FROM partitioning_test WHERE id > 20;
id | time
----+------------
21 | 02-02-2014
22 | 04-02-2015
(2 rows)
SELECT * FROM partitioning_test_default;
id | time
----+------------
21 | 02-02-2014
22 | 04-02-2015
(2 rows)
-- create a new partition (will fail)
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
ERROR: updated partition constraint for default partition would be violated by some row
CONTEXT: while executing command on localhost:57637
BEGIN;
ALTER TABLE partitioning_test DETACH PARTITION partitioning_test_default;
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
INSERT INTO partitioning_test SELECT * FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
DELETE FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_default DEFAULT;
END;
-- see data is in the table, but some moved out from default partition
SELECT * FROM partitioning_test WHERE id > 20;
id | time
----+------------
21 | 02-02-2014
22 | 04-02-2015
(2 rows)
SELECT * FROM partitioning_test_default;
id | time
----+------------
22 | 04-02-2015
(1 row)
-- test master_modify_multiple_shards -- test master_modify_multiple_shards
-- master_modify_multiple_shards on partitioned table -- master_modify_multiple_shards on partitioned table
SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day'''); SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day''');
master_modify_multiple_shards master_modify_multiple_shards
------------------------------- -------------------------------
24 26
(1 row) (1 row)
-- see rows are UPDATED -- see rows are UPDATED
@ -379,7 +515,9 @@ SELECT * FROM partitioning_test ORDER BY 1;
18 | 02-02-2012 18 | 02-02-2012
19 | 02-03-2009 19 | 02-03-2009
20 | 02-03-2010 20 | 02-03-2010
(24 rows) 21 | 02-03-2014
22 | 04-03-2015
(26 rows)
-- master_modify_multiple_shards on partition directly -- master_modify_multiple_shards on partition directly
SELECT master_modify_multiple_shards('UPDATE partitioning_test_2009 SET time = time + INTERVAL ''1 day'''); SELECT master_modify_multiple_shards('UPDATE partitioning_test_2009 SET time = time + INTERVAL ''1 day''');
@ -419,7 +557,7 @@ CREATE INDEX CONCURRENTLY partitioned_2010_index ON partitioning_test_2010(id);
-- see index is created -- see index is created
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_test%' ORDER BY indexname; SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_test%' ORDER BY indexname;
tablename | indexname tablename | indexname
------------------------+------------------------------- ---------------------------+----------------------------------
partitioning_test_2010 | partitioned_2010_index partitioning_test_2010 | partitioned_2010_index
partitioning_test_2009 | partitioning_2009_index partitioning_test_2009 | partitioning_2009_index
partitioning_test_2009 | partitioning_test_2009_id_idx partitioning_test_2009 | partitioning_test_2009_id_idx
@ -427,7 +565,9 @@ SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_t
partitioning_test_2011 | partitioning_test_2011_id_idx partitioning_test_2011 | partitioning_test_2011_id_idx
partitioning_test_2012 | partitioning_test_2012_id_idx partitioning_test_2012 | partitioning_test_2012_id_idx
partitioning_test_2013 | partitioning_test_2013_id_idx partitioning_test_2013 | partitioning_test_2013_id_idx
(7 rows) partitioning_test_2014 | partitioning_test_2014_id_idx
partitioning_test_default | partitioning_test_default_id_idx
(9 rows)
-- test add COLUMN -- test add COLUMN
-- add COLUMN to partitioned table -- add COLUMN to partitioned table
@ -474,8 +614,29 @@ WHERE
partitioning_test_2009 | partitioning_2009_primary | PRIMARY KEY partitioning_test_2009 | partitioning_2009_primary | PRIMARY KEY
(1 row) (1 row)
-- however, you can add primary key if it contains both distribution and partition key
ALTER TABLE partitioning_hash_test ADD CONSTRAINT partitioning_hash_primary PRIMARY KEY (id, subid);
-- see PRIMARY KEY is created
SELECT
table_name,
constraint_name,
constraint_type
FROM
information_schema.table_constraints
WHERE
table_name LIKE 'partitioning_hash_test%' AND
constraint_type = 'PRIMARY KEY'
ORDER BY 1;
table_name | constraint_name | constraint_type
--------------------------+-------------------------------+-----------------
partitioning_hash_test | partitioning_hash_primary | PRIMARY KEY
partitioning_hash_test_0 | partitioning_hash_test_0_pkey | PRIMARY KEY
partitioning_hash_test_1 | partitioning_hash_test_1_pkey | PRIMARY KEY
partitioning_hash_test_2 | partitioning_hash_test_2_pkey | PRIMARY KEY
(4 rows)
-- test ADD FOREIGN CONSTRAINT -- test ADD FOREIGN CONSTRAINT
-- add FOREIGN CONSTRAINT to partitioned table -- this will error out -- add FOREIGN CONSTRAINT to partitioned table -- this will error out (it is a self reference)
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id); ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id);
ERROR: cannot ALTER TABLE "partitioning_test_2009" because it is being used by active queries in this session ERROR: cannot ALTER TABLE "partitioning_test_2009" because it is being used by active queries in this session
-- add FOREIGN CONSTRAINT to partition -- add FOREIGN CONSTRAINT to partition
@ -512,6 +673,40 @@ SELECT * FROM partitioning_test WHERE time >= '2009-01-01' AND time < '2010-01-0
----+------+------------ ----+------+------------
(0 rows) (0 rows)
-- delete from default partition
DELETE FROM partitioning_test WHERE time >= '2015-01-01';
SELECT * FROM partitioning_test_default;
id | time | new_column
----+------+------------
(0 rows)
-- create a reference table for foreign key test
CREATE TABLE partitioning_test_reference(id int PRIMARY KEY, subid int);
INSERT INTO partitioning_test_reference SELECT a, a FROM generate_series(1, 50) a;
SELECT create_reference_table('partitioning_test_reference');
NOTICE: Copying data from local table...
create_reference_table
------------------------
(1 row)
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_reference_fkey FOREIGN KEY (id) REFERENCES partitioning_test_reference(id) ON DELETE CASCADE;
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
id | time | new_column
----+------------+------------
11 | 01-02-2011 |
11 | 01-02-2011 |
12 | 01-02-2012 |
12 | 01-02-2012 |
(4 rows)
DELETE FROM partitioning_test_reference WHERE id = 11 or id = 12;
-- see data is deleted from referencing table
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
id | time | new_column
----+------+------------
(0 rows)
-- --
-- Transaction tests -- Transaction tests
-- --
@ -663,6 +858,7 @@ SELECT * FROM partitioning_test WHERE time >= '2010-01-01' AND time < '2011-01-0
-- test DROP partitioned table -- test DROP partitioned table
DROP TABLE partitioning_test; DROP TABLE partitioning_test;
DROP TABLE partitioning_test_reference;
-- dropping the parent should CASCADE to the children as well -- dropping the parent should CASCADE to the children as well
SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1; SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1;
table_name table_name
@ -913,7 +1109,7 @@ INSERT INTO multi_column_partitioning VALUES(1, 1);
INSERT INTO multi_column_partitioning_0_0_10_0 VALUES(5, -5); INSERT INTO multi_column_partitioning_0_0_10_0 VALUES(5, -5);
-- test INSERT to multi-column partitioned table where no suitable partition exists -- test INSERT to multi-column partitioned table where no suitable partition exists
INSERT INTO multi_column_partitioning VALUES(10, 1); INSERT INTO multi_column_partitioning VALUES(10, 1);
ERROR: no partition of relation "multi_column_partitioning_1660068" found for row ERROR: no partition of relation "multi_column_partitioning_1660097" found for row
DETAIL: Partition key of the failing row contains (c1, c2) = (10, 1). DETAIL: Partition key of the failing row contains (c1, c2) = (10, 1).
CONTEXT: while executing command on localhost:57637 CONTEXT: while executing command on localhost:57637
-- test with MINVALUE/MAXVALUE -- test with MINVALUE/MAXVALUE
@ -923,7 +1119,7 @@ INSERT INTO multi_column_partitioning VALUES(11, -11);
INSERT INTO multi_column_partitioning_10_max_20_min VALUES(19, -19); INSERT INTO multi_column_partitioning_10_max_20_min VALUES(19, -19);
-- test INSERT to multi-column partitioned table where no suitable partition exists -- test INSERT to multi-column partitioned table where no suitable partition exists
INSERT INTO multi_column_partitioning VALUES(20, -20); INSERT INTO multi_column_partitioning VALUES(20, -20);
ERROR: no partition of relation "multi_column_partitioning_1660068" found for row ERROR: no partition of relation "multi_column_partitioning_1660097" found for row
DETAIL: Partition key of the failing row contains (c1, c2) = (20, -20). DETAIL: Partition key of the failing row contains (c1, c2) = (20, -20).
CONTEXT: while executing command on localhost:57637 CONTEXT: while executing command on localhost:57637
-- see data is loaded to multi-column partitioned table -- see data is loaded to multi-column partitioned table
@ -1237,6 +1433,130 @@ ORDER BY
(12 rows) (12 rows)
COMMIT; COMMIT;
-- test partition-wise join
CREATE TABLE partitioning_hash_join_test(id int, subid int) PARTITION BY HASH(subid);
CREATE TABLE partitioning_hash_join_test_0 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE partitioning_hash_join_test_1 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
CREATE TABLE partitioning_hash_join_test_2 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 2);
SELECT create_distributed_table('partitioning_hash_join_test', 'id');
create_distributed_table
--------------------------
(1 row)
-- see the query plan without partition-wise join
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Custom Scan (Citus Real-Time) (cost=0.00..0.00 rows=0 width=0)
Task Count: 4
Tasks Shown: One of 4
-> Task
Node: host=localhost port=57637 dbname=regression
-> Merge Join (cost=563.58..752.73 rows=383 width=8)
Merge Cond: ((partitioning_hash_test.id = partitioning_hash_join_test.id) AND (partitioning_hash_test.subid = partitioning_hash_join_test.subid))
-> Merge Append (cost=0.43..123.59 rows=2262 width=8)
Sort Key: partitioning_hash_test.id, partitioning_hash_test.subid
-> Index Only Scan using partitioning_hash_test_0_1660016_pkey on partitioning_hash_test_0_1660016 partitioning_hash_test (cost=0.12..8.14 rows=1 width=8)
-> Index Only Scan using partitioning_hash_test_1_1660020_pkey on partitioning_hash_test_1_1660020 partitioning_hash_test_1 (cost=0.15..78.06 rows=2260 width=8)
-> Index Only Scan using partitioning_hash_test_2_1660032_pkey on partitioning_hash_test_2_1660032 partitioning_hash_test_2 (cost=0.12..8.14 rows=1 width=8)
-> Sort (cost=563.15..580.10 rows=6780 width=8)
Sort Key: partitioning_hash_join_test.id, partitioning_hash_join_test.subid
-> Append (cost=0.00..131.70 rows=6780 width=8)
-> Seq Scan on partitioning_hash_join_test_0_1660129 partitioning_hash_join_test (cost=0.00..32.60 rows=2260 width=8)
-> Seq Scan on partitioning_hash_join_test_1_1660133 partitioning_hash_join_test_1 (cost=0.00..32.60 rows=2260 width=8)
-> Seq Scan on partitioning_hash_join_test_2_1660137 partitioning_hash_join_test_2 (cost=0.00..32.60 rows=2260 width=8)
(18 rows)
-- set partition-wise join on
SELECT success FROM run_command_on_workers('alter system set enable_partitionwise_join to on');
success
---------
t
t
(2 rows)
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
success
---------
t
t
(2 rows)
SET enable_partitionwise_join TO on;
-- see the new query plan
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Custom Scan (Citus Real-Time) (cost=0.00..0.00 rows=0 width=0)
Task Count: 4
Tasks Shown: One of 4
-> Task
Node: host=localhost port=57637 dbname=regression
-> Append (cost=1.02..367.91 rows=130 width=8)
-> Hash Join (cost=1.02..50.59 rows=1 width=8)
Hash Cond: ((partitioning_hash_join_test.id = partitioning_hash_test.id) AND (partitioning_hash_join_test.subid = partitioning_hash_test.subid))
-> Seq Scan on partitioning_hash_join_test_0_1660129 partitioning_hash_join_test (cost=0.00..32.60 rows=2260 width=8)
-> Hash (cost=1.01..1.01 rows=1 width=8)
-> Seq Scan on partitioning_hash_test_0_1660016 partitioning_hash_test (cost=0.00..1.01 rows=1 width=8)
-> Merge Join (cost=158.66..266.09 rows=128 width=8)
Merge Cond: ((partitioning_hash_test_1.id = partitioning_hash_join_test_1.id) AND (partitioning_hash_test_1.subid = partitioning_hash_join_test_1.subid))
-> Index Only Scan using partitioning_hash_test_1_1660020_pkey on partitioning_hash_test_1_1660020 partitioning_hash_test_1 (cost=0.15..78.06 rows=2260 width=8)
-> Sort (cost=158.51..164.16 rows=2260 width=8)
Sort Key: partitioning_hash_join_test_1.id, partitioning_hash_join_test_1.subid
-> Seq Scan on partitioning_hash_join_test_1_1660133 partitioning_hash_join_test_1 (cost=0.00..32.60 rows=2260 width=8)
-> Hash Join (cost=1.02..50.59 rows=1 width=8)
Hash Cond: ((partitioning_hash_join_test_2.id = partitioning_hash_test_2.id) AND (partitioning_hash_join_test_2.subid = partitioning_hash_test_2.subid))
-> Seq Scan on partitioning_hash_join_test_2_1660137 partitioning_hash_join_test_2 (cost=0.00..32.60 rows=2260 width=8)
-> Hash (cost=1.01..1.01 rows=1 width=8)
-> Seq Scan on partitioning_hash_test_2_1660032 partitioning_hash_test_2 (cost=0.00..1.01 rows=1 width=8)
(22 rows)
-- note that partition-wise joins only work when partition key is in the join
-- following join does not have that, therefore join will not be pushed down to
-- partitions
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Custom Scan (Citus Real-Time) (cost=0.00..0.00 rows=0 width=0)
Task Count: 4
Tasks Shown: One of 4
-> Task
Node: host=localhost port=57637 dbname=regression
-> Merge Join (cost=563.58..1842.63 rows=76682 width=12)
Merge Cond: (partitioning_hash_test.id = partitioning_hash_join_test.id)
-> Merge Append (cost=0.43..123.59 rows=2262 width=8)
Sort Key: partitioning_hash_test.id
-> Index Only Scan using partitioning_hash_test_0_1660016_pkey on partitioning_hash_test_0_1660016 partitioning_hash_test (cost=0.12..8.14 rows=1 width=8)
-> Index Only Scan using partitioning_hash_test_1_1660020_pkey on partitioning_hash_test_1_1660020 partitioning_hash_test_1 (cost=0.15..78.06 rows=2260 width=8)
-> Index Only Scan using partitioning_hash_test_2_1660032_pkey on partitioning_hash_test_2_1660032 partitioning_hash_test_2 (cost=0.12..8.14 rows=1 width=8)
-> Sort (cost=563.15..580.10 rows=6780 width=8)
Sort Key: partitioning_hash_join_test.id
-> Append (cost=0.00..131.70 rows=6780 width=8)
-> Seq Scan on partitioning_hash_join_test_0_1660129 partitioning_hash_join_test (cost=0.00..32.60 rows=2260 width=8)
-> Seq Scan on partitioning_hash_join_test_1_1660133 partitioning_hash_join_test_1 (cost=0.00..32.60 rows=2260 width=8)
-> Seq Scan on partitioning_hash_join_test_2_1660137 partitioning_hash_join_test_2 (cost=0.00..32.60 rows=2260 width=8)
(18 rows)
-- reset partition-wise join
SELECT success FROM run_command_on_workers('reset enable_partitionwise_join');
success
---------
t
t
(2 rows)
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
success
---------
t
t
(2 rows)
RESET enable_partitionwise_join;
DROP TABLE DROP TABLE
IF EXISTS IF EXISTS
partitioning_test_2009, partitioning_test_2009,

View File

@ -18,15 +18,40 @@ SELECT substring(:'server_version', '\d+')::int AS server_version;
-- 1-) Distributing partitioned table -- 1-) Distributing partitioned table
-- create partitioned table -- create partitioned table
CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time); CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time);
CREATE TABLE partitioning_hash_test(id int, subid int) PARTITION BY HASH(subid);
ERROR: unrecognized partitioning strategy "hash"
-- create its partitions -- create its partitions
CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01'); CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01');
CREATE TABLE partitioning_hash_test_0 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
ERROR: syntax error at or near "WITH"
LINE 1: ..._0 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODU...
^
CREATE TABLE partitioning_hash_test_1 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
ERROR: syntax error at or near "WITH"
LINE 1: ..._1 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODU...
^
-- load some data and distribute tables -- load some data and distribute tables
INSERT INTO partitioning_test VALUES (1, '2009-06-06'); INSERT INTO partitioning_test VALUES (1, '2009-06-06');
INSERT INTO partitioning_test VALUES (2, '2010-07-07'); INSERT INTO partitioning_test VALUES (2, '2010-07-07');
INSERT INTO partitioning_test_2009 VALUES (3, '2009-09-09'); INSERT INTO partitioning_test_2009 VALUES (3, '2009-09-09');
INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03'); INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03');
INSERT INTO partitioning_hash_test VALUES (1, 2);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (1, 2);
^
INSERT INTO partitioning_hash_test VALUES (2, 13);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (2, 13);
^
INSERT INTO partitioning_hash_test VALUES (3, 7);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (3, 7);
^
INSERT INTO partitioning_hash_test VALUES (4, 4);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (4, 4);
^
-- distribute partitioned table -- distribute partitioned table
SELECT create_distributed_table('partitioning_test', 'id'); SELECT create_distributed_table('partitioning_test', 'id');
NOTICE: Copying data from local table... NOTICE: Copying data from local table...
@ -36,6 +61,10 @@ NOTICE: Copying data from local table...
(1 row) (1 row)
SELECT create_distributed_table('partitioning_hash_test', 'id');
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: SELECT create_distributed_table('partitioning_hash_test', 'i...
^
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
id | time id | time
@ -46,6 +75,10 @@ SELECT * FROM partitioning_test ORDER BY 1;
4 | 03-03-2010 4 | 03-03-2010
(4 rows) (4 rows)
SELECT * FROM partitioning_hash_test ORDER BY 1;
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: SELECT * FROM partitioning_hash_test ORDER BY 1;
^
-- see partitioned table and its partitions are distributed -- see partitioned table and its partitions are distributed
SELECT SELECT
logicalrelid logicalrelid
@ -76,6 +109,27 @@ ORDER BY
partitioning_test_2010 | 4 partitioning_test_2010 | 4
(3 rows) (3 rows)
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
ORDER BY 1;
ERROR: relation "partitioning_hash_test" does not exist
LINE 6: logicalrelid IN ('partitioning_hash_test', 'partitioning_ha...
^
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
WHERE logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
GROUP BY
logicalrelid
ORDER BY
1,2;
ERROR: relation "partitioning_hash_test" does not exist
LINE 4: WHERE logicalrelid IN ('partitioning_hash_test', 'partition...
^
-- 2-) Creating partition of a distributed table -- 2-) Creating partition of a distributed table
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01'); CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
-- new partition is automatically distributed as well -- new partition is automatically distributed as well
@ -141,6 +195,26 @@ ORDER BY
partitioning_test_2012 | 4 partitioning_test_2012 | 4
(2 rows) (2 rows)
-- try to insert a new data to hash partitioned table
-- no partition is defined for value 5
INSERT INTO partitioning_hash_test VALUES (8, 5);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (8, 5);
^
INSERT INTO partitioning_hash_test VALUES (9, 12);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (9, 12);
^
CREATE TABLE partitioning_hash_test_2 (id int, subid int);
INSERT INTO partitioning_hash_test_2 VALUES (8, 5);
ALTER TABLE partitioning_hash_test ATTACH PARTITION partitioning_hash_test_2 FOR VALUES WITH (MODULUS 3, REMAINDER 2);
ERROR: syntax error at or near "WITH"
LINE 1: ...ACH PARTITION partitioning_hash_test_2 FOR VALUES WITH (MODU...
^
INSERT INTO partitioning_hash_test VALUES (9, 12);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (9, 12);
^
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
id | time id | time
@ -153,6 +227,10 @@ SELECT * FROM partitioning_test ORDER BY 1;
6 | 07-07-2012 6 | 07-07-2012
(6 rows) (6 rows)
SELECT * FROM partitioning_hash_test ORDER BY 1;
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: SELECT * FROM partitioning_hash_test ORDER BY 1;
^
-- 4-) Attaching distributed table to distributed table -- 4-) Attaching distributed table to distributed table
CREATE TABLE partitioning_test_2013(id int, time date); CREATE TABLE partitioning_test_2013(id int, time date);
SELECT create_distributed_table('partitioning_test_2013', 'id'); SELECT create_distributed_table('partitioning_test_2013', 'id');
@ -343,6 +421,68 @@ SELECT * FROM partitioning_test WHERE id = 9 OR id = 10 ORDER BY 1;
----+------ ----+------
(0 rows) (0 rows)
-- create default partition
CREATE TABLE partitioning_test_default PARTITION OF partitioning_test DEFAULT;
ERROR: syntax error at or near "DEFAULT"
LINE 1: ...tioning_test_default PARTITION OF partitioning_test DEFAULT;
^
\d+ partitioning_test
Table "public.partitioning_test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+---------+--------------+-------------
id | integer | | | | plain | |
time | date | | | | plain | |
Partition key: RANGE ("time")
Partitions: partitioning_test_2009 FOR VALUES FROM ('01-01-2009') TO ('01-01-2010'),
partitioning_test_2010 FOR VALUES FROM ('01-01-2010') TO ('01-01-2011'),
partitioning_test_2011 FOR VALUES FROM ('01-01-2011') TO ('01-01-2012'),
partitioning_test_2012 FOR VALUES FROM ('01-01-2012') TO ('01-01-2013'),
partitioning_test_2013 FOR VALUES FROM ('01-01-2013') TO ('01-01-2014')
INSERT INTO partitioning_test VALUES(21, '2014-02-02');
ERROR: no partition of relation "partitioning_test_1660002" found for row
DETAIL: Partition key of the failing row contains ("time") = (2014-02-02).
CONTEXT: while executing command on localhost:57637
INSERT INTO partitioning_test VALUES(22, '2015-04-02');
ERROR: no partition of relation "partitioning_test_1660003" found for row
DETAIL: Partition key of the failing row contains ("time") = (2015-04-02).
CONTEXT: while executing command on localhost:57638
-- see they are inserted into default partition
SELECT * FROM partitioning_test WHERE id > 20;
id | time
----+------
(0 rows)
SELECT * FROM partitioning_test_default;
ERROR: relation "partitioning_test_default" does not exist
LINE 1: SELECT * FROM partitioning_test_default;
^
-- create a new partition (will fail)
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
BEGIN;
ALTER TABLE partitioning_test DETACH PARTITION partitioning_test_default;
ERROR: relation "partitioning_test_default" does not exist
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
ERROR: current transaction is aborted, commands ignored until end of transaction block
INSERT INTO partitioning_test SELECT * FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
ERROR: current transaction is aborted, commands ignored until end of transaction block
DELETE FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
ERROR: current transaction is aborted, commands ignored until end of transaction block
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_default DEFAULT;
ERROR: syntax error at or near "DEFAULT"
LINE 1: ...ing_test ATTACH PARTITION partitioning_test_default DEFAULT;
^
END;
-- see data is in the table, but some moved out from default partition
SELECT * FROM partitioning_test WHERE id > 20;
id | time
----+------
(0 rows)
SELECT * FROM partitioning_test_default;
ERROR: relation "partitioning_test_default" does not exist
LINE 1: SELECT * FROM partitioning_test_default;
^
-- test master_modify_multiple_shards -- test master_modify_multiple_shards
-- master_modify_multiple_shards on partitioned table -- master_modify_multiple_shards on partitioned table
SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day'''); SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day''');
@ -471,8 +611,26 @@ WHERE
partitioning_test_2009 | partitioning_2009_primary | PRIMARY KEY partitioning_test_2009 | partitioning_2009_primary | PRIMARY KEY
(1 row) (1 row)
-- however, you can add primary key if it contains both distribution and partition key
ALTER TABLE partitioning_hash_test ADD CONSTRAINT partitioning_hash_primary PRIMARY KEY (id, subid);
ERROR: relation "partitioning_hash_test" does not exist
-- see PRIMARY KEY is created
SELECT
table_name,
constraint_name,
constraint_type
FROM
information_schema.table_constraints
WHERE
table_name LIKE 'partitioning_hash_test%' AND
constraint_type = 'PRIMARY KEY'
ORDER BY 1;
table_name | constraint_name | constraint_type
------------+-----------------+-----------------
(0 rows)
-- test ADD FOREIGN CONSTRAINT -- test ADD FOREIGN CONSTRAINT
-- add FOREIGN CONSTRAINT to partitioned table -- this will error out -- add FOREIGN CONSTRAINT to partitioned table -- this will error out (it is a self reference)
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id); ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id);
ERROR: foreign key constraints are not supported on partitioned tables ERROR: foreign key constraints are not supported on partitioned tables
LINE 1: ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_fo... LINE 1: ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_fo...
@ -511,6 +669,46 @@ SELECT * FROM partitioning_test WHERE time >= '2009-01-01' AND time < '2010-01-0
----+------+------------ ----+------+------------
(0 rows) (0 rows)
-- delete from default partition
DELETE FROM partitioning_test WHERE time >= '2015-01-01';
SELECT * FROM partitioning_test_default;
ERROR: relation "partitioning_test_default" does not exist
LINE 1: SELECT * FROM partitioning_test_default;
^
-- create a reference table for foreign key test
CREATE TABLE partitioning_test_reference(id int PRIMARY KEY, subid int);
INSERT INTO partitioning_test_reference SELECT a, a FROM generate_series(1, 50) a;
SELECT create_reference_table('partitioning_test_reference');
NOTICE: Copying data from local table...
create_reference_table
------------------------
(1 row)
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_reference_fkey FOREIGN KEY (id) REFERENCES partitioning_test_reference(id) ON DELETE CASCADE;
ERROR: foreign key constraints are not supported on partitioned tables
LINE 1: ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_re...
^
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
id | time | new_column
----+------------+------------
11 | 01-02-2011 |
11 | 01-02-2011 |
12 | 01-02-2012 |
12 | 01-02-2012 |
(4 rows)
DELETE FROM partitioning_test_reference WHERE id = 11 or id = 12;
-- see data is deleted from referencing table
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
id | time | new_column
----+------------+------------
11 | 01-02-2011 |
11 | 01-02-2011 |
12 | 01-02-2012 |
12 | 01-02-2012 |
(4 rows)
-- --
-- Transaction tests -- Transaction tests
-- --
@ -662,6 +860,7 @@ SELECT * FROM partitioning_test WHERE time >= '2010-01-01' AND time < '2011-01-0
-- test DROP partitioned table -- test DROP partitioned table
DROP TABLE partitioning_test; DROP TABLE partitioning_test;
DROP TABLE partitioning_test_reference;
-- dropping the parent should CASCADE to the children as well -- dropping the parent should CASCADE to the children as well
SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1; SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1;
table_name table_name
@ -912,7 +1111,7 @@ INSERT INTO multi_column_partitioning VALUES(1, 1);
INSERT INTO multi_column_partitioning_0_0_10_0 VALUES(5, -5); INSERT INTO multi_column_partitioning_0_0_10_0 VALUES(5, -5);
-- test INSERT to multi-column partitioned table where no suitable partition exists -- test INSERT to multi-column partitioned table where no suitable partition exists
INSERT INTO multi_column_partitioning VALUES(10, 1); INSERT INTO multi_column_partitioning VALUES(10, 1);
ERROR: no partition of relation "multi_column_partitioning_1660068" found for row ERROR: no partition of relation "multi_column_partitioning_1660073" found for row
DETAIL: Partition key of the failing row contains (c1, c2) = (10, 1). DETAIL: Partition key of the failing row contains (c1, c2) = (10, 1).
CONTEXT: while executing command on localhost:57637 CONTEXT: while executing command on localhost:57637
-- test with MINVALUE/MAXVALUE -- test with MINVALUE/MAXVALUE
@ -922,7 +1121,7 @@ INSERT INTO multi_column_partitioning VALUES(11, -11);
INSERT INTO multi_column_partitioning_10_max_20_min VALUES(19, -19); INSERT INTO multi_column_partitioning_10_max_20_min VALUES(19, -19);
-- test INSERT to multi-column partitioned table where no suitable partition exists -- test INSERT to multi-column partitioned table where no suitable partition exists
INSERT INTO multi_column_partitioning VALUES(20, -20); INSERT INTO multi_column_partitioning VALUES(20, -20);
ERROR: no partition of relation "multi_column_partitioning_1660068" found for row ERROR: no partition of relation "multi_column_partitioning_1660073" found for row
DETAIL: Partition key of the failing row contains (c1, c2) = (20, -20). DETAIL: Partition key of the failing row contains (c1, c2) = (20, -20).
CONTEXT: while executing command on localhost:57637 CONTEXT: while executing command on localhost:57637
-- see data is loaded to multi-column partitioned table -- see data is loaded to multi-column partitioned table
@ -1236,6 +1435,79 @@ ORDER BY
(12 rows) (12 rows)
COMMIT; COMMIT;
-- test partition-wise join
CREATE TABLE partitioning_hash_join_test(id int, subid int) PARTITION BY HASH(subid);
ERROR: unrecognized partitioning strategy "hash"
CREATE TABLE partitioning_hash_join_test_0 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
ERROR: syntax error at or near "WITH"
LINE 1: ...RTITION OF partitioning_hash_join_test FOR VALUES WITH (MODU...
^
CREATE TABLE partitioning_hash_join_test_1 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
ERROR: syntax error at or near "WITH"
LINE 1: ...RTITION OF partitioning_hash_join_test FOR VALUES WITH (MODU...
^
CREATE TABLE partitioning_hash_join_test_2 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 2);
ERROR: syntax error at or near "WITH"
LINE 1: ...RTITION OF partitioning_hash_join_test FOR VALUES WITH (MODU...
^
SELECT create_distributed_table('partitioning_hash_join_test', 'id');
ERROR: relation "partitioning_hash_join_test" does not exist
LINE 1: SELECT create_distributed_table('partitioning_hash_join_test...
^
-- see the query plan without partition-wise join
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
ERROR: relation "partitioning_hash_test" does not exist
LINE 2: SELECT * FROM partitioning_hash_test JOIN partitioning_hash_...
^
-- set partition-wise join on
SELECT success FROM run_command_on_workers('alter system set enable_partitionwise_join to on');
success
---------
f
f
(2 rows)
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
success
---------
t
t
(2 rows)
SET enable_partitionwise_join TO on;
ERROR: unrecognized configuration parameter "enable_partitionwise_join"
-- see the new query plan
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
ERROR: relation "partitioning_hash_test" does not exist
LINE 2: SELECT * FROM partitioning_hash_test JOIN partitioning_hash_...
^
-- note that partition-wise joins only work when partition key is in the join
-- following join does not have that, therefore join will not be pushed down to
-- partitions
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id);
ERROR: relation "partitioning_hash_test" does not exist
LINE 2: SELECT * FROM partitioning_hash_test JOIN partitioning_hash_...
^
-- reset partition-wise join
SELECT success FROM run_command_on_workers('reset enable_partitionwise_join');
success
---------
f
f
(2 rows)
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
success
---------
t
t
(2 rows)
RESET enable_partitionwise_join;
ERROR: unrecognized configuration parameter "enable_partitionwise_join"
DROP TABLE DROP TABLE
IF EXISTS IF EXISTS
partitioning_test_2009, partitioning_test_2009,

View File

@ -21,7 +21,10 @@ CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time);
ERROR: syntax error at or near "PARTITION" ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_test(id int, time date) PARTITION ... LINE 1: CREATE TABLE partitioning_test(id int, time date) PARTITION ...
^ ^
CREATE TABLE partitioning_hash_test(id int, subid int) PARTITION BY HASH(subid);
ERROR: syntax error at or near "PARTITION"
LINE 1: ...E TABLE partitioning_hash_test(id int, subid int) PARTITION ...
^
-- create its partitions -- create its partitions
CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
ERROR: syntax error at or near "PARTITION" ERROR: syntax error at or near "PARTITION"
@ -31,6 +34,14 @@ CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FR
ERROR: syntax error at or near "PARTITION" ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_test_2010 PARTITION OF partitionin... LINE 1: CREATE TABLE partitioning_test_2010 PARTITION OF partitionin...
^ ^
CREATE TABLE partitioning_hash_test_0 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_hash_test_0 PARTITION OF partition...
^
CREATE TABLE partitioning_hash_test_1 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_hash_test_1 PARTITION OF partition...
^
-- load some data and distribute tables -- load some data and distribute tables
INSERT INTO partitioning_test VALUES (1, '2009-06-06'); INSERT INTO partitioning_test VALUES (1, '2009-06-06');
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
@ -48,16 +59,40 @@ INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03');
ERROR: relation "partitioning_test_2010" does not exist ERROR: relation "partitioning_test_2010" does not exist
LINE 1: INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03'); LINE 1: INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03');
^ ^
INSERT INTO partitioning_hash_test VALUES (1, 2);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (1, 2);
^
INSERT INTO partitioning_hash_test VALUES (2, 13);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (2, 13);
^
INSERT INTO partitioning_hash_test VALUES (3, 7);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (3, 7);
^
INSERT INTO partitioning_hash_test VALUES (4, 4);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (4, 4);
^
-- distribute partitioned table -- distribute partitioned table
SELECT create_distributed_table('partitioning_test', 'id'); SELECT create_distributed_table('partitioning_test', 'id');
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT create_distributed_table('partitioning_test', 'id'); LINE 1: SELECT create_distributed_table('partitioning_test', 'id');
^ ^
SELECT create_distributed_table('partitioning_hash_test', 'id');
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: SELECT create_distributed_table('partitioning_hash_test', 'i...
^
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test ORDER BY 1; LINE 1: SELECT * FROM partitioning_test ORDER BY 1;
^ ^
SELECT * FROM partitioning_hash_test ORDER BY 1;
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: SELECT * FROM partitioning_hash_test ORDER BY 1;
^
-- see partitioned table and its partitions are distributed -- see partitioned table and its partitions are distributed
SELECT SELECT
logicalrelid logicalrelid
@ -80,6 +115,27 @@ ORDER BY
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
LINE 4: WHERE logicalrelid IN ('partitioning_test', 'partitioning_t... LINE 4: WHERE logicalrelid IN ('partitioning_test', 'partitioning_t...
^ ^
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
ORDER BY 1;
ERROR: relation "partitioning_hash_test" does not exist
LINE 6: logicalrelid IN ('partitioning_hash_test', 'partitioning_ha...
^
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
WHERE logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
GROUP BY
logicalrelid
ORDER BY
1,2;
ERROR: relation "partitioning_hash_test" does not exist
LINE 4: WHERE logicalrelid IN ('partitioning_hash_test', 'partition...
^
-- 2-) Creating partition of a distributed table -- 2-) Creating partition of a distributed table
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01'); CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
ERROR: syntax error at or near "PARTITION" ERROR: syntax error at or near "PARTITION"
@ -138,11 +194,35 @@ ORDER BY
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
LINE 4: WHERE logicalrelid IN ('partitioning_test', 'partitioning_t... LINE 4: WHERE logicalrelid IN ('partitioning_test', 'partitioning_t...
^ ^
-- try to insert a new data to hash partitioned table
-- no partition is defined for value 5
INSERT INTO partitioning_hash_test VALUES (8, 5);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (8, 5);
^
INSERT INTO partitioning_hash_test VALUES (9, 12);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (9, 12);
^
CREATE TABLE partitioning_hash_test_2 (id int, subid int);
INSERT INTO partitioning_hash_test_2 VALUES (8, 5);
ALTER TABLE partitioning_hash_test ATTACH PARTITION partitioning_hash_test_2 FOR VALUES WITH (MODULUS 3, REMAINDER 2);
ERROR: syntax error at or near "ATTACH"
LINE 1: ALTER TABLE partitioning_hash_test ATTACH PARTITION partitio...
^
INSERT INTO partitioning_hash_test VALUES (9, 12);
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: INSERT INTO partitioning_hash_test VALUES (9, 12);
^
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test ORDER BY 1; LINE 1: SELECT * FROM partitioning_test ORDER BY 1;
^ ^
SELECT * FROM partitioning_hash_test ORDER BY 1;
ERROR: relation "partitioning_hash_test" does not exist
LINE 1: SELECT * FROM partitioning_hash_test ORDER BY 1;
^
-- 4-) Attaching distributed table to distributed table -- 4-) Attaching distributed table to distributed table
CREATE TABLE partitioning_test_2013(id int, time date); CREATE TABLE partitioning_test_2013(id int, time date);
SELECT create_distributed_table('partitioning_test_2013', 'id'); SELECT create_distributed_table('partitioning_test_2013', 'id');
@ -366,6 +446,61 @@ SELECT * FROM partitioning_test WHERE id = 9 OR id = 10 ORDER BY 1;
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test WHERE id = 9 OR id = 10 ORDE... LINE 1: SELECT * FROM partitioning_test WHERE id = 9 OR id = 10 ORDE...
^ ^
-- create default partition
CREATE TABLE partitioning_test_default PARTITION OF partitioning_test DEFAULT;
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_test_default PARTITION OF partitio...
^
\d+ partitioning_test
INSERT INTO partitioning_test VALUES(21, '2014-02-02');
ERROR: relation "partitioning_test" does not exist
LINE 1: INSERT INTO partitioning_test VALUES(21, '2014-02-02');
^
INSERT INTO partitioning_test VALUES(22, '2015-04-02');
ERROR: relation "partitioning_test" does not exist
LINE 1: INSERT INTO partitioning_test VALUES(22, '2015-04-02');
^
-- see they are inserted into default partition
SELECT * FROM partitioning_test WHERE id > 20;
ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test WHERE id > 20;
^
SELECT * FROM partitioning_test_default;
ERROR: relation "partitioning_test_default" does not exist
LINE 1: SELECT * FROM partitioning_test_default;
^
-- create a new partition (will fail)
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_test_2014 PARTITION OF partitionin...
^
BEGIN;
ALTER TABLE partitioning_test DETACH PARTITION partitioning_test_default;
ERROR: syntax error at or near "DETACH"
LINE 1: ALTER TABLE partitioning_test DETACH PARTITION partitioning_...
^
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_test_2014 PARTITION OF partitionin...
^
INSERT INTO partitioning_test SELECT * FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
ERROR: current transaction is aborted, commands ignored until end of transaction block
DELETE FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
ERROR: current transaction is aborted, commands ignored until end of transaction block
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_default DEFAULT;
ERROR: syntax error at or near "ATTACH"
LINE 1: ALTER TABLE partitioning_test ATTACH PARTITION partitioning_...
^
END;
-- see data is in the table, but some moved out from default partition
SELECT * FROM partitioning_test WHERE id > 20;
ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test WHERE id > 20;
^
SELECT * FROM partitioning_test_default;
ERROR: relation "partitioning_test_default" does not exist
LINE 1: SELECT * FROM partitioning_test_default;
^
-- test master_modify_multiple_shards -- test master_modify_multiple_shards
-- master_modify_multiple_shards on partitioned table -- master_modify_multiple_shards on partitioned table
SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day'''); SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day''');
@ -443,8 +578,26 @@ WHERE
------------+-----------------+----------------- ------------+-----------------+-----------------
(0 rows) (0 rows)
-- however, you can add primary key if it contains both distribution and partition key
ALTER TABLE partitioning_hash_test ADD CONSTRAINT partitioning_hash_primary PRIMARY KEY (id, subid);
ERROR: relation "partitioning_hash_test" does not exist
-- see PRIMARY KEY is created
SELECT
table_name,
constraint_name,
constraint_type
FROM
information_schema.table_constraints
WHERE
table_name LIKE 'partitioning_hash_test%' AND
constraint_type = 'PRIMARY KEY'
ORDER BY 1;
table_name | constraint_name | constraint_type
------------+-----------------+-----------------
(0 rows)
-- test ADD FOREIGN CONSTRAINT -- test ADD FOREIGN CONSTRAINT
-- add FOREIGN CONSTRAINT to partitioned table -- this will error out -- add FOREIGN CONSTRAINT to partitioned table -- this will error out (it is a self reference)
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id); ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id);
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
-- add FOREIGN CONSTRAINT to partition -- add FOREIGN CONSTRAINT to partition
@ -498,6 +651,37 @@ SELECT * FROM partitioning_test WHERE time >= '2009-01-01' AND time < '2010-01-0
ERROR: relation "partitioning_test" does not exist ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test WHERE time >= '2009-01-01' A... LINE 1: SELECT * FROM partitioning_test WHERE time >= '2009-01-01' A...
^ ^
-- delete from default partition
DELETE FROM partitioning_test WHERE time >= '2015-01-01';
ERROR: relation "partitioning_test" does not exist
LINE 1: DELETE FROM partitioning_test WHERE time >= '2015-01-01';
^
SELECT * FROM partitioning_test_default;
ERROR: relation "partitioning_test_default" does not exist
LINE 1: SELECT * FROM partitioning_test_default;
^
-- create a reference table for foreign key test
CREATE TABLE partitioning_test_reference(id int PRIMARY KEY, subid int);
INSERT INTO partitioning_test_reference SELECT a, a FROM generate_series(1, 50) a;
SELECT create_reference_table('partitioning_test_reference');
NOTICE: Copying data from local table...
create_reference_table
------------------------
(1 row)
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_reference_fkey FOREIGN KEY (id) REFERENCES partitioning_test_reference(id) ON DELETE CASCADE;
ERROR: relation "partitioning_test" does not exist
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
^
DELETE FROM partitioning_test_reference WHERE id = 11 or id = 12;
-- see data is deleted from referencing table
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
ERROR: relation "partitioning_test" does not exist
LINE 1: SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
^
-- --
-- Transaction tests -- Transaction tests
-- --
@ -638,6 +822,7 @@ LINE 1: SELECT * FROM partitioning_test WHERE time >= '2010-01-01' A...
-- test DROP partitioned table -- test DROP partitioned table
DROP TABLE partitioning_test; DROP TABLE partitioning_test;
ERROR: table "partitioning_test" does not exist ERROR: table "partitioning_test" does not exist
DROP TABLE partitioning_test_reference;
-- dropping the parent should CASCADE to the children as well -- dropping the parent should CASCADE to the children as well
SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1; SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1;
table_name table_name
@ -1121,6 +1306,81 @@ ORDER BY
1, 2, 3; 1, 2, 3;
ERROR: current transaction is aborted, commands ignored until end of transaction block ERROR: current transaction is aborted, commands ignored until end of transaction block
COMMIT; COMMIT;
-- test partition-wise join
CREATE TABLE partitioning_hash_join_test(id int, subid int) PARTITION BY HASH(subid);
ERROR: syntax error at or near "PARTITION"
LINE 1: ...LE partitioning_hash_join_test(id int, subid int) PARTITION ...
^
CREATE TABLE partitioning_hash_join_test_0 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_hash_join_test_0 PARTITION OF part...
^
CREATE TABLE partitioning_hash_join_test_1 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_hash_join_test_1 PARTITION OF part...
^
CREATE TABLE partitioning_hash_join_test_2 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 2);
ERROR: syntax error at or near "PARTITION"
LINE 1: CREATE TABLE partitioning_hash_join_test_2 PARTITION OF part...
^
SELECT create_distributed_table('partitioning_hash_join_test', 'id');
ERROR: relation "partitioning_hash_join_test" does not exist
LINE 1: SELECT create_distributed_table('partitioning_hash_join_test...
^
-- see the query plan without partition-wise join
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
ERROR: relation "partitioning_hash_test" does not exist
LINE 2: SELECT * FROM partitioning_hash_test JOIN partitioning_hash_...
^
-- set partition-wise join on
SELECT success FROM run_command_on_workers('alter system set enable_partitionwise_join to on');
success
---------
f
f
(2 rows)
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
success
---------
t
t
(2 rows)
SET enable_partitionwise_join TO on;
ERROR: unrecognized configuration parameter "enable_partitionwise_join"
-- see the new query plan
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
ERROR: relation "partitioning_hash_test" does not exist
LINE 2: SELECT * FROM partitioning_hash_test JOIN partitioning_hash_...
^
-- note that partition-wise joins only work when partition key is in the join
-- following join does not have that, therefore join will not be pushed down to
-- partitions
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id);
ERROR: relation "partitioning_hash_test" does not exist
LINE 2: SELECT * FROM partitioning_hash_test JOIN partitioning_hash_...
^
-- reset partition-wise join
SELECT success FROM run_command_on_workers('reset enable_partitionwise_join');
success
---------
f
f
(2 rows)
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
success
---------
t
t
(2 rows)
RESET enable_partitionwise_join;
ERROR: unrecognized configuration parameter "enable_partitionwise_join"
DROP TABLE DROP TABLE
IF EXISTS IF EXISTS
partitioning_test_2009, partitioning_test_2009,

View File

@ -18,10 +18,15 @@ SELECT substring(:'server_version', '\d+')::int AS server_version;
-- create partitioned table -- create partitioned table
CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time); CREATE TABLE partitioning_test(id int, time date) PARTITION BY RANGE (time);
CREATE TABLE partitioning_hash_test(id int, subid int) PARTITION BY HASH(subid);
-- create its partitions -- create its partitions
CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01'); CREATE TABLE partitioning_test_2010 PARTITION OF partitioning_test FOR VALUES FROM ('2010-01-01') TO ('2011-01-01');
CREATE TABLE partitioning_hash_test_0 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE partitioning_hash_test_1 PARTITION OF partitioning_hash_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
-- load some data and distribute tables -- load some data and distribute tables
INSERT INTO partitioning_test VALUES (1, '2009-06-06'); INSERT INTO partitioning_test VALUES (1, '2009-06-06');
INSERT INTO partitioning_test VALUES (2, '2010-07-07'); INSERT INTO partitioning_test VALUES (2, '2010-07-07');
@ -29,12 +34,21 @@ INSERT INTO partitioning_test VALUES (2, '2010-07-07');
INSERT INTO partitioning_test_2009 VALUES (3, '2009-09-09'); INSERT INTO partitioning_test_2009 VALUES (3, '2009-09-09');
INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03'); INSERT INTO partitioning_test_2010 VALUES (4, '2010-03-03');
INSERT INTO partitioning_hash_test VALUES (1, 2);
INSERT INTO partitioning_hash_test VALUES (2, 13);
INSERT INTO partitioning_hash_test VALUES (3, 7);
INSERT INTO partitioning_hash_test VALUES (4, 4);
-- distribute partitioned table -- distribute partitioned table
SELECT create_distributed_table('partitioning_test', 'id'); SELECT create_distributed_table('partitioning_test', 'id');
SELECT create_distributed_table('partitioning_hash_test', 'id');
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
SELECT * FROM partitioning_hash_test ORDER BY 1;
-- see partitioned table and its partitions are distributed -- see partitioned table and its partitions are distributed
SELECT SELECT
logicalrelid logicalrelid
@ -53,6 +67,23 @@ GROUP BY
ORDER BY ORDER BY
1,2; 1,2;
SELECT
logicalrelid
FROM
pg_dist_partition
WHERE
logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
ORDER BY 1;
SELECT
logicalrelid, count(*)
FROM pg_dist_shard
WHERE logicalrelid IN ('partitioning_hash_test', 'partitioning_hash_test_0', 'partitioning_hash_test_1')
GROUP BY
logicalrelid
ORDER BY
1,2;
-- 2-) Creating partition of a distributed table -- 2-) Creating partition of a distributed table
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01'); CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
@ -101,9 +132,23 @@ GROUP BY
ORDER BY ORDER BY
1,2; 1,2;
-- try to insert a new data to hash partitioned table
-- no partition is defined for value 5
INSERT INTO partitioning_hash_test VALUES (8, 5);
INSERT INTO partitioning_hash_test VALUES (9, 12);
CREATE TABLE partitioning_hash_test_2 (id int, subid int);
INSERT INTO partitioning_hash_test_2 VALUES (8, 5);
ALTER TABLE partitioning_hash_test ATTACH PARTITION partitioning_hash_test_2 FOR VALUES WITH (MODULUS 3, REMAINDER 2);
INSERT INTO partitioning_hash_test VALUES (9, 12);
-- see the data is loaded to shards -- see the data is loaded to shards
SELECT * FROM partitioning_test ORDER BY 1; SELECT * FROM partitioning_test ORDER BY 1;
SELECT * FROM partitioning_hash_test ORDER BY 1;
-- 4-) Attaching distributed table to distributed table -- 4-) Attaching distributed table to distributed table
CREATE TABLE partitioning_test_2013(id int, time date); CREATE TABLE partitioning_test_2013(id int, time date);
SELECT create_distributed_table('partitioning_test_2013', 'id'); SELECT create_distributed_table('partitioning_test_2013', 'id');
@ -239,6 +284,33 @@ DELETE FROM partitioning_test_2010 WHERE id = 10;
-- see the data is deleted -- see the data is deleted
SELECT * FROM partitioning_test WHERE id = 9 OR id = 10 ORDER BY 1; SELECT * FROM partitioning_test WHERE id = 9 OR id = 10 ORDER BY 1;
-- create default partition
CREATE TABLE partitioning_test_default PARTITION OF partitioning_test DEFAULT;
\d+ partitioning_test
INSERT INTO partitioning_test VALUES(21, '2014-02-02');
INSERT INTO partitioning_test VALUES(22, '2015-04-02');
-- see they are inserted into default partition
SELECT * FROM partitioning_test WHERE id > 20;
SELECT * FROM partitioning_test_default;
-- create a new partition (will fail)
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
BEGIN;
ALTER TABLE partitioning_test DETACH PARTITION partitioning_test_default;
CREATE TABLE partitioning_test_2014 PARTITION OF partitioning_test FOR VALUES FROM ('2014-01-01') TO ('2015-01-01');
INSERT INTO partitioning_test SELECT * FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
DELETE FROM partitioning_test_default WHERE time >= '2014-01-01' AND time < '2015-01-01';
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_default DEFAULT;
END;
-- see data is in the table, but some moved out from default partition
SELECT * FROM partitioning_test WHERE id > 20;
SELECT * FROM partitioning_test_default;
-- test master_modify_multiple_shards -- test master_modify_multiple_shards
-- master_modify_multiple_shards on partitioned table -- master_modify_multiple_shards on partitioned table
SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day'''); SELECT master_modify_multiple_shards('UPDATE partitioning_test SET time = time + INTERVAL ''1 day''');
@ -302,8 +374,23 @@ WHERE
table_name = 'partitioning_test_2009' AND table_name = 'partitioning_test_2009' AND
constraint_name = 'partitioning_2009_primary'; constraint_name = 'partitioning_2009_primary';
-- however, you can add primary key if it contains both distribution and partition key
ALTER TABLE partitioning_hash_test ADD CONSTRAINT partitioning_hash_primary PRIMARY KEY (id, subid);
-- see PRIMARY KEY is created
SELECT
table_name,
constraint_name,
constraint_type
FROM
information_schema.table_constraints
WHERE
table_name LIKE 'partitioning_hash_test%' AND
constraint_type = 'PRIMARY KEY'
ORDER BY 1;
-- test ADD FOREIGN CONSTRAINT -- test ADD FOREIGN CONSTRAINT
-- add FOREIGN CONSTRAINT to partitioned table -- this will error out -- add FOREIGN CONSTRAINT to partitioned table -- this will error out (it is a self reference)
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id); ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_foreign FOREIGN KEY (id) REFERENCES partitioning_test_2009 (id);
-- add FOREIGN CONSTRAINT to partition -- add FOREIGN CONSTRAINT to partition
@ -329,6 +416,24 @@ ALTER TABLE partitioning_test DETACH PARTITION partitioning_test_2009;
-- see DETACHed partitions content is not accessible from partitioning_test; -- see DETACHed partitions content is not accessible from partitioning_test;
SELECT * FROM partitioning_test WHERE time >= '2009-01-01' AND time < '2010-01-01' ORDER BY 1; SELECT * FROM partitioning_test WHERE time >= '2009-01-01' AND time < '2010-01-01' ORDER BY 1;
-- delete from default partition
DELETE FROM partitioning_test WHERE time >= '2015-01-01';
SELECT * FROM partitioning_test_default;
-- create a reference table for foreign key test
CREATE TABLE partitioning_test_reference(id int PRIMARY KEY, subid int);
INSERT INTO partitioning_test_reference SELECT a, a FROM generate_series(1, 50) a;
SELECT create_reference_table('partitioning_test_reference');
ALTER TABLE partitioning_test ADD CONSTRAINT partitioning_reference_fkey FOREIGN KEY (id) REFERENCES partitioning_test_reference(id) ON DELETE CASCADE;
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
DELETE FROM partitioning_test_reference WHERE id = 11 or id = 12;
-- see data is deleted from referencing table
SELECT * FROM partitioning_test WHERE id = 11 or id = 12;
-- --
-- Transaction tests -- Transaction tests
-- --
@ -438,6 +543,7 @@ SELECT * FROM partitioning_test WHERE time >= '2010-01-01' AND time < '2011-01-0
-- test DROP partitioned table -- test DROP partitioned table
DROP TABLE partitioning_test; DROP TABLE partitioning_test;
DROP TABLE partitioning_test_reference;
-- dropping the parent should CASCADE to the children as well -- dropping the parent should CASCADE to the children as well
SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1; SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'partitioning_test%' ORDER BY 1;
@ -809,6 +915,41 @@ ORDER BY
1, 2, 3; 1, 2, 3;
COMMIT; COMMIT;
-- test partition-wise join
CREATE TABLE partitioning_hash_join_test(id int, subid int) PARTITION BY HASH(subid);
CREATE TABLE partitioning_hash_join_test_0 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE partitioning_hash_join_test_1 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 1);
CREATE TABLE partitioning_hash_join_test_2 PARTITION OF partitioning_hash_join_test FOR VALUES WITH (MODULUS 3, REMAINDER 2);
SELECT create_distributed_table('partitioning_hash_join_test', 'id');
-- see the query plan without partition-wise join
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
-- set partition-wise join on
SELECT success FROM run_command_on_workers('alter system set enable_partitionwise_join to on');
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
SET enable_partitionwise_join TO on;
-- see the new query plan
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id, subid);
-- note that partition-wise joins only work when partition key is in the join
-- following join does not have that, therefore join will not be pushed down to
-- partitions
EXPLAIN
SELECT * FROM partitioning_hash_test JOIN partitioning_hash_join_test USING (id);
-- reset partition-wise join
SELECT success FROM run_command_on_workers('reset enable_partitionwise_join');
SELECT success FROM run_command_on_workers('select pg_reload_conf()');
RESET enable_partitionwise_join;
DROP TABLE DROP TABLE
IF EXISTS IF EXISTS
partitioning_test_2009, partitioning_test_2009,