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