make_restrictinfo() failed to attach the specified required_relids to
authorTom Lane
Wed, 16 Nov 2005 17:08:03 +0000 (17:08 +0000)
committerTom Lane
Wed, 16 Nov 2005 17:08:03 +0000 (17:08 +0000)
its result when the clause was an OR clause.  Brain fade exposed by
example from Sebastian BÎck.

src/backend/optimizer/util/restrictinfo.c

index 96c207c9350267928e23dff0f361560b2cb1caca..c41fd7be232653afbdd3f784a11c0e60666ac4ff 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.42 2005/11/14 23:54:22 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.43 2005/11/16 17:08:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -29,7 +29,8 @@ static RestrictInfo *make_restrictinfo_internal(Expr *clause,
                           Relids required_relids);
 static Expr *make_sub_restrictinfos(Expr *clause,
                       bool is_pushed_down,
-                      bool outerjoin_delayed);
+                      bool outerjoin_delayed,
+                      Relids required_relids);
 static RestrictInfo *join_clause_is_redundant(PlannerInfo *root,
                         RestrictInfo *rinfo,
                         List *reference_list,
@@ -62,7 +63,8 @@ make_restrictinfo(Expr *clause,
    if (or_clause((Node *) clause))
        return (RestrictInfo *) make_sub_restrictinfos(clause,
                                                       is_pushed_down,
-                                                      outerjoin_delayed);
+                                                      outerjoin_delayed,
+                                                      required_relids);
 
    /* Shouldn't be an AND clause, else AND/OR flattening messed up */
    Assert(!and_clause((Node *) clause));
@@ -312,10 +314,15 @@ make_restrictinfo_internal(Expr *clause, Expr *orclause,
  * This may seem odd but it is closely related to the fact that we use
  * implicit-AND lists at top level of RestrictInfo lists.  Only ORs and
  * simple clauses are valid RestrictInfos.
+ *
+ * The given required_relids are attached to our top-level output,
+ * but any OR-clause constituents are allowed to default to just the
+ * contained rels.
  */
 static Expr *
 make_sub_restrictinfos(Expr *clause,
-                      bool is_pushed_down, bool outerjoin_delayed)
+                      bool is_pushed_down, bool outerjoin_delayed,
+                      Relids required_relids)
 {
    if (or_clause((Node *) clause))
    {
@@ -326,12 +333,13 @@ make_sub_restrictinfos(Expr *clause,
            orlist = lappend(orlist,
                             make_sub_restrictinfos(lfirst(temp),
                                                    is_pushed_down,
-                                                   outerjoin_delayed));
+                                                   outerjoin_delayed,
+                                                   NULL));
        return (Expr *) make_restrictinfo_internal(clause,
                                                   make_orclause(orlist),
                                                   is_pushed_down,
                                                   outerjoin_delayed,
-                                                  NULL);
+                                                  required_relids);
    }
    else if (and_clause((Node *) clause))
    {
@@ -342,7 +350,8 @@ make_sub_restrictinfos(Expr *clause,
            andlist = lappend(andlist,
                              make_sub_restrictinfos(lfirst(temp),
                                                     is_pushed_down,
-                                                    outerjoin_delayed));
+                                                    outerjoin_delayed,
+                                                    required_relids));
        return make_andclause(andlist);
    }
    else
@@ -350,7 +359,7 @@ make_sub_restrictinfos(Expr *clause,
                                                   NULL,
                                                   is_pushed_down,
                                                   outerjoin_delayed,
-                                                  NULL);
+                                                  required_relids);
 }
 
 /*