diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2023-12-25 01:16:09 +0200 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2023-12-25 01:33:08 +0200 |
commit | 8a8ed916f73f4f16e8eb3e0e30ac1201a7642fda (patch) | |
tree | 50c009afd49e1421938a1f280e04f4e03aaeefed /src | |
parent | 12915a58eec962f407a6c38ce2bf08a48dde57b5 (diff) | |
download | postgresql-8a8ed916f73f4f16e8eb3e0e30ac1201a7642fda.tar.gz postgresql-8a8ed916f73f4f16e8eb3e0e30ac1201a7642fda.zip |
Handle PlaceHolderVar case in replace_varno_walker
This commit also retires sje_walker. This increases the generalty of replacing
varno in the parse tree and simplifies the code.
Discussion: https://postgr.es/m/18187-831da249cbd2ff8e%40postgresql.org
Author: Richard Guo
Reviewed-by: Andrei Lepikhov
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index b9be19a687f..00404a8beb0 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); |