aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/subselect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/subselect.c')
-rw-r--r--src/backend/optimizer/plan/subselect.c24
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;
}