aboutsummaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteHandler.c
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>1999-01-21 16:08:55 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>1999-01-21 16:08:55 +0000
commit12be3e08f11add3d553b179a7c37d06de9cc5150 (patch)
tree2e730ecaea3b5804ad6bdf3a43e3cb9e4f1ab2a7 /src/backend/rewrite/rewriteHandler.c
parentc8ae6afd130f41e02ee2c818066c8eac38b3cf9e (diff)
downloadpostgresql-12be3e08f11add3d553b179a7c37d06de9cc5150.tar.gz
postgresql-12be3e08f11add3d553b179a7c37d06de9cc5150.zip
FOR UPDATE is in parser & rules.
Diffstat (limited to 'src/backend/rewrite/rewriteHandler.c')
-rw-r--r--src/backend/rewrite/rewriteHandler.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index b931bc744fe..415f94df6d7 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.28 1999/01/18 00:09:54 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.29 1999/01/21 16:08:48 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1799,7 +1799,8 @@ ApplyRetrieveRule(Query *parsetree,
Query *rule_action = NULL;
Node *rule_qual;
List *rtable,
- *rt;
+ *rt,
+ *l;
int nothing,
rt_length;
int badsql = FALSE;
@@ -1834,6 +1835,43 @@ ApplyRetrieveRule(Query *parsetree,
rtable = nconc(rtable, copyObject(rule_action->rtable));
parsetree->rtable = rtable;
+ /* FOR UPDATE of view... */
+ foreach (l, parsetree->rowMark)
+ {
+ if (((RowMark*)lfirst(l))->rti == rt_index)
+ break;
+ }
+ if (l != NULL) /* oh, hell -:) */
+ {
+ RowMark *newrm;
+ Index rti = 1;
+ List *l2;
+
+ /*
+ * We believe that rt_index is VIEW - nothing should be
+ * marked for VIEW, but ACL check must be done.
+ * As for real tables of VIEW - their rows must be marked, but
+ * we have to skip ACL check for them.
+ */
+ ((RowMark*)lfirst(l))->info &= ~ROW_MARK_FOR_UPDATE;
+ foreach (l2, rule_action->rtable)
+ {
+ /*
+ * RTable of VIEW has two entries of VIEW itself -
+ * we use relid to skip them.
+ */
+ if (relation->rd_id != ((RangeTblEntry*)lfirst(l2))->relid)
+ {
+ newrm = makeNode(RowMark);
+ newrm->rti = rti + rt_length;
+ newrm->info = ROW_MARK_FOR_UPDATE;
+ lnext(l) = lcons(newrm, lnext(l));
+ l = lnext(l);
+ }
+ rti++;
+ }
+ }
+
rule_action->rtable = rtable;
OffsetVarNodes((Node *) rule_qual, rt_length, 0);
OffsetVarNodes((Node *) rule_action, rt_length, 0);