aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/analyzejoins.c
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2024-02-20 14:10:10 +0200
committerAlexander Korotkov <akorotkov@postgresql.org>2024-02-20 14:10:10 +0200
commit489072ab7a9e37987e1d1008a90b0a3644455ecd (patch)
tree338d4d06cb81bdf593f1807625543e6e7d00abd0 /src/backend/optimizer/plan/analyzejoins.c
parent74563f6b90216180fc13649725179fc119dddeb5 (diff)
downloadpostgresql-489072ab7a9e37987e1d1008a90b0a3644455ecd.tar.gz
postgresql-489072ab7a9e37987e1d1008a90b0a3644455ecd.zip
Replace relids in lateral subquery parse tree during SJE
Reported-by: Alexander Lakhin Discussion: https://postgr.es/m/56ee4520-e9d1-d519-54fe-c8bff880ce9b%40gmail.com Author: Alexander Korotkov, Andrei Lepikhov
Diffstat (limited to 'src/backend/optimizer/plan/analyzejoins.c')
-rw-r--r--src/backend/optimizer/plan/analyzejoins.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c
index e494acd51a6..072298f66c6 100644
--- a/src/backend/optimizer/plan/analyzejoins.c
+++ b/src/backend/optimizer/plan/analyzejoins.c
@@ -395,7 +395,34 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
}
/* Update lateral references. */
- replace_varno((Node *) otherrel->lateral_vars, relid, subst);
+ if (root->hasLateralRTEs)
+ {
+ RangeTblEntry *rte = root->simple_rte_array[rti];
+ ReplaceVarnoContext ctx = {.from = relid,.to = subst};
+
+ if (rte->lateral)
+ {
+ replace_varno((Node *) otherrel->lateral_vars, relid, subst);
+
+ /*
+ * Although we pass root->parse through cleanup procedure,
+ * but parse->rtable and rte contains refs to different copies
+ * of the subquery.
+ */
+ if (otherrel->rtekind == RTE_SUBQUERY)
+ query_tree_walker(rte->subquery, replace_varno_walker, &ctx,
+ QTW_EXAMINE_SORTGROUP);
+#ifdef USE_ASSERT_CHECKING
+ /* Just check possibly hidden non-replaced relids */
+ Assert(!bms_is_member(relid, pull_varnos(root, (Node *) rte->tablesample)));
+ Assert(!bms_is_member(relid, pull_varnos(root, (Node *) rte->functions)));
+ Assert(!bms_is_member(relid, pull_varnos(root, (Node *) rte->tablefunc)));
+ Assert(!bms_is_member(relid, pull_varnos(root, (Node *) rte->values_lists)));
+#endif
+ }
+ }
+
+
}
/*