Don't try to optimize EXISTS subqueries with empty FROM-lists: we need to
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Dec 2008 00:16:09 +0000 (00:16 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Dec 2008 00:16:09 +0000 (00:16 +0000)
form a join and that case doesn't have anything to join to.  (We could
probably make it work if we didn't pull up the subquery, but it seems to
me that the case isn't worth extra code.)  Per report from Greg Stark.

src/backend/optimizer/plan/subselect.c

index b80427f041e5a42e35e5357dccb4c39827e78ec4..c999fb6419c5c3b0fb9375ffdc71691e2a25b697 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.142 2008/10/21 20:42:53 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.143 2008/12/08 00:16:09 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1097,6 +1097,12 @@ convert_EXISTS_sublink_to_join(PlannerInfo *root, SubLink *sublink,
    if (!simplify_EXISTS_query(subselect))
        return false;
 
+   /*
+    * The subquery must have a nonempty jointree, else we won't have a join.
+    */
+   if (subselect->jointree->fromlist == NIL)
+       return false;
+
    /*
     * Separate out the WHERE clause.  (We could theoretically also remove
     * top-level plain JOIN/ON clauses, but it's probably not worth the
@@ -1180,6 +1186,7 @@ convert_EXISTS_sublink_to_join(PlannerInfo *root, SubLink *sublink,
    /* Identify all the rels syntactically within the subselect */
    subselect_varnos = get_relids_in_jointree((Node *) subselect->jointree,
                                              true);
+   Assert(!bms_is_empty(subselect_varnos));
    Assert(bms_is_subset(right_varnos, subselect_varnos));
 
    /* Now we can attach the modified subquery rtable to the parent */