diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2007-06-11 01:16:30 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2007-06-11 01:16:30 +0000 |
| commit | 6808f1b1de0ebcd4af558ba84c3226b2027f55ea (patch) | |
| tree | ebd12580d3aaca6ec79b5d99563a1eff02451e88 /src/backend/optimizer/plan | |
| parent | 85d72f05167b87bc44464b2eabea8538f1fd1e45 (diff) | |
| download | postgresql-6808f1b1de0ebcd4af558ba84c3226b2027f55ea.tar.gz | |
Support UPDATE/DELETE WHERE CURRENT OF cursor_name, per SQL standard.
Along the way, allow FOR UPDATE in non-WITH-HOLD cursors; there may once
have been a reason to disallow that, but it seems to work now, and it's
really rather necessary if you want to select a row via a cursor and then
update it in a concurrent-safe fashion.
Original patch by Arul Shaji, rather heavily editorialized by Tom Lane.
Diffstat (limited to 'src/backend/optimizer/plan')
| -rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 90a49983ac..055b47beec 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.135 2007/04/30 00:16:43 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.136 2007/06/11 01:16:23 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -618,6 +618,15 @@ fix_scan_expr_mutator(Node *node, fix_scan_expr_context *context) var->varnoold += context->rtoffset; return (Node *) var; } + if (IsA(node, CurrentOfExpr)) + { + CurrentOfExpr *cexpr = (CurrentOfExpr *) copyObject(node); + + Assert(cexpr->cvarno != INNER); + Assert(cexpr->cvarno != OUTER); + cexpr->cvarno += context->rtoffset; + return (Node *) cexpr; + } /* * Since we update opcode info in-place, this part could possibly * scribble on the planner's input data structures, but it's OK. |
