From 97cfb9d606d34b0380cfe32cd7bf5590b046e8aa Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
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 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;
-- 
GitLab