diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 6d003cc8e5..09d5f0f571 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; } diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index 5669ed929a..9b2973694f 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -3182,6 +3182,21 @@ where b.unique2 is null; -> Index Only Scan using tenk1_unique2 on tenk1 b (5 rows) +-- +-- regression test for bogus RTE_GROUP entries +-- +explain (costs off) +select a.* from tenk1 a +where exists (select 1 from tenk1 b where a.unique1 = b.unique2 group by b.unique1); + QUERY PLAN +------------------------------------------------------------ + Hash Semi Join + Hash Cond: (a.unique1 = b.unique2) + -> Seq Scan on tenk1 a + -> Hash + -> Index Only Scan using tenk1_unique2 on tenk1 b +(5 rows) + -- -- regression test for proper handling of outer joins within antijoins -- diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 73474bb64f..4c9c3e9f49 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -818,6 +818,14 @@ explain (costs off) select a.* from tenk1 a left join tenk1 b on a.unique1 = b.unique2 where b.unique2 is null; +-- +-- regression test for bogus RTE_GROUP entries +-- + +explain (costs off) +select a.* from tenk1 a +where exists (select 1 from tenk1 b where a.unique1 = b.unique2 group by b.unique1); + -- -- regression test for proper handling of outer joins within antijoins --