mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
Fix a few mistakes in partition aggregate tests
The pattern seems to be to EXPLAIN the query to ensure we get the
expected partition-wise aggregate plan, then run the same query to check
the results are what we expect. A couple of places didn't use the same
query between the EXPLAIN and the checking of the results, which
effectively voided the plan check.
Additionally, a comment claimed array_agg() didn't support partial mode,
but that was made not true in 16fd03e95.
Author: Matthias van de Meent <boekewurm@gmail.com>
Reviewed-by: Pierre Forstmann <pierre.forstmann@gmail.com>
Reviewed-by: David Rowley <dgrowleyml@gmail.com>
Discussion: https://postgr.es/m/CAEze2WgjJUiqV-VZVrWqYz+ETLtd4oKk2gbvBWxf1Fo0is5XVQ@mail.gmail.com
Backpatch-through: 14
This commit is contained in:
@@ -975,8 +975,8 @@ SET max_parallel_workers_per_gather TO 2;
|
|||||||
SET parallel_setup_cost = 0;
|
SET parallel_setup_cost = 0;
|
||||||
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
||||||
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
||||||
-- PARTITION KEY, but still we do not see a partial aggregation as array_agg()
|
-- PARTITION KEY, but still we do not see a partial aggregation as
|
||||||
-- is not partial agg safe.
|
-- array_agg(distinct) is not partial agg safe.
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
@@ -1114,13 +1114,14 @@ SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER B
|
|||||||
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
||||||
-- PARTITION KEY
|
-- PARTITION KEY
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
Sort
|
Sort
|
||||||
Sort Key: pagg_tab_ml.b, (sum(pagg_tab_ml.a)), (count(*))
|
Sort Key: pagg_tab_ml.b, (sum(pagg_tab_ml.a)), (count(*))
|
||||||
-> Finalize GroupAggregate
|
-> Finalize GroupAggregate
|
||||||
Group Key: pagg_tab_ml.b
|
Group Key: pagg_tab_ml.b
|
||||||
|
Filter: (avg(pagg_tab_ml.a) < '15'::numeric)
|
||||||
-> Sort
|
-> Sort
|
||||||
Sort Key: pagg_tab_ml.b
|
Sort Key: pagg_tab_ml.b
|
||||||
-> Append
|
-> Append
|
||||||
@@ -1139,7 +1140,7 @@ SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3;
|
|||||||
-> Partial HashAggregate
|
-> Partial HashAggregate
|
||||||
Group Key: pagg_tab_ml_4.b
|
Group Key: pagg_tab_ml_4.b
|
||||||
-> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4
|
-> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4
|
||||||
(22 rows)
|
(23 rows)
|
||||||
|
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
b | sum | count
|
b | sum | count
|
||||||
@@ -1268,13 +1269,14 @@ SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER B
|
|||||||
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
||||||
-- PARTITION KEY
|
-- PARTITION KEY
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------
|
||||||
Sort
|
Sort
|
||||||
Sort Key: pagg_tab_ml.b, (sum(pagg_tab_ml.a)), (count(*))
|
Sort Key: pagg_tab_ml.b, (sum(pagg_tab_ml.a)), (count(*))
|
||||||
-> Finalize GroupAggregate
|
-> Finalize GroupAggregate
|
||||||
Group Key: pagg_tab_ml.b
|
Group Key: pagg_tab_ml.b
|
||||||
|
Filter: (avg(pagg_tab_ml.a) < '15'::numeric)
|
||||||
-> Gather Merge
|
-> Gather Merge
|
||||||
Workers Planned: 2
|
Workers Planned: 2
|
||||||
-> Sort
|
-> Sort
|
||||||
@@ -1295,7 +1297,7 @@ SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3;
|
|||||||
-> Partial HashAggregate
|
-> Partial HashAggregate
|
||||||
Group Key: pagg_tab_ml_2.b
|
Group Key: pagg_tab_ml_2.b
|
||||||
-> Parallel Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2
|
-> Parallel Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2
|
||||||
(24 rows)
|
(25 rows)
|
||||||
|
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
b | sum | count
|
b | sum | count
|
||||||
|
|||||||
@@ -231,8 +231,8 @@ SET parallel_setup_cost = 0;
|
|||||||
|
|
||||||
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY
|
||||||
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
-- for level 1 only. For subpartitions, GROUP BY clause does not match with
|
||||||
-- PARTITION KEY, but still we do not see a partial aggregation as array_agg()
|
-- PARTITION KEY, but still we do not see a partial aggregation as
|
||||||
-- is not partial agg safe.
|
-- array_agg(distinct) is not partial agg safe.
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
||||||
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3;
|
||||||
@@ -253,7 +253,7 @@ SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER B
|
|||||||
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
||||||
-- PARTITION KEY
|
-- PARTITION KEY
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
|
|
||||||
-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY
|
-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY
|
||||||
@@ -276,7 +276,7 @@ SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER B
|
|||||||
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
-- Partial aggregation at all levels as GROUP BY clause does not match with
|
||||||
-- PARTITION KEY
|
-- PARTITION KEY
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3;
|
||||||
|
|
||||||
-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY
|
-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY
|
||||||
|
|||||||
Reference in New Issue
Block a user