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
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;
}
-> 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
--
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
--