diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2024-02-20 14:10:10 +0200 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2024-02-20 14:10:10 +0200 |
commit | 489072ab7a9e37987e1d1008a90b0a3644455ecd (patch) | |
tree | 338d4d06cb81bdf593f1807625543e6e7d00abd0 /src/backend/optimizer/plan/analyzejoins.c | |
parent | 74563f6b90216180fc13649725179fc119dddeb5 (diff) | |
download | postgresql-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.c | 29 |
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 + } + } + + } /* |