From 0f413d2dc20111d7d539e2c3eee8ce0ef441ca36 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 21 Jan 1998 04:24:46 +0000 Subject: Make subqueries rewrite properly. --- src/backend/rewrite/locks.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'src/backend/rewrite/locks.c') diff --git a/src/backend/rewrite/locks.c b/src/backend/rewrite/locks.c index b0557b042e..56bd8e053b 100644 --- a/src/backend/rewrite/locks.c +++ b/src/backend/rewrite/locks.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/Attic/locks.c,v 1.7 1998/01/15 19:00:06 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/Attic/locks.c,v 1.8 1998/01/21 04:24:34 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -27,7 +27,8 @@ * otherwise, we return false */ static bool -nodeThisLockWasTriggered(Node *node, int varno, AttrNumber attnum) +nodeThisLockWasTriggered(Node *node, int varno, AttrNumber attnum, + int sublevels_up) { if (node == NULL) return FALSE; @@ -46,24 +47,24 @@ nodeThisLockWasTriggered(Node *node, int varno, AttrNumber attnum) { Expr *expr = (Expr *) node; - return - nodeThisLockWasTriggered((Node *) expr->args, varno, attnum); + return nodeThisLockWasTriggered((Node *) expr->args, varno, + attnum, sublevels_up); } break; case T_TargetEntry: { TargetEntry *tle = (TargetEntry *) node; - return - nodeThisLockWasTriggered(tle->expr, varno, attnum); + return nodeThisLockWasTriggered(tle->expr, varno, attnum, + sublevels_up); } break; case T_Aggreg: { Aggreg *agg = (Aggreg *) node; - return - nodeThisLockWasTriggered(agg->target, varno, attnum); + return nodeThisLockWasTriggered(agg->target, varno, attnum, + sublevels_up); } break; case T_List: @@ -72,12 +73,22 @@ nodeThisLockWasTriggered(Node *node, int varno, AttrNumber attnum) foreach(l, (List *) node) { - if (nodeThisLockWasTriggered(lfirst(l), varno, attnum)) + if (nodeThisLockWasTriggered(lfirst(l), varno, attnum, + sublevels_up)) return TRUE; } return FALSE; } break; + case T_SubLink: + { + SubLink *sublink = (SubLink *) node; + Query *query = (Query *)sublink->subselect; + + return nodeThisLockWasTriggered(query->qual, varno, attnum, + sublevels_up + 1); + } + break; default: break; } @@ -96,10 +107,10 @@ thisLockWasTriggered(int varno, Query *parsetree) { - if (nodeThisLockWasTriggered(parsetree->qual, varno, attnum)) + if (nodeThisLockWasTriggered(parsetree->qual, varno, attnum, 0)) return true; - if (nodeThisLockWasTriggered((Node *) parsetree->targetList, varno, attnum)) + if (nodeThisLockWasTriggered((Node *) parsetree->targetList, varno, attnum, 0)) return true; return false; -- cgit v1.2.1