From 0d44d5960167a824a19c36459c2cf9937e4fa249 Mon Sep 17 00:00:00 2001
From: Yuya Watari <watari.yuya@gmail.com>
Date: Mon, 5 Sep 2022 17:17:13 +0900
Subject: [PATCH v8 2/3] Revert one of the optimizations

This commit reverts one of our optimizations.

This function enumerates EquivalenceMembers in the given
EquivalenceClass and returns true if there is a chance of merging. This
check is accomplished by finding EMs where
"bms_overlap(cur_em->em_relids, relids)" is false. In most cases, we
reach such EMs early in the loop. Therefore, performing our newly
introduced optimization technique is excessive here, and we revert the
change.
---
 src/backend/optimizer/path/equivclass.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c
index 8c9d4a4c3f..156a984014 100644
--- a/src/backend/optimizer/path/equivclass.c
+++ b/src/backend/optimizer/path/equivclass.c
@@ -3250,8 +3250,8 @@ eclass_useful_for_merging(PlannerInfo *root,
 						  EquivalenceClass *eclass,
 						  RelOptInfo *rel)
 {
-	Bitmapset  *matching_ems;
 	Relids		relids;
+	int			i;
 
 	Assert(!eclass->ec_merged);
 
@@ -3282,15 +3282,18 @@ eclass_useful_for_merging(PlannerInfo *root,
 	if (bms_is_subset(eclass->ec_relids, relids))
 		return false;
 
-	/* Find the EquivalenceMember for relids */
-	matching_ems = get_ecmember_indexes(root, eclass, relids, false, false);
+	/* To join, we need a member not in the given rel */
+	i = -1;
+	while ((i = bms_next_member(eclass->ec_nonchild_indexes, i)) >= 0)
+	{
+		EquivalenceMember *cur_em =
+			list_nth_node(EquivalenceMember, root->eq_members, i);
 
-	/*
-	 * If there are any other non-child members besides matching_ems then we
-	 * have a chance at merging.
-	 */
-	if (bms_nonempty_difference(eclass->ec_nonchild_indexes, matching_ems))
-		return true;
+		Assert(!cur_em->em_is_child);	/* ignore children here */
+
+		if (!bms_overlap(cur_em->em_relids, relids))
+			return true;
+	}
 
 	return false;
 }
-- 
2.35.3.windows.1

