diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-12-18 06:50:51 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-12-18 06:50:51 +0000 |
commit | 97cfb9d606d34b0380cfe32cd7bf5590b046e8aa (patch) | |
tree | bb62ec871b053db1ab3503f8e54aa73c2279c732 /src | |
parent | cf35a70495553139371ea25ba01d2410ac8bf9f3 (diff) | |
download | postgresql-97cfb9d606d34b0380cfe32cd7bf5590b046e8aa.tar.gz postgresql-97cfb9d606d34b0380cfe32cd7bf5590b046e8aa.zip |
Make sure make_rels_by_clause_joins doesn't return multiple references
to same joinrel. Although make_rels_by_joins doesn't mind, GEQO has
an Assert that doesn't like this.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/path/joinrels.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index 74cc0365bbd..17a6288b920 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.48 2000/09/29 18:21:32 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.49 2000/12/18 06:50:51 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -262,9 +262,18 @@ make_rels_by_clause_joins(Query *root, RelOptInfo *other_rel = (RelOptInfo *) lfirst(j); if (is_subseti(unjoined_relids, other_rel->relids)) - result = lcons(make_join_rel(root, old_rel, other_rel, - JOIN_INNER), - result); + { + RelOptInfo *jrel; + + jrel = make_join_rel(root, old_rel, other_rel, JOIN_INNER); + /* + * Avoid entering same joinrel into our output list more + * than once. (make_rels_by_joins doesn't really care, + * but GEQO does.) + */ + if (!ptrMember(jrel, result)) + result = lcons(jrel, result); + } } } @@ -297,9 +306,16 @@ make_rels_by_clauseless_joins(Query *root, RelOptInfo *other_rel = (RelOptInfo *) lfirst(i); if (nonoverlap_setsi(other_rel->relids, old_rel->relids)) - result = lcons(make_join_rel(root, old_rel, other_rel, - JOIN_INNER), - result); + { + RelOptInfo *jrel; + + jrel = make_join_rel(root, old_rel, other_rel, JOIN_INNER); + /* + * As long as given other_rels are distinct, don't need + * to test to see if jrel is already part of output list. + */ + result = lcons(jrel, result); + } } return result; |