Commit ccdcd196 authored by Tom Lane's avatar Tom Lane

make_restrictinfo() failed to attach the specified required_relids to

its result when the clause was an OR clause.  Brain fade exposed by
example from Sebastian BÎck.
parent 01798a06
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -29,7 +29,8 @@ static RestrictInfo *make_restrictinfo_internal(Expr *clause,
Relids required_relids); Relids required_relids);
static Expr *make_sub_restrictinfos(Expr *clause, static Expr *make_sub_restrictinfos(Expr *clause,
bool is_pushed_down, bool is_pushed_down,
bool outerjoin_delayed); bool outerjoin_delayed,
Relids required_relids);
static RestrictInfo *join_clause_is_redundant(PlannerInfo *root, static RestrictInfo *join_clause_is_redundant(PlannerInfo *root,
RestrictInfo *rinfo, RestrictInfo *rinfo,
List *reference_list, List *reference_list,
...@@ -62,7 +63,8 @@ make_restrictinfo(Expr *clause, ...@@ -62,7 +63,8 @@ make_restrictinfo(Expr *clause,
if (or_clause((Node *) clause)) if (or_clause((Node *) clause))
return (RestrictInfo *) make_sub_restrictinfos(clause, return (RestrictInfo *) make_sub_restrictinfos(clause,
is_pushed_down, is_pushed_down,
outerjoin_delayed); outerjoin_delayed,
required_relids);
/* Shouldn't be an AND clause, else AND/OR flattening messed up */ /* Shouldn't be an AND clause, else AND/OR flattening messed up */
Assert(!and_clause((Node *) clause)); Assert(!and_clause((Node *) clause));
...@@ -312,10 +314,15 @@ make_restrictinfo_internal(Expr *clause, Expr *orclause, ...@@ -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 * 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 * implicit-AND lists at top level of RestrictInfo lists. Only ORs and
* simple clauses are valid RestrictInfos. * 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 * static Expr *
make_sub_restrictinfos(Expr *clause, 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)) if (or_clause((Node *) clause))
{ {
...@@ -326,12 +333,13 @@ make_sub_restrictinfos(Expr *clause, ...@@ -326,12 +333,13 @@ make_sub_restrictinfos(Expr *clause,
orlist = lappend(orlist, orlist = lappend(orlist,
make_sub_restrictinfos(lfirst(temp), make_sub_restrictinfos(lfirst(temp),
is_pushed_down, is_pushed_down,
outerjoin_delayed)); outerjoin_delayed,
NULL));
return (Expr *) make_restrictinfo_internal(clause, return (Expr *) make_restrictinfo_internal(clause,
make_orclause(orlist), make_orclause(orlist),
is_pushed_down, is_pushed_down,
outerjoin_delayed, outerjoin_delayed,
NULL); required_relids);
} }
else if (and_clause((Node *) clause)) else if (and_clause((Node *) clause))
{ {
...@@ -342,7 +350,8 @@ make_sub_restrictinfos(Expr *clause, ...@@ -342,7 +350,8 @@ make_sub_restrictinfos(Expr *clause,
andlist = lappend(andlist, andlist = lappend(andlist,
make_sub_restrictinfos(lfirst(temp), make_sub_restrictinfos(lfirst(temp),
is_pushed_down, is_pushed_down,
outerjoin_delayed)); outerjoin_delayed,
required_relids));
return make_andclause(andlist); return make_andclause(andlist);
} }
else else
...@@ -350,7 +359,7 @@ make_sub_restrictinfos(Expr *clause, ...@@ -350,7 +359,7 @@ make_sub_restrictinfos(Expr *clause,
NULL, NULL,
is_pushed_down, is_pushed_down,
outerjoin_delayed, outerjoin_delayed,
NULL); required_relids);
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment