From ccdcd1967202999edb0466eaaf4cee00946923bf Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 16 Nov 2005 17:08:03 +0000 Subject: [PATCH] =?utf8?q?make=5Frestrictinfo()=20failed=20to=20attach=20t?= =?utf8?q?he=20specified=20required=5Frelids=20to=20its=20result=20when=20?= =?utf8?q?the=20clause=20was=20an=20OR=20clause.=20=20Brain=20fade=20expos?= =?utf8?q?ed=20by=20example=20from=20Sebastian=20B=C3=8Eck.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/backend/optimizer/util/restrictinfo.c | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/backend/optimizer/util/restrictinfo.c b/src/backend/optimizer/util/restrictinfo.c index 96c207c935..c41fd7be23 100644 --- a/src/backend/optimizer/util/restrictinfo.c +++ b/src/backend/optimizer/util/restrictinfo.c @@ -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); } /* -- 2.40.0