aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2023-12-25 01:16:09 +0200
committerAlexander Korotkov <akorotkov@postgresql.org>2023-12-25 01:33:08 +0200
commit8a8ed916f73f4f16e8eb3e0e30ac1201a7642fda (patch)
tree50c009afd49e1421938a1f280e04f4e03aaeefed /src
parent12915a58eec962f407a6c38ce2bf08a48dde57b5 (diff)
downloadpostgresql-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.c34
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);