From 73d2a3595a3d14e64cb4dbcc09e90308a486e79f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 6 Dec 2000 23:55:19 +0000 Subject: Clean up handling of FOR UPDATE inside views and subselects ... make it work where we can (given that the executor only handles it at top level) and generate an error where we can't. Note that while the parser has been allowing views to say SELECT FOR UPDATE for a few weeks now, that hasn't actually worked until just now. --- src/backend/rewrite/rewriteManip.c | 49 +++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) (limited to 'src/backend/rewrite/rewriteManip.c') diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c index 02aa2d76653..0e84c5fa040 100644 --- a/src/backend/rewrite/rewriteManip.c +++ b/src/backend/rewrite/rewriteManip.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.52 2000/12/05 19:15:09 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.53 2000/12/06 23:55:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -169,8 +169,29 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up) * sublevels_up doesn't get incremented prematurely. */ if (node && IsA(node, Query)) - query_tree_walker((Query *) node, OffsetVarNodes_walker, + { + Query *qry = (Query *) node; + List *l; + + /* + * 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 and rowMarks entries. sublevels_up cannot be zero + * when recursing into a subquery, so there's no need to have the + * same logic inside OffsetVarNodes_walker. + */ + if (sublevels_up == 0) + { + if (qry->resultRelation) + qry->resultRelation += offset; + foreach(l, qry->rowMarks) + { + lfirsti(l) += offset; + } + } + query_tree_walker(qry, OffsetVarNodes_walker, (void *) &context, true); + } else OffsetVarNodes_walker(node, &context); } @@ -252,8 +273,30 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up) * sublevels_up doesn't get incremented prematurely. */ if (node && IsA(node, Query)) - query_tree_walker((Query *) node, ChangeVarNodes_walker, + { + Query *qry = (Query *) node; + List *l; + + /* + * 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 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) + { + if (qry->resultRelation == rt_index) + qry->resultRelation = new_index; + foreach(l, qry->rowMarks) + { + if (lfirsti(l) == rt_index) + lfirsti(l) = new_index; + } + } + query_tree_walker(qry, ChangeVarNodes_walker, (void *) &context, true); + } else ChangeVarNodes_walker(node, &context); } -- cgit v1.2.3