diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 7ac116a791..c67a739dd9 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -3989,6 +3989,46 @@ remove_unused_subquery_outputs(Query *subquery, RelOptInfo *rel) pull_varattnos((Node *) rinfo->clause, rel->relid, &attrs_used); } + /* + * baserestrictinfo may have been pushed down into a WindowClause's + * runCondition, so gather up the attrs from those too. + */ + foreach(lc, subquery->windowClause) + { + WindowClause *wc = (WindowClause *) lfirst(lc); + ListCell *lc2; + + foreach(lc2, wc->runCondition) + { + OpExpr *opexpr = lfirst_node(OpExpr, lc2); + Expr *left = linitial(opexpr->args); + Expr *right = lsecond(opexpr->args); + WindowFunc *wfunc; + ListCell *lc3; + + if (IsA(left, WindowFunc)) + wfunc = (WindowFunc *) left; + else + wfunc = (WindowFunc *) right; + + Assert(IsA(wfunc, WindowFunc)); + + foreach(lc3, subquery->targetList) + { + TargetEntry *tle = (TargetEntry *) lfirst(lc3); + Node *texpr = (Node *) tle->expr; + + if (equal(wfunc, texpr)) + { + attrs_used = bms_add_member(attrs_used, + foreach_current_index(lc3) - + FirstLowInvalidHeapAttributeNumber + 1); + break; + } + } + } + } + /* * If there's a whole-row reference to the subquery, we can't remove * anything.