From ad1cc8319e1213c867002ca6eff986ca2f7ced54 Mon Sep 17 00:00:00 2001 From: Julien Rouhaud Date: Wed, 26 Jun 2019 20:22:29 +0200 Subject: [PATCH] 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. --- expected/hypo_index_table.out | 30 ++++++++----- expected/hypo_index_table_10.out | 22 +++++----- expected/hypo_table.out | 74 ++++++++++++++++---------------- expected/hypo_table_10.out | 32 +++++++------- test/sql/hypo_index_table.sql | 30 ++++++++----- test/sql/hypo_index_table_10.sql | 22 +++++----- test/sql/hypo_table.sql | 74 ++++++++++++++++---------------- test/sql/hypo_table_10.sql | 32 +++++++------- 8 files changed, 166 insertions(+), 150 deletions(-) diff --git a/expected/hypo_index_table.out b/expected/hypo_index_table.out index 658e045..9c035bd 100644 --- a/expected/hypo_index_table.out +++ b/expected/hypo_index_table.out @@ -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 diff --git a/expected/hypo_index_table_10.out b/expected/hypo_index_table_10.out index 745f573..b981de5 100644 --- a/expected/hypo_index_table_10.out +++ b/expected/hypo_index_table_10.out @@ -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); diff --git a/expected/hypo_table.out b/expected/hypo_table.out index b1e81b3..2221a8a 100644 --- a/expected/hypo_table.out +++ b/expected/hypo_table.out @@ -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 ---------------------------------------------------------- diff --git a/expected/hypo_table_10.out b/expected/hypo_table_10.out index f1e20cd..1f9fb63 100644 --- a/expected/hypo_table_10.out +++ b/expected/hypo_table_10.out @@ -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 --------------------------------------------------------------------- diff --git a/test/sql/hypo_index_table.sql b/test/sql/hypo_index_table.sql index 6025bd4..9dd68a8 100644 --- a/test/sql/hypo_index_table.sql +++ b/test/sql/hypo_index_table.sql @@ -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)'); diff --git a/test/sql/hypo_index_table_10.sql b/test/sql/hypo_index_table_10.sql index 16d9785..6be320f 100644 --- a/test/sql/hypo_index_table_10.sql +++ b/test/sql/hypo_index_table_10.sql @@ -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); diff --git a/test/sql/hypo_table.sql b/test/sql/hypo_table.sql index 02f38ea..4c2d3a9 100644 --- a/test/sql/hypo_table.sql +++ b/test/sql/hypo_table.sql @@ -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 diff --git a/test/sql/hypo_table_10.sql b/test/sql/hypo_table_10.sql index 42404de..eb8c59b 100644 --- a/test/sql/hypo_table_10.sql +++ b/test/sql/hypo_table_10.sql @@ -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;