q4_debugging_patch_aid.txt

text/plain

Filename: q4_debugging_patch_aid.txt
Type: text/plain
Part: 1
Message: Re: pg_plan_advice
diff --git a/contrib/pg_plan_advice/pgpa_planner.c b/contrib/pg_plan_advice/pgpa_planner.c
index fdc53da9742..a5b784fd151 100644
--- a/contrib/pg_plan_advice/pgpa_planner.c
+++ b/contrib/pg_plan_advice/pgpa_planner.c
@@ -457,7 +457,11 @@ pgpa_join_path_setup(PlannerInfo *root, RelOptInfo *joinrel,
 
 		uniquerel = jointype == JOIN_UNIQUE_OUTER ? outerrel : innerrel;
 		pps = GetPlannerGlobalExtensionState(root->glob, planner_extension_id);
-		if (pps->generate_advice_string)
+		elog(NOTICE, "jointype=%s pps_NULL?=%d", jointype == JOIN_UNIQUE_OUTER ? "outer" : "inner", pps == NULL);
+		// JW: pps NULL fix
+		//if (pps != NULL && pps->generate_advice_string)
+		// JW: pps NULL fix with generating SJ also for normal EXPLAIN
+		if (pps != NULL)
 		{
 			bool		found = false;
 
@@ -471,19 +475,27 @@ pgpa_join_path_setup(PlannerInfo *root, RelOptInfo *joinrel,
 				if (root->plan_name == ur->plan_name &&
 					bms_equal(uniquerel->relids, ur->relids))
 				{
+					elog(NOTICE, "found=true! (ur->plan_name=%s bms_ur_relids=%s)", 
+						ur->plan_name, pgpa_bms_to_cstring(ur->relids));
 					found = true;
 					break;
 				}
 			}
+			elog(NOTICE, "found=%d", found);
 
 			/* If not a duplicate, append to the list. */
 			if (!found)
 			{
+				StringInfoData buf;
+
 				pgpa_sj_unique_rel *ur = palloc_object(pgpa_sj_unique_rel);
 
 				ur->plan_name = root->plan_name;
 				ur->relids = uniquerel->relids;
 				pps->sj_unique_rels = lappend(pps->sj_unique_rels, ur);
+				initStringInfo(&buf);
+				outBitmapset(&buf, uniquerel->relids);
+				elog(NOTICE, "not a dupllicate, appending \"%s\" to pps->sj_unique_rels", buf.data);
 			}
 		}
 	}
@@ -982,7 +994,8 @@ pgpa_planner_apply_join_path_advice(JoinType jointype, uint64 *pgs_mask_p,
 				jo_deny_indexes = bms_add_member(jo_deny_indexes, i);
 			else if (restrict_method)
 			{
-				jo_permit_indexes = bms_add_member(jo_permit_indexes, i);
+				//JW
+				//jo_permit_indexes = bms_add_member(jo_permit_indexes, i);
 				jm_indexes = bms_add_member(jo_permit_indexes, i);
 				if (join_mask != 0 && join_mask != my_join_mask)
 					jm_conflict = true;
@@ -1038,8 +1051,9 @@ pgpa_planner_apply_join_path_advice(JoinType jointype, uint64 *pgs_mask_p,
 				}
 				else if (advice_unique != jt_unique)
 					jo_deny_indexes = bms_add_member(jo_deny_indexes, i);
-				else
-					jo_permit_indexes = bms_add_member(jo_permit_indexes, i);
+				//JW
+				//else
+				//	jo_permit_indexes = bms_add_member(jo_permit_indexes, i);
 			}
 			continue;
 		}
diff --git a/contrib/pg_plan_advice/pgpa_walker.c b/contrib/pg_plan_advice/pgpa_walker.c
index 29973c93b0b..07db28630a8 100644
--- a/contrib/pg_plan_advice/pgpa_walker.c
+++ b/contrib/pg_plan_advice/pgpa_walker.c
@@ -59,6 +59,31 @@ static Index pgpa_walker_get_rti(Index rtable_length,
 								 pgpa_identifier *rt_identifiers,
 								 pgpa_identifier *rid);
 
+
+/*
+ * Convert a bitmapset to a C string of comma-separated integers.
+ */
+static char *
+pgpa_bms_to_cstring(Bitmapset *bms)
+{
+	StringInfoData buf;
+	int			x = -1;
+
+	if (bms_is_empty(bms))
+		return "none";
+
+	initStringInfo(&buf);
+	while ((x = bms_next_member(bms, x)) >= 0)
+	{
+		if (buf.len > 0)
+			appendStringInfo(&buf, ", %d", x);
+		else
+			appendStringInfo(&buf, "%d", x);
+	}
+
+	return buf.data;
+}
+
 /*
  * Top-level entrypoint for the plan tree walk.
  *
@@ -135,6 +160,9 @@ pgpa_plan_walker(pgpa_plan_walker_context *walker, PlannedStmt *pstmt,
 	foreach_ptr(pgpa_query_feature, qf,
 				walker->query_features[PGPAQF_SEMIJOIN_NON_UNIQUE])
 	{
+		elog(NOTICE, "pgpa_plan_walker: walking over SEMIJOIN_NON_UNIQUE features: %s",
+			pgpa_bms_to_cstring(qf->relids));
+
 		if (list_member(sj_unique_rtis, qf->relids))
 			sj_nonunique_qfs = lappend(sj_nonunique_qfs, qf);
 	}
@@ -148,6 +176,8 @@ pgpa_plan_walker(pgpa_plan_walker_context *walker, PlannedStmt *pstmt,
 	foreach_ptr(pgpa_query_feature, qf,
 				walker->query_features[PGPAQF_SEMIJOIN_UNIQUE])
 	{
+		elog(NOTICE, "pgpa_plan_walker: walking over SEMIJOIN_UNIQUE features: %s, sj_unique_rtis=%s sj_unique_rels=%s",
+			pgpa_bms_to_cstring(qf->relids), nodeToString(sj_unique_rtis), nodeToString(sj_unique_rels));
 		if (!list_member(sj_unique_rtis, qf->relids))
 		{
 			StringInfoData buf;
@@ -479,6 +509,11 @@ pgpa_add_future_feature(pgpa_plan_walker_context *walker,
 
 	walker->future_query_features =
 		lappend(walker->future_query_features, qf);
+
+	if(type == PGPAQF_SEMIJOIN_NON_UNIQUE)
+		elog(NOTICE, "added SEMIJOIN_NON_UNIQUE");
+	else if(type == PGPAQF_SEMIJOIN_UNIQUE)
+		elog(NOTICE, "added SEMIJOIN_UNIQUE");
 }
 
 /*