aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_clause.c
diff options
context:
space:
mode:
authorDavid Rowley <drowley@postgresql.org>2022-05-27 10:37:58 +1200
committerDavid Rowley <drowley@postgresql.org>2022-05-27 10:37:58 +1200
commit3e9abd2eb1b1f6863250f060290f514f30ce8044 (patch)
tree12e997b82b3f2ea3079b41f618c8d35792c3df5c /src/backend/parser/parse_clause.c
parent2b65de7fc296bb5060c8d4ae8cb680f71364fbe0 (diff)
downloadpostgresql-3e9abd2eb1b1f6863250f060290f514f30ce8044.tar.gz
postgresql-3e9abd2eb1b1f6863250f060290f514f30ce8044.zip
Teach remove_unused_subquery_outputs about window run conditions
9d9c02ccd added code to allow the executor to take shortcuts when quals on monotonic window functions guaranteed that once the qual became false it could never become true again. When possible, baserestrictinfo quals are converted to become these quals, which we call run conditions. Unfortunately, in 9d9c02ccd, I forgot to update remove_unused_subquery_outputs to teach it about these run conditions. This could cause a WindowFunc column which was unused in the target list but referenced by an upper-level WHERE clause to be removed from the subquery when the qual in the WHERE clause was converted into a window run condition. Because of this, the entire WindowClause would be removed from the query resulting in additional rows making it into the resultset when they should have been filtered out by the WHERE clause. Here we fix this by recording which target list items in the subquery have run conditions. That gets passed along to remove_unused_subquery_outputs to tell it not to remove these items from the target list. Bug: #17495 Reported-by: Jeremy Evans Reviewed-by: Richard Guo Discussion: https://postgr.es/m/17495-7ffe2fa0b261b9fa@postgresql.org
Diffstat (limited to 'src/backend/parser/parse_clause.c')
-rw-r--r--src/backend/parser/parse_clause.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 249255b65f5..c655d188c76 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -2831,6 +2831,7 @@ transformWindowDefinitions(ParseState *pstate,
rangeopfamily, rangeopcintype,
&wc->endInRangeFunc,
windef->endOffset);
+ wc->runCondition = NIL;
wc->winref = winref;
result = lappend(result, wc);