diff options
Diffstat (limited to 'src/backend/rewrite')
-rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 30 | ||||
-rw-r--r-- | src/backend/rewrite/rewriteManip.c | 49 |
2 files changed, 47 insertions, 32 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 6b842582b43..21372e0794d 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.84 2000/12/05 19:15:09 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.85 2000/12/06 23:55:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -31,9 +31,6 @@ #include "utils/lsyscache.h" -extern void CheckSelectForUpdate(Query *rule_action); /* in analyze.c */ - - static RewriteInfo *gatherRewriteMeta(Query *parsetree, Query *rule_action, Node *rule_qual, @@ -101,29 +98,6 @@ gatherRewriteMeta(Query *parsetree, PRS2_OLD_VARNO + rt_length, rt_index, 0); /* - * Update resultRelation too ... perhaps this should be done by - * Offset/ChangeVarNodes? - */ - if (sub_action->resultRelation) - { - int result_reln; - int new_result_reln; - - result_reln = sub_action->resultRelation; - switch (result_reln) - { - case PRS2_OLD_VARNO: - new_result_reln = rt_index; - break; - case PRS2_NEW_VARNO: - default: - new_result_reln = result_reln + rt_length; - break; - } - sub_action->resultRelation = new_result_reln; - } - - /* * We want the main parsetree's rtable to end up as the concatenation * of its original contents plus those of all the relevant rule * actions. Also store same into all the rule_action rtables. @@ -336,8 +310,6 @@ ApplyRetrieveRule(Query *parsetree, { Index innerrti = 1; - CheckSelectForUpdate(rule_action); - /* * Remove the view from the list of rels that will actually be * marked FOR UPDATE by the executor. It will still be access- 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); } |