diff options
Diffstat (limited to 'src/backend/rewrite/locks.c')
-rw-r--r-- | src/backend/rewrite/locks.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/backend/rewrite/locks.c b/src/backend/rewrite/locks.c index b0557b042e1..56bd8e053b7 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; |