mirror of
https://github.com/HypoPG/hypopg
synced 2026-05-23 17:18:44 +00:00
Add unique identifier in regression tests comments
Some tests were previously too similar, making it hard to distinguish which test was exactly failing. This will help a little bit in such cases.
This commit is contained in:
parent
03dfdaf5e2
commit
ad1cc8319e
8 changed files with 166 additions and 150 deletions
|
|
@ -2,7 +2,7 @@
|
|||
-- =====================================
|
||||
-- Real tables
|
||||
-- ------------
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 1.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
|
|
@ -11,7 +11,7 @@ CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (200
|
|||
INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
hypopg_reset_index
|
||||
--------------------
|
||||
|
|
@ -24,7 +24,7 @@ SELECT * FROM hypopg_reset_table();
|
|||
|
||||
(1 row)
|
||||
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 2.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
|
|
@ -63,7 +63,7 @@ SELECT * FROM hypopg_analyze('hypo_part_range',100);
|
|||
|
||||
-- Test hypothetical indexes on hypothetical partitioning behavior
|
||||
-- ===============================================================
|
||||
-- Indexes on root partitioning tree
|
||||
-- 3.1 Indexes on root partitioning tree
|
||||
-- ---------------------------------
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range (id)');
|
||||
nb
|
||||
|
|
@ -77,7 +77,7 @@ SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range(
|
|||
1
|
||||
(1 row)
|
||||
|
||||
-- Test on real tables
|
||||
-- 3.2 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
|
|
@ -93,7 +93,7 @@ WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
|||
1
|
||||
(1 row)
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.3 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
|
|
@ -109,7 +109,7 @@ WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
|||
1
|
||||
(1 row)
|
||||
|
||||
-- Indexes on specific partitions
|
||||
-- 3.4 Indexes on specific partitions
|
||||
-- ------------------------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
hypopg_reset_index
|
||||
|
|
@ -129,7 +129,7 @@ SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range_
|
|||
1
|
||||
(1 row)
|
||||
|
||||
-- Test on real tables
|
||||
-- 3.5 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
|
|
@ -145,7 +145,7 @@ WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
|||
0
|
||||
(1 row)
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.6 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
|
|
@ -161,7 +161,7 @@ WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
|||
0
|
||||
(1 row)
|
||||
|
||||
-- Sanity checks
|
||||
-- 3.7 Sanity checks
|
||||
-- -------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
hypopg_reset_index
|
||||
|
|
@ -169,7 +169,7 @@ SELECT * FROM hypopg_reset_index();
|
|||
|
||||
(1 row)
|
||||
|
||||
-- No hypothetical on non-leaf partition
|
||||
-- 3.8 No hypothetical on non-leaf partition
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
CREATE TABLE part_multi_2 PARTITION OF part_multi FOR VALUES IN (2) PARTITION BY RANGE(dt);
|
||||
|
|
@ -179,6 +179,7 @@ CREATE TABLE part_multi_1_q2 PARTITION OF part_multi_1 FOR VALUES FROM ($$2015-0
|
|||
CREATE TABLE part_multi_1_q1 PARTITION OF part_multi_1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-04-01$$) PARTITION BY RANGE (dt);
|
||||
CREATE TABLE part_multi_1_q1_b PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-02-01$$) TO ($$2015-04-01$$);
|
||||
CREATE TABLE part_multi_1_q1_a PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$);
|
||||
-- 3.9 Same using hypothetical partitioning
|
||||
SELECT * FROM hypopg_partition_table('hypo_part_multi', 'PARTITION BY LIST (dpt)');
|
||||
hypopg_partition_table
|
||||
------------------------
|
||||
|
|
@ -215,10 +216,12 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_a', 'PARTITION
|
|||
hypo_part_multi_1_q1_a
|
||||
(1 row)
|
||||
|
||||
-- 3.10 Hypothetical index on partitioned table
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_multi_1 (dpt)');
|
||||
ERROR: hypopg: cannot add hypothetical index on non-leaf or non-root partition
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_multi_1_q1 (dpt)');
|
||||
ERROR: hypopg: cannot add hypothetical index on non-leaf or non-root partition
|
||||
-- 3.11 Hypothetical index on hypothetically partitioned table
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_multi_1 (dpt)');
|
||||
ERROR: hypopg: cannot add hypothetical index on non-leaf or non-root hypothetical partition
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_multi_1_q1 (dpt)');
|
||||
|
|
@ -227,6 +230,7 @@ ERROR: hypopg: cannot add hypothetical index on non-leaf or non-root hypothetic
|
|||
CREATE TABLE t_pk(id integer primary key, val text) PARTITION BY LIST (val);
|
||||
ERROR: insufficient columns in PRIMARY KEY constraint definition
|
||||
DETAIL: PRIMARY KEY constraint on table "t_pk" lacks column "val" which is part of the partition key.
|
||||
-- pk constraint check on hypothetically partitioned table
|
||||
CREATE TABLE hypo_t_pk(id integer primary key, val text);
|
||||
SELECT hypopg_partition_table('hypo_t_pk', 'PARTITION BY LIST (val)');
|
||||
ERROR: hypopg: insufficient columns in unique constraint definition
|
||||
|
|
@ -237,11 +241,13 @@ CREATE TABLE t_unique(id integer, val text) PARTITION BY LIST (val);
|
|||
CREATE UNIQUE INDEX ON t_unique(id);
|
||||
ERROR: insufficient columns in UNIQUE constraint definition
|
||||
DETAIL: UNIQUE constraint on table "t_unique" lacks column "val" which is part of the partition key.
|
||||
-- unique constraint check on hypothetically partitioned table
|
||||
CREATE TABLE hypo_t_unique(id integer, val text);
|
||||
CREATE UNIQUE INDEX ON hypo_t_unique(id);
|
||||
SELECT hypopg_partition_table('hypo_t_unique', 'PARTITION BY LIST (val)');
|
||||
ERROR: hypopg: insufficient columns in unique constraint definition
|
||||
DETAIL: unique constraint on table "hypo_t_unique" lacks column "val" which is part of the hypothetical partition key.
|
||||
-- hypothetical unique index check before hypothetically partitioning table
|
||||
DROP TABLE hypo_t_unique;
|
||||
CREATE TABLE hypo_t_unique(id integer, val text);
|
||||
SELECT count(*) FROM hypopg_create_index('CREATE UNIQUE INDEX on hypo_t_unique (id)');
|
||||
|
|
@ -253,6 +259,7 @@ SELECT count(*) FROM hypopg_create_index('CREATE UNIQUE INDEX on hypo_t_unique (
|
|||
SELECT hypopg_partition_table('hypo_t_unique', 'PARTITION BY LIST (val)');
|
||||
ERROR: hypopg: insufficient columns in unique hypothetical constraint definition
|
||||
DETAIL: unique constraint on table "hypo_t_unique" lacks column "val" which is part of the hypothetical partition key.
|
||||
-- hypothetical unique index check after hypothetically partitioning table
|
||||
DROP TABLE hypo_t_unique;
|
||||
CREATE TABLE hypo_t_unique(id integer, val text);
|
||||
SELECT hypopg_partition_table('hypo_t_unique', 'PARTITION BY LIST (val)');
|
||||
|
|
@ -271,6 +278,7 @@ CREATE TABLE t_constrext(c circle, val text, EXCLUDE USING gist(c WITH &&)) PART
|
|||
ERROR: exclusion constraints are not supported on partitioned tables
|
||||
LINE 1: CREATE TABLE t_constrext(c circle, val text, EXCLUDE USING g...
|
||||
^
|
||||
-- constraint exclusion check on hypothetically partitioned table
|
||||
CREATE TABLE hypo_t_constrext(c circle, val text, EXCLUDE USING gist(c WITH &&));
|
||||
SELECT hypopg_partition_table('hypo_t_constrext', 'PARTITION BY LIST (val)');
|
||||
ERROR: exclusion constraints are not supported on hypothetically partitioned tables
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
-- =====================================
|
||||
-- Real tables
|
||||
-- ------------
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 1.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
|
|
@ -11,7 +11,7 @@ CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (200
|
|||
INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
hypopg_reset_index
|
||||
--------------------
|
||||
|
|
@ -24,7 +24,7 @@ SELECT * FROM hypopg_reset_table();
|
|||
|
||||
(1 row)
|
||||
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 2.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
|
|
@ -63,13 +63,13 @@ SELECT * FROM hypopg_analyze('hypo_part_range',100);
|
|||
|
||||
-- Test hypothetical indexes on hypothetical partitioning behavior
|
||||
-- ===============================================================
|
||||
-- Indexes on root partitioning tree
|
||||
-- 3.1 Indexes on root partitioning tree
|
||||
-- ---------------------------------
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range (id)');
|
||||
ERROR: hypopg: cannot add hypothetical index on non-leaf partition
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range(id)');
|
||||
ERROR: hypopg: cannot add hypothetical index on non-leaf hypothetical partition
|
||||
-- Test on real tables
|
||||
-- 3.2 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
|
|
@ -85,7 +85,7 @@ WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
|||
0
|
||||
(1 row)
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.3 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
|
|
@ -101,7 +101,7 @@ WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
|||
0
|
||||
(1 row)
|
||||
|
||||
-- Indexes on specific partitions
|
||||
-- 3.4 Indexes on specific partitions
|
||||
-- ------------------------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
hypopg_reset_index
|
||||
|
|
@ -121,7 +121,7 @@ SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range_
|
|||
1
|
||||
(1 row)
|
||||
|
||||
-- Test on real tables
|
||||
-- 3.5 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
|
|
@ -137,7 +137,7 @@ WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
|||
0
|
||||
(1 row)
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.6 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
|
|
@ -153,7 +153,7 @@ WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
|||
0
|
||||
(1 row)
|
||||
|
||||
-- Sanity checks
|
||||
-- 3.7 Sanity checks
|
||||
-- -------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
hypopg_reset_index
|
||||
|
|
@ -161,7 +161,7 @@ SELECT * FROM hypopg_reset_index();
|
|||
|
||||
(1 row)
|
||||
|
||||
-- No hypothetical on non-leaf partition
|
||||
-- 3.8 No hypothetical on non-leaf partition
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
CREATE TABLE part_multi_2 PARTITION OF part_multi FOR VALUES IN (2) PARTITION BY RANGE(dt);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
-- ====================================="
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partition
|
||||
-- 1.1. Range partition
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
NOTICE: table "part_range" does not exist, skipping
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
|
|
@ -10,7 +10,7 @@ CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (
|
|||
CREATE TABLE part_range_10000_20000 PARTITION OF part_range FOR VALUES FROM (10000) TO (20000);
|
||||
CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (20000) TO (30000);
|
||||
INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
-- 2. List partitioning
|
||||
-- 1.2. List partitioning
|
||||
DROP TABLE IF EXISTS part_list;
|
||||
NOTICE: table "part_list" does not exist, skipping
|
||||
CREATE TABLE part_list (id integer, id_key integer, val text) PARTITION BY LIST (id_key);
|
||||
|
|
@ -18,7 +18,7 @@ CREATE TABLE part_list_4_5_6_8_10 PARTITION OF part_list FOR VALUES IN (4, 5, 6,
|
|||
CREATE TABLE part_list_7_9 PARTITION OF part_list FOR VALUES IN (7, 9);
|
||||
CREATE TABLE part_list_1_2_3 PARTITION OF part_list FOR VALUES IN (1, 2, 3);
|
||||
INSERT INTO part_list SELECT i, (i % 9) + 1, 'line ' || i FROM generate_series(1, 50000) i;
|
||||
-- 3. Hash partitioning
|
||||
-- 1.3. Hash partitioning
|
||||
DROP TABLE IF EXISTS part_hash;
|
||||
NOTICE: table "part_hash" does not exist, skipping
|
||||
CREATE TABLE part_hash (id integer, val text) PARTITION BY HASH (id);
|
||||
|
|
@ -33,7 +33,7 @@ CREATE TABLE part_hash_2 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REM
|
|||
CREATE TABLE part_hash_1 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 1);
|
||||
CREATE TABLE part_hash_0 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 0);
|
||||
INSERT INTO part_hash SELECT i, 'line ' || i FROM generate_series(1, 90000) i;
|
||||
-- 4. Multi level range
|
||||
-- 1.4. Multi level range
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
NOTICE: table "part_multi" does not exist, skipping
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
|
|
@ -66,14 +66,14 @@ CREATE TABLE part_multi_def_def PARTITION OF part_multi_def DEFAULT;
|
|||
INSERT INTO part_multi select (i%4)+1, '2015-01-01'::date + interval '1 day' * (i%500), 'val ' || i FROM generate_series(1,50000) i;
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset();
|
||||
hypopg_reset
|
||||
--------------
|
||||
|
||||
(1 row)
|
||||
|
||||
-- 1. Range partition
|
||||
-- 2.1. Range partition
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
NOTICE: table "hypo_part_range" does not exist, skipping
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
|
|
@ -102,7 +102,7 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_range_20000_30000', 'PARTI
|
|||
hypo_part_range_20000_30000
|
||||
(1 row)
|
||||
|
||||
-- 2. List partitioning
|
||||
-- 2.2. List partitioning
|
||||
DROP TABLE IF EXISTS hypo_part_list;
|
||||
NOTICE: table "hypo_part_list" does not exist, skipping
|
||||
CREATE TABLE hypo_part_list (id integer, id_key integer, val text);
|
||||
|
|
@ -131,7 +131,7 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_list_1_2_3', 'PARTITION OF
|
|||
hypo_part_list_1_2_3
|
||||
(1 row)
|
||||
|
||||
-- 3. Hash partitioning
|
||||
-- 2.3. Hash partitioning
|
||||
DROP TABLE IF EXISTS hypo_part_hash;
|
||||
NOTICE: table "hypo_part_hash" does not exist, skipping
|
||||
CREATE TABLE hypo_part_hash (id integer, val text);
|
||||
|
|
@ -202,7 +202,7 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_hash_0', 'PARTITION OF hyp
|
|||
hypo_part_hash_0
|
||||
(1 row)
|
||||
|
||||
-- 4. Multi level range
|
||||
-- 2.4. Multi level range
|
||||
DROP TABLE IF EXISTS hypo_part_multi;
|
||||
NOTICE: table "hypo_part_multi" does not exist, skipping
|
||||
CREATE TABLE hypo_part_multi(dpt smallint, dt date, val text);
|
||||
|
|
@ -469,7 +469,7 @@ ORDER BY tablename COLLATE "C";
|
|||
-- --------------
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partitioning
|
||||
-- 3.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range;
|
||||
QUERY PLAN
|
||||
------------------------------------------
|
||||
|
|
@ -497,7 +497,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id < 15000;
|
|||
Filter: (id < 15000)
|
||||
(5 rows)
|
||||
|
||||
-- 2. List partitioning
|
||||
-- 3.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list;
|
||||
QUERY PLAN
|
||||
----------------------------------------
|
||||
|
|
@ -549,7 +549,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id_key = 7;
|
|||
Filter: (id_key = 7)
|
||||
(3 rows)
|
||||
|
||||
-- 3. Hash partitioning
|
||||
-- 3.3. Hash partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash;
|
||||
QUERY PLAN
|
||||
-------------------------------
|
||||
|
|
@ -600,7 +600,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_hash WHERE id < 15000;
|
|||
Filter: (id < 15000)
|
||||
(21 rows)
|
||||
|
||||
-- 4. Multi level range
|
||||
-- 3.4. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
|
||||
QUERY PLAN
|
||||
--------------------------------------
|
||||
|
|
@ -668,7 +668,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_multi WHERE dt >= '2015-01-05' AND dt < '
|
|||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 1. Range partitioning
|
||||
-- 4.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------
|
||||
|
|
@ -696,7 +696,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id < 15000;
|
|||
Filter: (id < 15000)
|
||||
(5 rows)
|
||||
|
||||
-- 2. List partitioning
|
||||
-- 4.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list;
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------
|
||||
|
|
@ -748,7 +748,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id_key = 7;
|
|||
Filter: (id_key = 7)
|
||||
(3 rows)
|
||||
|
||||
-- 3. Hash partitioning
|
||||
-- 4.3. Hash partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------
|
||||
|
|
@ -799,7 +799,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash WHERE id < 15000;
|
|||
Filter: (id < 15000)
|
||||
(21 rows)
|
||||
|
||||
-- 4. Multi level range
|
||||
-- 4.4. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------
|
||||
|
|
@ -869,7 +869,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dt >= '2015-01-05' AND d
|
|||
-- ------------
|
||||
-- Simple joins
|
||||
-- ------------
|
||||
-- 1. Real tables
|
||||
-- 5.1. Real tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------
|
||||
|
|
@ -963,7 +963,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_multi t1, part_multi t2 WHERE t1.dpt = t2
|
|||
Filter: (dpt = 2)
|
||||
(24 rows)
|
||||
|
||||
-- 2. Hypothetical tables
|
||||
-- 5.2. Hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------------
|
||||
|
|
@ -1057,7 +1057,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi t1, hypo_part_multi t2 WHERE t
|
|||
Filter: (dpt = 2)
|
||||
(24 rows)
|
||||
|
||||
-- 3. Real tables and hypothetical tables
|
||||
-- 5.3. Real tables and hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
|
|
@ -1156,7 +1156,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_multi t1, hypo_part_multi t2 WHERE t1.dpt
|
|||
-- enable partitionwise join
|
||||
-- -------------------------
|
||||
SET enable_partitionwise_join to true;
|
||||
-- 1. Real tables
|
||||
-- 6.1. Real tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------
|
||||
|
|
@ -1231,7 +1231,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_hash t1, part_hash t2 WHERE t1.id = t2.id
|
|||
-> Seq Scan on part_hash_9 t2_9
|
||||
(51 rows)
|
||||
|
||||
-- 2. Hypothetical tables
|
||||
-- 6.2. Hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
----------------------------------------------------------------------------------------
|
||||
|
|
@ -1306,7 +1306,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash t1, hypo_part_hash t2 WHERE t1.
|
|||
-> Seq Scan on hypo_part_hash hypo_part_hash_9_1
|
||||
(51 rows)
|
||||
|
||||
-- 3. Real tables and hypothetical tables
|
||||
-- 6.3. Real tables and hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------------
|
||||
|
|
@ -1383,27 +1383,27 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_hash t1, hypo_part_hash t2 WHERE t1.id =
|
|||
|
||||
-- Tests for sanity checks
|
||||
-- =======================
|
||||
-- Duplicate name
|
||||
-- 7.1 Duplicate name
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
ERROR: relation "part_range_1_10000" already exists
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)');
|
||||
ERROR: hypopg: hypothetical table hypo_part_range_1_10000 already exists
|
||||
-- Overlapping range bounds
|
||||
-- 7.2 Overlapping range bounds
|
||||
CREATE TABLE part_range_1_10000_dup PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
ERROR: partition "part_range_1_10000_dup" would overlap partition "part_range_1_10000"
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000_dup', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)');
|
||||
ERROR: hypopg: partition "hypo_part_range_1_10000_dup" would overlap partition "hypo_part_range_1_10000"
|
||||
-- Overlapping list bounds
|
||||
-- 7.3 Overlapping list bounds
|
||||
CREATE TABLE part_list_1_2_3_dup PARTITION OF part_list FOR VALUES IN (1, 2, 3);
|
||||
ERROR: partition "part_list_1_2_3_dup" would overlap partition "part_list_1_2_3"
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_1_2_3_dup', 'PARTITION OF hypo_part_list FOR VALUES IN (1, 2, 3)');
|
||||
ERROR: hypopg: partition "hypo_part_list_1_2_3_dup" would overlap partition "hypo_part_list_1_2_3"
|
||||
-- Overlapping hash bounds
|
||||
-- 7.4 Overlapping hash bounds
|
||||
CREATE TABLE part_hash_0 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 0);
|
||||
ERROR: relation "part_hash_0" already exists
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_hash_0_dup', 'PARTITION OF hypo_part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 0)');
|
||||
ERROR: hypopg: partition "hypo_part_hash_0_dup" would overlap partition "hypo_part_hash_0"
|
||||
-- Overlapping range bounds, subpartition
|
||||
-- 7.5 Overlapping range bounds, subpartition
|
||||
CREATE TABLE part_multi_1_q1_a PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$);
|
||||
ERROR: relation "part_multi_1_q1_a" already exists
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_a_dup', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$)');
|
||||
|
|
@ -1461,20 +1461,20 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = 42;
|
|||
|
||||
-- no UPDATE/DELETE test
|
||||
-- =====================
|
||||
-- simple UPDATE and DELETE on hypothetically partitioned table
|
||||
-- 8.1 simple UPDATE and DELETE on hypothetically partitioned table
|
||||
EXPLAIN (COSTS OFF) UPDATE hypo_part_range set id = id;
|
||||
ERROR: hypopg: UPDATE and DELETE on hypothetically partitioned tables are not supported
|
||||
EXPLAIN DELETE FROM hypo_part_range WHERE id = 42;
|
||||
ERROR: hypopg: UPDATE and DELETE on hypothetically partitioned tables are not supported
|
||||
-- UPDATE and DELETE on hypothetically partitioned table inside CTE
|
||||
-- 8.2 UPDATE and DELETE on hypothetically partitioned table inside CTE
|
||||
EXPLAIN (COSTS OFF) WITH s AS (UPDATE hypo_part_range set id = id returning *) SELECT 1;
|
||||
ERROR: hypopg: UPDATE and DELETE on hypothetically partitioned tables are not supported
|
||||
EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM hypo_part_range WHERE id = 42 returning *) SELECT 1;
|
||||
ERROR: hypopg: UPDATE and DELETE on hypothetically partitioned tables are not supported
|
||||
-- UPDATE and DELETE involving hypothetically partitioned table, but on regular
|
||||
-- tables
|
||||
-- 8.3 UPDATE and DELETE involving hypothetically partitioned table, but on
|
||||
-- regular tables
|
||||
CREATE TABLE foo(id integer);
|
||||
-- UPDATE on non hypothetically partitioned table but having a hypothetically
|
||||
-- 8.4 UPDATE on non hypothetically partitioned table but having a hypothetically
|
||||
-- partitioned table joined
|
||||
EXPLAIN (COSTS OFF) WITH s AS (UPDATE foo SET id = 0 from hypo_part_range WHERE foo.id = hypo_part_range.id AND hypo_part_range.id > 25000 RETURNING *) SELECT 1;
|
||||
QUERY PLAN
|
||||
|
|
@ -1491,7 +1491,7 @@ EXPLAIN (COSTS OFF) WITH s AS (UPDATE foo SET id = 0 from hypo_part_range WHERE
|
|||
Filter: (id > 25000)
|
||||
(10 rows)
|
||||
|
||||
-- same but with real table
|
||||
-- 8.5 same but with real table
|
||||
EXPLAIN (COSTS OFF) WITH s AS (UPDATE foo SET id = 0 from part_range WHERE foo.id = part_range.id AND part_range.id > 25000 RETURNING *) SELECT 1;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------------------
|
||||
|
|
@ -1507,8 +1507,8 @@ EXPLAIN (COSTS OFF) WITH s AS (UPDATE foo SET id = 0 from part_range WHERE foo.i
|
|||
Filter: (id > 25000)
|
||||
(10 rows)
|
||||
|
||||
-- DELETE on non hypothetically partitioned table but having a hypothetically
|
||||
-- partitioned table joined
|
||||
-- 8.6 DELETE on non hypothetically partitioned table but having a
|
||||
-- hypothetically partitioned table joined
|
||||
EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM foo USING hypo_part_range WHERE foo.id = hypo_part_range.id AND hypo_part_range.id = 42 RETURNING *) SELECT 1;
|
||||
QUERY PLAN
|
||||
-------------------------------------------------------------------------------
|
||||
|
|
@ -1523,7 +1523,7 @@ EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM foo USING hypo_part_range WHERE foo.i
|
|||
Filter: (id = 42)
|
||||
(9 rows)
|
||||
|
||||
-- same but with real table
|
||||
-- 8.7 same but with real table
|
||||
EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM foo USING part_range WHERE foo.id = part_range.id AND part_range.id = 42 RETURNING *) SELECT 1;
|
||||
QUERY PLAN
|
||||
----------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
-- ====================================="
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partition
|
||||
-- 1.1. Range partition
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
NOTICE: table "part_range" does not exist, skipping
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
|
|
@ -10,7 +10,7 @@ CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (
|
|||
CREATE TABLE part_range_10000_20000 PARTITION OF part_range FOR VALUES FROM (10000) TO (20000);
|
||||
CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (20000) TO (30000);
|
||||
INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
-- 2. List partitioning
|
||||
-- 1.2. List partitioning
|
||||
DROP TABLE IF EXISTS part_list;
|
||||
NOTICE: table "part_list" does not exist, skipping
|
||||
CREATE TABLE part_list (id integer, id_key integer, val text) PARTITION BY LIST (id_key);
|
||||
|
|
@ -18,7 +18,7 @@ CREATE TABLE part_list_4_5_6_8_10 PARTITION OF part_list FOR VALUES IN (4, 5, 6,
|
|||
CREATE TABLE part_list_7_9 PARTITION OF part_list FOR VALUES IN (7, 9);
|
||||
CREATE TABLE part_list_1_2_3 PARTITION OF part_list FOR VALUES IN (1, 2, 3);
|
||||
INSERT INTO part_list SELECT i, (i % 9) + 1, 'line ' || i FROM generate_series(1, 50000) i;
|
||||
-- 3. Multi level range
|
||||
-- 1.3. Multi level range
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
NOTICE: table "part_multi" does not exist, skipping
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
|
|
@ -42,14 +42,14 @@ CREATE TABLE part_multi_3_q4 PARTITION OF part_multi_3 FOR VALUES FROM ($$2015-1
|
|||
INSERT INTO part_multi select (i%3)+1, '2015-01-01'::date + interval '1 day' * (i%365), 'val ' || i FROM generate_series(1,50000) i;
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset();
|
||||
hypopg_reset
|
||||
--------------
|
||||
|
||||
(1 row)
|
||||
|
||||
-- 1. Range partition
|
||||
-- 2.1. Range partition
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
NOTICE: table "hypo_part_range" does not exist, skipping
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
|
|
@ -78,7 +78,7 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_range_20000_30000', 'PARTI
|
|||
hypo_part_range_20000_30000
|
||||
(1 row)
|
||||
|
||||
-- 2. List partitioning
|
||||
-- 2.2. List partitioning
|
||||
DROP TABLE IF EXISTS hypo_part_list;
|
||||
NOTICE: table "hypo_part_list" does not exist, skipping
|
||||
CREATE TABLE hypo_part_list (id integer, id_key integer, val text);
|
||||
|
|
@ -107,7 +107,7 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_list_1_2_3', 'PARTITION OF
|
|||
hypo_part_list_1_2_3
|
||||
(1 row)
|
||||
|
||||
-- 3. Multi level range
|
||||
-- 2.3. Multi level range
|
||||
DROP TABLE IF EXISTS hypo_part_multi;
|
||||
NOTICE: table "hypo_part_multi" does not exist, skipping
|
||||
CREATE TABLE hypo_part_multi(dpt smallint, dt date, val text);
|
||||
|
|
@ -284,7 +284,7 @@ ORDER BY tablename COLLATE "C";
|
|||
-- --------------
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partitioning
|
||||
-- 3.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range;
|
||||
QUERY PLAN
|
||||
------------------------------------------
|
||||
|
|
@ -312,7 +312,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id < 15000;
|
|||
Filter: (id < 15000)
|
||||
(5 rows)
|
||||
|
||||
-- 2. List partitioning
|
||||
-- 3.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list;
|
||||
QUERY PLAN
|
||||
----------------------------------------
|
||||
|
|
@ -364,7 +364,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id_key = 7;
|
|||
Filter: (id_key = 7)
|
||||
(3 rows)
|
||||
|
||||
-- 3. Multi level range
|
||||
-- 3.3. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
|
||||
QUERY PLAN
|
||||
-------------------------------------
|
||||
|
|
@ -412,7 +412,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_multi WHERE dt >= '2015-01-05' AND dt < '
|
|||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 1. Range partitioning
|
||||
-- 4.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------
|
||||
|
|
@ -440,7 +440,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id < 15000;
|
|||
Filter: (id < 15000)
|
||||
(5 rows)
|
||||
|
||||
-- 2. List partitioning
|
||||
-- 4.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list;
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------
|
||||
|
|
@ -492,7 +492,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id_key = 7;
|
|||
Filter: (id_key = 7)
|
||||
(3 rows)
|
||||
|
||||
-- 3. Multi level range
|
||||
-- 4.3. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
|
||||
QUERY PLAN
|
||||
----------------------------------------------------------
|
||||
|
|
@ -542,7 +542,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dt >= '2015-01-05' AND d
|
|||
-- ------------
|
||||
-- Simple joins
|
||||
-- ------------
|
||||
-- 1. Real tables
|
||||
-- 4.1. Real tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------
|
||||
|
|
@ -602,7 +602,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_multi t1, part_multi t2 WHERE t1.dpt = t2
|
|||
Filter: (dpt = 2)
|
||||
(20 rows)
|
||||
|
||||
-- 2. Hypothetical tables
|
||||
-- 4.2. Hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------------
|
||||
|
|
@ -662,7 +662,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi t1, hypo_part_multi t2 WHERE t
|
|||
Filter: (dpt = 2)
|
||||
(20 rows)
|
||||
|
||||
-- 3. Real tables and hypothetical tables
|
||||
-- 4.3. Real tables and hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
-- =====================================
|
||||
-- Real tables
|
||||
-- ------------
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 1.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
|
|
@ -12,10 +12,10 @@ INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
|||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
SELECT * FROM hypopg_reset_table();
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 2.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
|
|
@ -33,51 +33,51 @@ SELECT * FROM hypopg_analyze('hypo_part_range',100);
|
|||
-- Test hypothetical indexes on hypothetical partitioning behavior
|
||||
-- ===============================================================
|
||||
|
||||
-- Indexes on root partitioning tree
|
||||
-- 3.1 Indexes on root partitioning tree
|
||||
-- ---------------------------------
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range (id)');
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range(id)');
|
||||
|
||||
-- Test on real tables
|
||||
-- 3.2 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.3 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
||||
|
||||
-- Indexes on specific partitions
|
||||
-- 3.4 Indexes on specific partitions
|
||||
-- ------------------------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range_1_10000 (id)');
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range_1_10000(id)');
|
||||
|
||||
-- Test on real tables
|
||||
-- 3.5 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.6 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
||||
|
||||
-- Sanity checks
|
||||
-- 3.7 Sanity checks
|
||||
-- -------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
|
||||
-- No hypothetical on non-leaf partition
|
||||
-- 3.8 No hypothetical on non-leaf partition
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
CREATE TABLE part_multi_2 PARTITION OF part_multi FOR VALUES IN (2) PARTITION BY RANGE(dt);
|
||||
|
|
@ -88,6 +88,7 @@ CREATE TABLE part_multi_1_q1 PARTITION OF part_multi_1 FOR VALUES FROM ($$2015-0
|
|||
CREATE TABLE part_multi_1_q1_b PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-02-01$$) TO ($$2015-04-01$$);
|
||||
CREATE TABLE part_multi_1_q1_a PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$);
|
||||
|
||||
-- 3.9 Same using hypothetical partitioning
|
||||
SELECT * FROM hypopg_partition_table('hypo_part_multi', 'PARTITION BY LIST (dpt)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1', 'PARTITION OF hypo_part_multi FOR VALUES IN (1)', 'PARTITION BY RANGE(dt)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q2', 'PARTITION OF hypo_part_multi_1 FOR VALUES FROM ($$2015-04-01$$) TO ($$2015-07-01$$)');
|
||||
|
|
@ -95,15 +96,18 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1', 'PARTITION OF
|
|||
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_b', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-02-01$$) TO ($$2015-04-01$$)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_a', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$)');
|
||||
|
||||
-- 3.10 Hypothetical index on partitioned table
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_multi_1 (dpt)');
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_multi_1_q1 (dpt)');
|
||||
|
||||
-- 3.11 Hypothetical index on hypothetically partitioned table
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_multi_1 (dpt)');
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_multi_1_q1 (dpt)');
|
||||
|
||||
-- pk constraint check
|
||||
CREATE TABLE t_pk(id integer primary key, val text) PARTITION BY LIST (val);
|
||||
|
||||
-- pk constraint check on hypothetically partitioned table
|
||||
CREATE TABLE hypo_t_pk(id integer primary key, val text);
|
||||
SELECT hypopg_partition_table('hypo_t_pk', 'PARTITION BY LIST (val)');
|
||||
|
||||
|
|
@ -112,15 +116,18 @@ DROP TABLE hypo_t_pk;
|
|||
CREATE TABLE t_unique(id integer, val text) PARTITION BY LIST (val);
|
||||
CREATE UNIQUE INDEX ON t_unique(id);
|
||||
|
||||
-- unique constraint check on hypothetically partitioned table
|
||||
CREATE TABLE hypo_t_unique(id integer, val text);
|
||||
CREATE UNIQUE INDEX ON hypo_t_unique(id);
|
||||
SELECT hypopg_partition_table('hypo_t_unique', 'PARTITION BY LIST (val)');
|
||||
|
||||
-- hypothetical unique index check before hypothetically partitioning table
|
||||
DROP TABLE hypo_t_unique;
|
||||
CREATE TABLE hypo_t_unique(id integer, val text);
|
||||
SELECT count(*) FROM hypopg_create_index('CREATE UNIQUE INDEX on hypo_t_unique (id)');
|
||||
SELECT hypopg_partition_table('hypo_t_unique', 'PARTITION BY LIST (val)');
|
||||
|
||||
-- hypothetical unique index check after hypothetically partitioning table
|
||||
DROP TABLE hypo_t_unique;
|
||||
CREATE TABLE hypo_t_unique(id integer, val text);
|
||||
SELECT hypopg_partition_table('hypo_t_unique', 'PARTITION BY LIST (val)');
|
||||
|
|
@ -132,6 +139,7 @@ DROP TABLE hypo_t_unique;
|
|||
-- constraint exclusion check
|
||||
CREATE TABLE t_constrext(c circle, val text, EXCLUDE USING gist(c WITH &&)) PARTITION BY LIST (val);
|
||||
|
||||
-- constraint exclusion check on hypothetically partitioned table
|
||||
CREATE TABLE hypo_t_constrext(c circle, val text, EXCLUDE USING gist(c WITH &&));
|
||||
SELECT hypopg_partition_table('hypo_t_constrext', 'PARTITION BY LIST (val)');
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
-- =====================================
|
||||
-- Real tables
|
||||
-- ------------
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 1.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
|
|
@ -12,10 +12,10 @@ INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
|||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
SELECT * FROM hypopg_reset_table();
|
||||
-- 1. Range partitioning for hypothetical index
|
||||
-- 2.1. Range partitioning for hypothetical index
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
|
|
@ -33,51 +33,51 @@ SELECT * FROM hypopg_analyze('hypo_part_range',100);
|
|||
-- Test hypothetical indexes on hypothetical partitioning behavior
|
||||
-- ===============================================================
|
||||
|
||||
-- Indexes on root partitioning tree
|
||||
-- 3.1 Indexes on root partitioning tree
|
||||
-- ---------------------------------
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range (id)');
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range(id)');
|
||||
|
||||
-- Test on real tables
|
||||
-- 3.2 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.3 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
||||
|
||||
-- Indexes on specific partitions
|
||||
-- 3.4 Indexes on specific partitions
|
||||
-- ------------------------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range_1_10000 (id)');
|
||||
SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range_1_10000(id)');
|
||||
|
||||
-- Test on real tables
|
||||
-- 3.5 Test on real tables
|
||||
-- -------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000';
|
||||
|
||||
-- Test on hypothetical tables
|
||||
-- 3.6 Test on hypothetical tables
|
||||
-- ---------------------------
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000';
|
||||
SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id > 28000') e
|
||||
WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';
|
||||
|
||||
-- Sanity checks
|
||||
-- 3.7 Sanity checks
|
||||
-- -------------
|
||||
SELECT * FROM hypopg_reset_index();
|
||||
|
||||
-- No hypothetical on non-leaf partition
|
||||
-- 3.8 No hypothetical on non-leaf partition
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
CREATE TABLE part_multi_2 PARTITION OF part_multi FOR VALUES IN (2) PARTITION BY RANGE(dt);
|
||||
|
|
|
|||
|
|
@ -3,21 +3,21 @@
|
|||
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partition
|
||||
-- 1.1. Range partition
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
CREATE TABLE part_range_10000_20000 PARTITION OF part_range FOR VALUES FROM (10000) TO (20000);
|
||||
CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (20000) TO (30000);
|
||||
INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
-- 2. List partitioning
|
||||
-- 1.2. List partitioning
|
||||
DROP TABLE IF EXISTS part_list;
|
||||
CREATE TABLE part_list (id integer, id_key integer, val text) PARTITION BY LIST (id_key);
|
||||
CREATE TABLE part_list_4_5_6_8_10 PARTITION OF part_list FOR VALUES IN (4, 5, 6, 8, 10);
|
||||
CREATE TABLE part_list_7_9 PARTITION OF part_list FOR VALUES IN (7, 9);
|
||||
CREATE TABLE part_list_1_2_3 PARTITION OF part_list FOR VALUES IN (1, 2, 3);
|
||||
INSERT INTO part_list SELECT i, (i % 9) + 1, 'line ' || i FROM generate_series(1, 50000) i;
|
||||
-- 3. Hash partitioning
|
||||
-- 1.3. Hash partitioning
|
||||
DROP TABLE IF EXISTS part_hash;
|
||||
CREATE TABLE part_hash (id integer, val text) PARTITION BY HASH (id);
|
||||
CREATE TABLE part_hash_9 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 9);
|
||||
|
|
@ -31,7 +31,7 @@ CREATE TABLE part_hash_2 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REM
|
|||
CREATE TABLE part_hash_1 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 1);
|
||||
CREATE TABLE part_hash_0 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 0);
|
||||
INSERT INTO part_hash SELECT i, 'line ' || i FROM generate_series(1, 90000) i;
|
||||
-- 4. Multi level range
|
||||
-- 1.4. Multi level range
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
CREATE TABLE part_multi_2 PARTITION OF part_multi FOR VALUES IN (2) PARTITION BY RANGE(dt);
|
||||
|
|
@ -64,9 +64,9 @@ INSERT INTO part_multi select (i%4)+1, '2015-01-01'::date + interval '1 day' * (
|
|||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset();
|
||||
-- 1. Range partition
|
||||
-- 2.1. Range partition
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
|
|
@ -74,7 +74,7 @@ SELECT * FROM hypopg_partition_table('hypo_part_range', 'PARTITION BY RANGE (id)
|
|||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_10000_20000', 'PARTITION OF hypo_part_range FOR VALUES FROM (10000) TO (20000)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_20000_30000', 'PARTITION OF hypo_part_range FOR VALUES FROM (20000) TO (30000)');
|
||||
-- 2. List partitioning
|
||||
-- 2.2. List partitioning
|
||||
DROP TABLE IF EXISTS hypo_part_list;
|
||||
CREATE TABLE hypo_part_list (id integer, id_key integer, val text);
|
||||
INSERT INTO hypo_part_list SELECT i, (i % 9) + 1, 'line ' || i FROM generate_series(1, 50000) i;
|
||||
|
|
@ -82,7 +82,7 @@ SELECT * FROM hypopg_partition_table('hypo_part_list', 'PARTITION BY LIST (id_ke
|
|||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_4_5_6_8_10', 'PARTITION OF hypo_part_list FOR VALUES IN (4, 5, 6, 8, 10)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_7_9', 'PARTITION OF hypo_part_list FOR VALUES IN (7, 9)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_1_2_3', 'PARTITION OF hypo_part_list FOR VALUES IN (1, 2, 3)');
|
||||
-- 3. Hash partitioning
|
||||
-- 2.3. Hash partitioning
|
||||
DROP TABLE IF EXISTS hypo_part_hash;
|
||||
CREATE TABLE hypo_part_hash (id integer, val text);
|
||||
INSERT INTO hypo_part_hash SELECT i, 'line ' || i FROM generate_series(1, 90000) i;
|
||||
|
|
@ -97,7 +97,7 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_hash_3', 'PARTITION OF hyp
|
|||
SELECT tablename FROM hypopg_add_partition('hypo_part_hash_2', 'PARTITION OF hypo_part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 2)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_hash_1', 'PARTITION OF hypo_part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 1)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_hash_0', 'PARTITION OF hypo_part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 0)');
|
||||
-- 4. Multi level range
|
||||
-- 2.4. Multi level range
|
||||
DROP TABLE IF EXISTS hypo_part_multi;
|
||||
CREATE TABLE hypo_part_multi(dpt smallint, dt date, val text);
|
||||
INSERT INTO hypo_part_multi select (i%4)+1, '2015-01-01'::date + interval '1 day' * (i%500), 'val ' || i FROM generate_series(1,50000) i;
|
||||
|
|
@ -154,42 +154,42 @@ ORDER BY tablename COLLATE "C";
|
|||
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partitioning
|
||||
-- 3.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id = 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id < 15000;
|
||||
-- 2. List partitioning
|
||||
-- 3.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id < 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id_key = 7;
|
||||
-- 3. Hash partitioning
|
||||
-- 3.3. Hash partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash WHERE id = 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash WHERE id < 15000;
|
||||
-- 4. Multi level range
|
||||
-- 3.4. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi WHERE dpt = 2;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi WHERE dt >= '2015-01-05' AND dt < '2015-01-10';
|
||||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 1. Range partitioning
|
||||
-- 4.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id < 15000;
|
||||
-- 2. List partitioning
|
||||
-- 4.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id < 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id_key = 7;
|
||||
-- 3. Hash partitioning
|
||||
-- 4.3. Hash partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash WHERE id = 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash WHERE id < 15000;
|
||||
-- 4. Multi level range
|
||||
-- 4.4. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dpt = 2;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dt >= '2015-01-05' AND dt < '2015-01-10';
|
||||
|
|
@ -200,17 +200,17 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dt >= '2015-01-05' AND d
|
|||
|
||||
-- Simple joins
|
||||
-- ------------
|
||||
-- 1. Real tables
|
||||
-- 5.1. Real tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list t1, part_list t2 WHERE t1.id_key = t2.id_key and t1.id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash t1, part_hash t2 WHERE t1.id = t2.id;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi t1, part_multi t2 WHERE t1.dpt = t2.dpt and t1.dpt = 2;
|
||||
-- 2. Hypothetical tables
|
||||
-- 5.2. Hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list t1, hypo_part_list t2 WHERE t1.id_key = t2.id_key and t1.id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash t1, hypo_part_hash t2 WHERE t1.id = t2.id;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi t1, hypo_part_multi t2 WHERE t1.dpt = t2.dpt and t1.dpt = 2;
|
||||
-- 3. Real tables and hypothetical tables
|
||||
-- 5.3. Real tables and hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list t1, hypo_part_list t2 WHERE t1.id_key = t2.id_key and t1.id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash t1, hypo_part_hash t2 WHERE t1.id = t2.id;
|
||||
|
|
@ -222,32 +222,32 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_multi t1, hypo_part_multi t2 WHERE t1.dpt
|
|||
-- -------------------------
|
||||
SET enable_partitionwise_join to true;
|
||||
|
||||
-- 1. Real tables
|
||||
-- 6.1. Real tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash t1, part_hash t2 WHERE t1.id = t2.id;
|
||||
-- 2. Hypothetical tables
|
||||
-- 6.2. Hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash t1, hypo_part_hash t2 WHERE t1.id = t2.id;
|
||||
-- 3. Real tables and hypothetical tables
|
||||
-- 6.3. Real tables and hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_hash t1, hypo_part_hash t2 WHERE t1.id = t2.id;
|
||||
|
||||
-- Tests for sanity checks
|
||||
-- =======================
|
||||
|
||||
-- Duplicate name
|
||||
-- 7.1 Duplicate name
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)');
|
||||
-- Overlapping range bounds
|
||||
-- 7.2 Overlapping range bounds
|
||||
CREATE TABLE part_range_1_10000_dup PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000_dup', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)');
|
||||
-- Overlapping list bounds
|
||||
-- 7.3 Overlapping list bounds
|
||||
CREATE TABLE part_list_1_2_3_dup PARTITION OF part_list FOR VALUES IN (1, 2, 3);
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_1_2_3_dup', 'PARTITION OF hypo_part_list FOR VALUES IN (1, 2, 3)');
|
||||
-- Overlapping hash bounds
|
||||
-- 7.4 Overlapping hash bounds
|
||||
CREATE TABLE part_hash_0 PARTITION OF part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 0);
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_hash_0_dup', 'PARTITION OF hypo_part_hash FOR VALUES WITH (MODULUS 10, REMAINDER 0)');
|
||||
-- Overlapping range bounds, subpartition
|
||||
-- 7.5 Overlapping range bounds, subpartition
|
||||
CREATE TABLE part_multi_1_q1_a PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$);
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_a_dup', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$)');
|
||||
|
||||
|
|
@ -267,24 +267,24 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = 42;
|
|||
|
||||
-- no UPDATE/DELETE test
|
||||
-- =====================
|
||||
-- simple UPDATE and DELETE on hypothetically partitioned table
|
||||
-- 8.1 simple UPDATE and DELETE on hypothetically partitioned table
|
||||
EXPLAIN (COSTS OFF) UPDATE hypo_part_range set id = id;
|
||||
EXPLAIN DELETE FROM hypo_part_range WHERE id = 42;
|
||||
-- UPDATE and DELETE on hypothetically partitioned table inside CTE
|
||||
-- 8.2 UPDATE and DELETE on hypothetically partitioned table inside CTE
|
||||
EXPLAIN (COSTS OFF) WITH s AS (UPDATE hypo_part_range set id = id returning *) SELECT 1;
|
||||
EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM hypo_part_range WHERE id = 42 returning *) SELECT 1;
|
||||
-- UPDATE and DELETE involving hypothetically partitioned table, but on regular
|
||||
-- tables
|
||||
-- 8.3 UPDATE and DELETE involving hypothetically partitioned table, but on
|
||||
-- regular tables
|
||||
CREATE TABLE foo(id integer);
|
||||
-- UPDATE on non hypothetically partitioned table but having a hypothetically
|
||||
-- 8.4 UPDATE on non hypothetically partitioned table but having a hypothetically
|
||||
-- partitioned table joined
|
||||
EXPLAIN (COSTS OFF) WITH s AS (UPDATE foo SET id = 0 from hypo_part_range WHERE foo.id = hypo_part_range.id AND hypo_part_range.id > 25000 RETURNING *) SELECT 1;
|
||||
-- same but with real table
|
||||
-- 8.5 same but with real table
|
||||
EXPLAIN (COSTS OFF) WITH s AS (UPDATE foo SET id = 0 from part_range WHERE foo.id = part_range.id AND part_range.id > 25000 RETURNING *) SELECT 1;
|
||||
-- DELETE on non hypothetically partitioned table but having a hypothetically
|
||||
-- partitioned table joined
|
||||
-- 8.6 DELETE on non hypothetically partitioned table but having a
|
||||
-- hypothetically partitioned table joined
|
||||
EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM foo USING hypo_part_range WHERE foo.id = hypo_part_range.id AND hypo_part_range.id = 42 RETURNING *) SELECT 1;
|
||||
-- same but with real table
|
||||
-- 8.7 same but with real table
|
||||
EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM foo USING part_range WHERE foo.id = part_range.id AND part_range.id = 42 RETURNING *) SELECT 1;
|
||||
|
||||
-- childless partitioning
|
||||
|
|
|
|||
|
|
@ -3,21 +3,21 @@
|
|||
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partition
|
||||
-- 1.1. Range partition
|
||||
DROP TABLE IF EXISTS part_range;
|
||||
CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id);
|
||||
CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000);
|
||||
CREATE TABLE part_range_10000_20000 PARTITION OF part_range FOR VALUES FROM (10000) TO (20000);
|
||||
CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (20000) TO (30000);
|
||||
INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
-- 2. List partitioning
|
||||
-- 1.2. List partitioning
|
||||
DROP TABLE IF EXISTS part_list;
|
||||
CREATE TABLE part_list (id integer, id_key integer, val text) PARTITION BY LIST (id_key);
|
||||
CREATE TABLE part_list_4_5_6_8_10 PARTITION OF part_list FOR VALUES IN (4, 5, 6, 8, 10);
|
||||
CREATE TABLE part_list_7_9 PARTITION OF part_list FOR VALUES IN (7, 9);
|
||||
CREATE TABLE part_list_1_2_3 PARTITION OF part_list FOR VALUES IN (1, 2, 3);
|
||||
INSERT INTO part_list SELECT i, (i % 9) + 1, 'line ' || i FROM generate_series(1, 50000) i;
|
||||
-- 3. Multi level range
|
||||
-- 1.3. Multi level range
|
||||
DROP TABLE IF EXISTS part_multi;
|
||||
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
|
||||
CREATE TABLE part_multi_2 PARTITION OF part_multi FOR VALUES IN (2) PARTITION BY RANGE(dt);
|
||||
|
|
@ -41,9 +41,9 @@ INSERT INTO part_multi select (i%3)+1, '2015-01-01'::date + interval '1 day' * (
|
|||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 0. Dropping any hypothetical object
|
||||
-- 2.0. Dropping any hypothetical object
|
||||
SELECT * FROM hypopg_reset();
|
||||
-- 1. Range partition
|
||||
-- 2.1. Range partition
|
||||
DROP TABLE IF EXISTS hypo_part_range;
|
||||
CREATE TABLE hypo_part_range (id integer, val text);
|
||||
INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i;
|
||||
|
|
@ -51,7 +51,7 @@ SELECT * FROM hypopg_partition_table('hypo_part_range', 'PARTITION BY RANGE (id)
|
|||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_10000_20000', 'PARTITION OF hypo_part_range FOR VALUES FROM (10000) TO (20000)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_range_20000_30000', 'PARTITION OF hypo_part_range FOR VALUES FROM (20000) TO (30000)');
|
||||
-- 2. List partitioning
|
||||
-- 2.2. List partitioning
|
||||
DROP TABLE IF EXISTS hypo_part_list;
|
||||
CREATE TABLE hypo_part_list (id integer, id_key integer, val text);
|
||||
INSERT INTO hypo_part_list SELECT i, (i % 9) + 1, 'line ' || i FROM generate_series(1, 50000) i;
|
||||
|
|
@ -59,7 +59,7 @@ SELECT * FROM hypopg_partition_table('hypo_part_list', 'PARTITION BY LIST (id_ke
|
|||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_4_5_6_8_10', 'PARTITION OF hypo_part_list FOR VALUES IN (4, 5, 6, 8, 10)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_7_9', 'PARTITION OF hypo_part_list FOR VALUES IN (7, 9)');
|
||||
SELECT tablename FROM hypopg_add_partition('hypo_part_list_1_2_3', 'PARTITION OF hypo_part_list FOR VALUES IN (1, 2, 3)');
|
||||
-- 3. Multi level range
|
||||
-- 2.3. Multi level range
|
||||
DROP TABLE IF EXISTS hypo_part_multi;
|
||||
CREATE TABLE hypo_part_multi(dpt smallint, dt date, val text);
|
||||
INSERT INTO hypo_part_multi select (i%3)+1, '2015-01-01'::date + interval '1 day' * (i%365), 'val ' || i FROM generate_series(1,50000) i;
|
||||
|
|
@ -106,34 +106,34 @@ ORDER BY tablename COLLATE "C";
|
|||
|
||||
-- Real tables
|
||||
-- -----------
|
||||
-- 1. Range partitioning
|
||||
-- 3.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id = 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id < 15000;
|
||||
-- 2. List partitioning
|
||||
-- 3.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id < 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list WHERE id_key = 7;
|
||||
-- 3. Multi level range
|
||||
-- 3.3. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi WHERE dpt = 2;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi WHERE dt >= '2015-01-05' AND dt < '2015-01-10';
|
||||
|
||||
-- Hypothetical tables
|
||||
-- -------------------
|
||||
-- 1. Range partitioning
|
||||
-- 4.1. Range partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id < 15000;
|
||||
-- 2. List partitioning
|
||||
-- 4.2. List partitioning
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id < 42;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list WHERE id_key = 7;
|
||||
-- 3. Multi level range
|
||||
-- 4.3. Multi level range
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dpt = 2;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dt >= '2015-01-05' AND dt < '2015-01-10';
|
||||
|
|
@ -144,15 +144,15 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi WHERE dt >= '2015-01-05' AND d
|
|||
|
||||
-- Simple joins
|
||||
-- ------------
|
||||
-- 1. Real tables
|
||||
-- 4.1. Real tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list t1, part_list t2 WHERE t1.id_key = t2.id_key and t1.id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi t1, part_multi t2 WHERE t1.dpt = t2.dpt and t1.dpt = 2;
|
||||
-- 2. Hypothetical tables
|
||||
-- 4.2. Hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_list t1, hypo_part_list t2 WHERE t1.id_key = t2.id_key and t1.id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi t1, hypo_part_multi t2 WHERE t1.dpt = t2.dpt and t1.dpt = 2;
|
||||
-- 3. Real tables and hypothetical tables
|
||||
-- 4.3. Real tables and hypothetical tables
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range t1, hypo_part_range t2 WHERE t1.id = t2.id and t1.id < 15000;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_list t1, hypo_part_list t2 WHERE t1.id_key = t2.id_key and t1.id_key < 5;
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_multi t1, hypo_part_multi t2 WHERE t1.dpt = t2.dpt and t1.dpt = 2;
|
||||
|
|
|
|||
Loading…
Reference in a new issue