]> granicus.if.org Git - postgresql/commitdiff
Fix STRICT check for strict aggregates with NULL ORDER BY columns.
authorAndres Freund <andres@anarazel.de>
Sat, 3 Nov 2018 21:35:23 +0000 (14:35 -0700)
committerAndres Freund <andres@anarazel.de>
Sat, 3 Nov 2018 21:48:42 +0000 (14:48 -0700)
I (Andres) broke this unintentionally in 69c3936a14, by checking
strictness for all input expressions computed for an aggregate, rather
than just the input for the aggregate transition function.

Reported-By: Ondřej Bouda
Bisected-By: Tom Lane
Diagnosed-By: Andrew Gierth
Discussion: https://postgr.es/m/2a505161-2727-2473-7c46-591ed108ac52@email.cz
Backpatch: 11-, like 69c3936a14

src/backend/executor/execExpr.c
src/test/regress/expected/aggregates.out
src/test/regress/sql/aggregates.sql

index c5e8634aeda092fc7ba340808d1b82aaa547462e..5397de4e05012fdc8f41caef8360b69d96c4dbec 100644 (file)
@@ -3028,7 +3028,7 @@ ExecBuildAggTrans(AggState *aggstate, AggStatePerPhase phase,
                        scratch.opcode = EEOP_AGG_STRICT_INPUT_CHECK;
                        scratch.d.agg_strict_input_check.nulls = strictnulls;
                        scratch.d.agg_strict_input_check.jumpnull = -1; /* adjust later */
-                       scratch.d.agg_strict_input_check.nargs = numInputs;
+                       scratch.d.agg_strict_input_check.nargs = pertrans->numTransInputs;
                        ExprEvalPushStep(state, &scratch);
                        adjust_bailout = lappend_int(adjust_bailout,
                                                                                 state->steps_len - 1);
index 717e965f306b090bb343f28353c37461e628678a..20dacfe4b0c410d25bdddedadb985596f9c8ca45 100644 (file)
@@ -2229,3 +2229,18 @@ SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),
           1
 (3 rows)
 
+-- Ensure that the STRICT checks for aggregates does not take NULLness
+-- of ORDER BY columns into account. See bug report around
+-- 2a505161-2727-2473-7c46-591ed108ac52@email.cz
+SELECT min(x ORDER BY y) FROM (VALUES(1, NULL)) AS d(x,y);
+ min 
+-----
+   1
+(1 row)
+
+SELECT min(x ORDER BY y) FROM (VALUES(1, 2)) AS d(x,y);
+ min 
+-----
+   1
+(1 row)
+
index 83a5492fdda7caf792a281254b7f9c566c5c357b..8192d457e9f620b8f004a2588dd2b467265ac4f3 100644 (file)
@@ -969,3 +969,10 @@ ROLLBACK;
 
 -- test coverage for dense_rank
 SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),(3)) v(x) GROUP BY (x) ORDER BY 1;
+
+
+-- Ensure that the STRICT checks for aggregates does not take NULLness
+-- of ORDER BY columns into account. See bug report around
+-- 2a505161-2727-2473-7c46-591ed108ac52@email.cz
+SELECT min(x ORDER BY y) FROM (VALUES(1, NULL)) AS d(x,y);
+SELECT min(x ORDER BY y) FROM (VALUES(1, 2)) AS d(x,y);