From c5891b0a5754a905ee36c354e0065a13d09f68ae Mon Sep 17 00:00:00 2001 From: Richard Guo Date: Mon, 17 Nov 2025 10:28:36 +0900 Subject: [PATCH v2 2/3] Remove nrm_match parameter from fix_upper_expr --- src/backend/optimizer/plan/setrefs.c | 32 ++++++---------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index a4c220e47fb..95c5cd05339 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -78,7 +78,6 @@ typedef struct indexed_tlist *subplan_itlist; int newvarno; int rtoffset; - NullingRelsMatch nrm_match; double num_exec; } fix_upper_expr_context; @@ -197,7 +196,6 @@ static Node *fix_upper_expr(PlannerInfo *root, indexed_tlist *subplan_itlist, int newvarno, int rtoffset, - NullingRelsMatch nrm_match, double num_exec); static Node *fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context); @@ -1383,7 +1381,6 @@ set_indexonlyscan_references(PlannerInfo *root, index_itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_TLIST((Plan *) plan)); plan->scan.plan.qual = (List *) fix_upper_expr(root, @@ -1391,7 +1388,6 @@ set_indexonlyscan_references(PlannerInfo *root, index_itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) plan)); plan->recheckqual = (List *) fix_upper_expr(root, @@ -1399,7 +1395,6 @@ set_indexonlyscan_references(PlannerInfo *root, index_itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) plan)); /* indexqual is already transformed to reference index columns */ plan->indexqual = fix_scan_list(root, plan->indexqual, @@ -1629,7 +1624,6 @@ set_foreignscan_references(PlannerInfo *root, itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_TLIST((Plan *) fscan)); fscan->scan.plan.qual = (List *) fix_upper_expr(root, @@ -1637,7 +1631,6 @@ set_foreignscan_references(PlannerInfo *root, itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) fscan)); fscan->fdw_exprs = (List *) fix_upper_expr(root, @@ -1645,7 +1638,6 @@ set_foreignscan_references(PlannerInfo *root, itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) fscan)); fscan->fdw_recheck_quals = (List *) fix_upper_expr(root, @@ -1653,7 +1645,6 @@ set_foreignscan_references(PlannerInfo *root, itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) fscan)); pfree(itlist); /* fdw_scan_tlist itself just needs fix_scan_list() adjustments */ @@ -1715,7 +1706,6 @@ set_customscan_references(PlannerInfo *root, itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_TLIST((Plan *) cscan)); cscan->scan.plan.qual = (List *) fix_upper_expr(root, @@ -1723,7 +1713,6 @@ set_customscan_references(PlannerInfo *root, itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) cscan)); cscan->custom_exprs = (List *) fix_upper_expr(root, @@ -1731,7 +1720,6 @@ set_customscan_references(PlannerInfo *root, itlist, INDEX_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) cscan)); pfree(itlist); /* custom_scan_tlist itself just needs fix_scan_list() adjustments */ @@ -1988,7 +1976,6 @@ set_hash_references(PlannerInfo *root, Plan *plan, int rtoffset) outer_itlist, OUTER_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL(plan)); /* Hash doesn't project */ @@ -2390,15 +2377,14 @@ set_join_references(PlannerInfo *root, Join *join, int rtoffset) * Vars or PHVs seen in the NestLoopParam expression have * nullingrels that include exactly the outer-join relids that * appear in the outer side's output and can null the respective - * Var or PHV. So we can use exact nullingrels matches for the - * NestLoopParam expression. + * Var or PHV. Therefore, fix_upper_expr will not complain when + * performing the nullingrels matches here. */ nlp->paramval = (Var *) fix_upper_expr(root, (Node *) nlp->paramval, outer_itlist, OUTER_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_TLIST(outer_plan)); /* Check we replaced any PlaceHolderVar with simple Var */ if (!(IsA(nlp->paramval, Var) && @@ -2441,7 +2427,6 @@ set_join_references(PlannerInfo *root, Join *join, int rtoffset) outer_itlist, OUTER_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL((Plan *) join)); } @@ -2546,7 +2531,6 @@ set_upper_references(PlannerInfo *root, Plan *plan, int rtoffset) subplan_itlist, OUTER_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_TLIST(plan)); } else @@ -2555,7 +2539,6 @@ set_upper_references(PlannerInfo *root, Plan *plan, int rtoffset) subplan_itlist, OUTER_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_TLIST(plan)); tle = flatCopyTargetEntry(tle); tle->expr = (Expr *) newexpr; @@ -2569,7 +2552,6 @@ set_upper_references(PlannerInfo *root, Plan *plan, int rtoffset) subplan_itlist, OUTER_VAR, rtoffset, - NRM_EQUAL, NUM_EXEC_QUAL(plan)); pfree(subplan_itlist); @@ -3275,11 +3257,13 @@ fix_join_expr_mutator(Node *node, fix_join_expr_context *context) * expensive, so we don't want to try it in the common case where the * subplan tlist is just a flattened list of Vars.) * + * When cross-checking the nullingrels of the subplan output Vars/PHVs, we + * always expect exact matches. + * * 'node': the tree to be fixed (a target item or qual) * 'subplan_itlist': indexed target list for subplan (or index) * 'newvarno': varno to use for Vars referencing tlist elements * 'rtoffset': how much to increment varnos by - * 'nrm_match': as for search_indexed_tlist_for_var() * 'num_exec': estimated number of executions of expression * * The resulting tree is a copy of the original in which all Var nodes have @@ -3292,7 +3276,6 @@ fix_upper_expr(PlannerInfo *root, indexed_tlist *subplan_itlist, int newvarno, int rtoffset, - NullingRelsMatch nrm_match, double num_exec) { fix_upper_expr_context context; @@ -3301,7 +3284,6 @@ fix_upper_expr(PlannerInfo *root, context.subplan_itlist = subplan_itlist; context.newvarno = newvarno; context.rtoffset = rtoffset; - context.nrm_match = nrm_match; context.num_exec = num_exec; return fix_upper_expr_mutator(node, &context); } @@ -3321,7 +3303,7 @@ fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context) context->subplan_itlist, context->newvarno, context->rtoffset, - context->nrm_match); + NRM_EQUAL); if (!newvar) elog(ERROR, "variable not found in subplan target list"); return (Node *) newvar; @@ -3336,7 +3318,7 @@ fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context) newvar = search_indexed_tlist_for_phv(phv, context->subplan_itlist, context->newvarno, - context->nrm_match); + NRM_EQUAL); if (newvar) return (Node *) newvar; } -- 2.39.5 (Apple Git-154)