diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index b9be19a687..00404a8beb 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -1456,7 +1456,16 @@ replace_varno_walker(Node *node, ReplaceVarnoContext *ctx) } return false; } - if (IsA(node, RestrictInfo)) + else if (IsA(node, PlaceHolderVar)) + { + PlaceHolderVar *phv = (PlaceHolderVar *) node; + + phv->phrels = replace_relid(phv->phrels, ctx->from, ctx->to); + phv->phnullingrels = replace_relid(phv->phnullingrels, ctx->from, ctx->to); + + /* fall through to recurse into the placeholder's expression */ + } + else if (IsA(node, RestrictInfo)) { RestrictInfo *rinfo = (RestrictInfo *) node; int relid = -1; @@ -1641,26 +1650,6 @@ update_eclasses(EquivalenceClass *ec, int from, int to) ec->ec_relids = replace_relid(ec->ec_relids, from, to); } -static bool -sje_walker(Node *node, ReplaceVarnoContext *ctx) -{ - if (node == NULL) - return false; - - if (IsA(node, Var)) - { - Var *var = (Var *) node; - - if (var->varno == ctx->from) - { - var->varno = ctx->to; - var->varnosyn = ctx->to; - } - return false; - } - return expression_tree_walker(node, sje_walker, (void *) ctx); -} - /* * Remove a relation after we have proven that it participates only in an * unneeded unique self join. @@ -1868,7 +1857,8 @@ remove_self_join_rel(PlannerInfo *root, PlanRowMark *kmark, PlanRowMark *rmark, } /* Replace varno in all the query structures */ - query_tree_walker(root->parse, sje_walker, &ctx, QTW_EXAMINE_SORTGROUP); + query_tree_walker(root->parse, replace_varno_walker, &ctx, + QTW_EXAMINE_SORTGROUP); /* Replace links in the planner info */ remove_rel_from_query(root, toRemove, toKeep->relid, NULL, NULL);