From 53823a06be6f40d88d8e3ba45045ecee1a21fc5e Mon Sep 17 00:00:00 2001 From: David Rowley Date: Fri, 5 Aug 2022 10:14:00 +1200 Subject: [PATCH] Fix failure to set correct operator in window run condition This was a simple omission in 9d9c02ccd where the code didn't correctly set the operator to use in the run condition OpExpr when the window function was both monotonically increasing and decreasing. Bug discovered by Julien Roze, although he did not report it. Reported-by: Phil Florent Discussion: https://postgr.es/m/PA4P191MB160009A09B9D0624359278CFBA9F9@PA4P191MB1600.EURP191.PROD.OUTLOOK.COM Backpatch-through: 15, where 9d9c02ccd was added --- src/backend/optimizer/path/allpaths.c | 1 + src/test/regress/expected/window.out | 17 +++++++++++++++++ src/test/regress/sql/window.sql | 11 +++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index b23cc8ee82..8fc28007f5 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -2306,6 +2306,7 @@ find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, { *keep_original = false; runopexpr = opexpr; + runoperator = opexpr->opno; break; } diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index 433a0bb025..55dcd668c9 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -3646,6 +3646,23 @@ WHERE c <= 3; 3 | sales | 4800 | 3 (8 rows) +-- Ensure we get the correct run condition when the window function is both +-- monotonically increasing and decreasing. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER () c + FROM empsalary) emp +WHERE c = 1; + QUERY PLAN +-------------------------------------------------------- + WindowAgg + Run Condition: (count(empsalary.empno) OVER (?) = 1) + -> Seq Scan on empsalary +(3 rows) + -- Some more complex cases with multiple window clauses EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql index a504e46e40..57c39e796c 100644 --- a/src/test/regress/sql/window.sql +++ b/src/test/regress/sql/window.sql @@ -1150,6 +1150,17 @@ SELECT * FROM FROM empsalary) emp WHERE c <= 3; +-- Ensure we get the correct run condition when the window function is both +-- monotonically increasing and decreasing. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER () c + FROM empsalary) emp +WHERE c = 1; + -- Some more complex cases with multiple window clauses EXPLAIN (COSTS OFF) SELECT * FROM