diff options
Diffstat (limited to 'src/backend/optimizer/plan/subselect.c')
-rw-r--r-- | src/backend/optimizer/plan/subselect.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 6d003cc8e5c..09d5f0f571b 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -1539,6 +1539,8 @@ convert_EXISTS_sublink_to_join(PlannerInfo *root, SubLink *sublink, static bool simplify_EXISTS_query(PlannerInfo *root, Query *query) { + ListCell *lc; + /* * We don't try to simplify at all if the query uses set operations, * aggregates, grouping sets, SRFs, modifying CTEs, HAVING, OFFSET, or FOR @@ -1607,6 +1609,28 @@ simplify_EXISTS_query(PlannerInfo *root, Query *query) query->sortClause = NIL; query->hasDistinctOn = false; + /* + * Since we have thrown away the GROUP BY clauses, we'd better remove the + * RTE_GROUP RTE and clear the hasGroupRTE flag. + */ + foreach(lc, query->rtable) + { + RangeTblEntry *rte = lfirst_node(RangeTblEntry, lc); + + /* + * Remove the RTE_GROUP RTE and clear the hasGroupRTE flag. (Since + * we'll exit the foreach loop immediately, we don't bother with + * foreach_delete_current.) + */ + if (rte->rtekind == RTE_GROUP) + { + Assert(query->hasGroupRTE); + query->rtable = list_delete_cell(query->rtable, lc); + query->hasGroupRTE = false; + break; + } + } + return true; } |