*
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.154.2.1 2007/01/28 18:50:48 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.154.2.2 2008/01/11 04:02:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
                /*
                 * Consider the different orders in which we could join the rels,
                 * using either GEQO or regular optimizer.
+                *
+                * We put the initial_rels list into a PlannerInfo field because
+                * has_legal_joinclause() needs to look at it (ugly :-().
                 */
+               root->initial_rels = initial_rels;
+
                if (enable_geqo && levels_needed >= geqo_threshold)
                        return geqo(root, levels_needed, initial_rels);
                else
 
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.81.2.4 2007/10/26 18:10:58 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.81.2.5 2008/01/11 04:02:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
  *             Detect whether the specified relation can legally be joined
  *             to any other rels using join clauses.
  *
- * We consider only joins to single other relations.  This is sufficient
- * to get a "true" result in most real queries, and an occasional erroneous
- * "false" will only cost a bit more planning time.  The reason for this
- * limitation is that considering joins to other joins would require proving
- * that the other join rel can legally be formed, which seems like too much
- * trouble for something that's only a heuristic to save planning time.
+ * We consider only joins to single other relations in the current
+ * initial_rels list.  This is sufficient to get a "true" result in most real
+ * queries, and an occasional erroneous "false" will only cost a bit more
+ * planning time.  The reason for this limitation is that considering joins to
+ * other joins would require proving that the other join rel can legally be
+ * formed, which seems like too much trouble for something that's only a
+ * heuristic to save planning time.  (Note: we must look at initial_rels
+ * and not all of the query, since when we are planning a sub-joinlist we
+ * may be forced to make clauseless joins within initial_rels even though
+ * there are join clauses linking to other parts of the query.)
  */
 static bool
 has_legal_joinclause(PlannerInfo *root, RelOptInfo *rel)
 {
-       Index           rti;
+       ListCell   *lc;
 
-       for (rti = 1; rti < root->simple_rel_array_size; rti++)
+       foreach(lc, root->initial_rels)
        {
-               RelOptInfo *rel2 = root->simple_rel_array[rti];
+               RelOptInfo *rel2 = (RelOptInfo *) lfirst(lc);
 
-               /* there may be empty slots corresponding to non-baserel RTEs */
-               if (rel2 == NULL)
-                       continue;
-
-               Assert(rel2->relid == rti);             /* sanity check on array */
-
-               /* ignore RTEs that are "other rels" */
-               if (rel2->reloptkind != RELOPT_BASEREL)
-                       continue;
-
-               /* ignore RTEs that are already in "rel" */
+               /* ignore rels that are already in "rel" */
                if (bms_overlap(rel->relids, rel2->relids))
                        continue;
 
 
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planmain.c,v 1.97.2.1 2007/10/04 20:44:55 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planmain.c,v 1.97.2.2 2008/01/11 04:02:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
        root->right_join_clauses = NIL;
        root->full_join_clauses = NIL;
        root->oj_info_list = NIL;
+       root->initial_rels = NIL;
 
        /*
         * Construct RelOptInfo nodes for all base relations in query, and
 
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/relation.h,v 1.128.2.4 2007/08/31 01:44:14 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/relation.h,v 1.128.2.5 2008/01/11 04:02:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
        bool            hasHavingQual;  /* true if havingQual was non-null */
        bool            hasPseudoConstantQuals; /* true if any RestrictInfo has
                                                                                 * pseudoconstant = true */
+
+       /* At the end to avoid breaking existing 8.2 add-ons */
+       List       *initial_rels;       /* RelOptInfos we are now trying to join */
 } PlannerInfo;