From 61d6dd0c03eb4da654f435097cd0bf1da11c3272 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 2 Nov 2010 18:45:36 -0400
Subject: [PATCH] Fix adjust_semi_join to be more cautious about clauseless
 joins.

It was reporting that these were fully indexed (hence cheap), when of
course they're the exact opposite of that.  I'm not certain if the case
would arise in practice, since a clauseless semijoin is hard to produce
in SQL, but if it did happen we'd make some dumb decisions.
---
 src/backend/optimizer/path/costsize.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 067cbca1254..16a5d0a3ca2 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -2897,12 +2897,20 @@ adjust_semi_join(PlannerInfo *root, JoinPath *path, SpecialJoinInfo *sjinfo,
 	 */
 	if (indexed_join_quals)
 	{
-		List	   *nrclauses;
+		if (path->joinrestrictinfo != NIL)
+		{
+			List	   *nrclauses;
 
-		nrclauses = select_nonredundant_join_clauses(root,
-													 path->joinrestrictinfo,
-													 path->innerjoinpath);
-		*indexed_join_quals = (nrclauses == NIL);
+			nrclauses = select_nonredundant_join_clauses(root,
+														 path->joinrestrictinfo,
+														 path->innerjoinpath);
+			*indexed_join_quals = (nrclauses == NIL);
+		}
+		else
+		{
+			/* a clauseless join does NOT qualify */
+			*indexed_join_quals = false;
+		}
 	}
 
 	return true;
-- 
GitLab