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"); } /*