diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c index 1c61085a0a7..e190f169fb3 100644 --- a/src/backend/rewrite/rewriteManip.c +++ b/src/backend/rewrite/rewriteManip.c @@ -758,10 +758,23 @@ ChangeVarNodesExtended(Node *node, int rt_index, int new_index, context.sublevels_up = sublevels_up; context.change_RangeTblRef = change_RangeTblRef; + /* + * Must be prepared to start with a Query or a bare expression tree; if + * it's a Query, go straight to query_tree_walker to make sure that + * sublevels_up doesn't get incremented prematurely. + */ if (node && IsA(node, Query)) { Query *qry = (Query *) node; + /* + * If we are starting at a Query, and sublevels_up is zero, then we + * must also fix rangetable indexes in the Query itself --- namely + * resultRelation, mergeTargetRelation, exclRelIndex and rowMarks + * entries. sublevels_up cannot be zero when recursing into a + * subquery, so there's no need to have the same logic inside + * ChangeVarNodes_walker. + */ if (sublevels_up == 0) { ListCell *l; @@ -772,6 +785,7 @@ ChangeVarNodesExtended(Node *node, int rt_index, int new_index, if (qry->mergeTargetRelation == rt_index) qry->mergeTargetRelation = new_index; + /* this is unlikely to ever be used, but ... */ if (qry->onConflict && qry->onConflict->exclRelIndex == rt_index) qry->onConflict->exclRelIndex = new_index;