mirror of
https://github.com/HypoPG/hypopg
synced 2026-05-24 09:38:21 +00:00
Add regression test for rutime partitiong pruning, pg11+
This unfortunately can't be supported in pg11. Current code is currently broken, so later commit will add a proper fix to disable runtime partition pruning on hypothetically partitioned tables.
This commit is contained in:
parent
ad1cc8319e
commit
951ea5fed2
2 changed files with 211 additions and 0 deletions
|
|
@ -1381,6 +1381,184 @@ EXPLAIN (COSTS OFF) SELECT * FROM part_hash t1, hypo_part_hash t2 WHERE t1.id =
|
|||
-> Seq Scan on part_hash_9 t1_9
|
||||
(51 rows)
|
||||
|
||||
-- Runtime partition pruning
|
||||
-- -------------------------
|
||||
-- 6B.0 Add function to easily simulate runtime partitioning
|
||||
CREATE FUNCTION hypo_number_one() RETURNS integer AS
|
||||
$_$
|
||||
BEGIN
|
||||
RETURN 1;
|
||||
END;
|
||||
$_$ LANGUAGE plpgsql STABLE;
|
||||
-- 6B.1 disable runtime partition pruning
|
||||
SET enable_partition_pruning to false;
|
||||
-- 6B.2 simple case
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id = hypo_number_one();
|
||||
QUERY PLAN
|
||||
------------------------------------------
|
||||
Append
|
||||
-> Seq Scan on part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(7 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = hypo_number_one();
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------
|
||||
Append
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(7 rows)
|
||||
|
||||
-- 6B.3 CTE
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------
|
||||
CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
-> Seq Scan on part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(9 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------------
|
||||
CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(9 rows)
|
||||
|
||||
-- 6B.4 InitPlan
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
QUERY PLAN
|
||||
----------------------------------------------------------
|
||||
Result
|
||||
InitPlan 2 (returns $1)
|
||||
-> CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
-> Seq Scan on part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(11 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
QUERY PLAN
|
||||
-------------------------------------------------------------------------------
|
||||
Result
|
||||
InitPlan 2 (returns $1)
|
||||
-> CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(11 rows)
|
||||
|
||||
-- 6B.5 enable runtime partition pruning
|
||||
SET enable_partition_pruning to true;
|
||||
-- 6B.6 simple case
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id = hypo_number_one();
|
||||
QUERY PLAN
|
||||
------------------------------------------
|
||||
Append
|
||||
Subplans Removed: 2
|
||||
-> Seq Scan on part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
(4 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = hypo_number_one();
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------
|
||||
Append
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(7 rows)
|
||||
|
||||
-- 6B.7 CTE
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------
|
||||
CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
Subplans Removed: 2
|
||||
-> Seq Scan on part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
(6 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------------
|
||||
CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(9 rows)
|
||||
|
||||
-- 6B.8 InitPlan
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
QUERY PLAN
|
||||
----------------------------------------------------------
|
||||
Result
|
||||
InitPlan 2 (returns $1)
|
||||
-> CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
Subplans Removed: 2
|
||||
-> Seq Scan on part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
(8 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
QUERY PLAN
|
||||
-------------------------------------------------------------------------------
|
||||
Result
|
||||
InitPlan 2 (returns $1)
|
||||
-> CTE Scan on s
|
||||
CTE s
|
||||
-> Append
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_1_10000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_10000_20000
|
||||
Filter: (id = hypo_number_one())
|
||||
-> Seq Scan on hypo_part_range hypo_part_range_20000_30000
|
||||
Filter: (id = hypo_number_one())
|
||||
(11 rows)
|
||||
|
||||
-- Tests for sanity checks
|
||||
-- =======================
|
||||
-- 7.1 Duplicate name
|
||||
|
|
|
|||
|
|
@ -232,6 +232,39 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_hash t1, hypo_part_hash t2 WHERE t1.
|
|||
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;
|
||||
|
||||
-- Runtime partition pruning
|
||||
-- -------------------------
|
||||
|
||||
-- 6B.0 Add function to easily simulate runtime partitioning
|
||||
CREATE FUNCTION hypo_number_one() RETURNS integer AS
|
||||
$_$
|
||||
BEGIN
|
||||
RETURN 1;
|
||||
END;
|
||||
$_$ LANGUAGE plpgsql STABLE;
|
||||
-- 6B.1 disable runtime partition pruning
|
||||
SET enable_partition_pruning to false;
|
||||
-- 6B.2 simple case
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id = hypo_number_one();
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = hypo_number_one();
|
||||
-- 6B.3 CTE
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
-- 6B.4 InitPlan
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
-- 6B.5 enable runtime partition pruning
|
||||
SET enable_partition_pruning to true;
|
||||
-- 6B.6 simple case
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM part_range WHERE id = hypo_number_one();
|
||||
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_range WHERE id = hypo_number_one();
|
||||
-- 6B.7 CTE
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
EXPLAIN (COSTS OFF) WITH s AS (SELECT * FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s;
|
||||
-- 6B.8 InitPlan
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
EXPLAIN (COSTS OFF) SELECT (WITH s AS (SELECT 1 FROM hypo_part_range WHERE id = hypo_number_one()) SELECT * FROM s);
|
||||
|
||||
-- Tests for sanity checks
|
||||
-- =======================
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue