From 97cfb9d606d34b0380cfe32cd7bf5590b046e8aa Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 18 Dec 2000 06:50:51 +0000 Subject: [PATCH] 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. --- src/backend/optimizer/path/joinrels.c | 30 ++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index 74cc0365bb..17a6288b92 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;