mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
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.
This commit is contained in:
@ -12,6 +12,12 @@
|
||||
* this allows
|
||||
* WHERE ctid IN (tid1, tid2, ...)
|
||||
*
|
||||
* We also support "WHERE CURRENT OF cursor" conditions (CurrentOfExpr),
|
||||
* which amount to "CTID = run-time-determined-TID". These could in
|
||||
* theory be translated to a simple comparison of CTID to the result of
|
||||
* a function, but in practice it works better to keep the special node
|
||||
* representation all the way through to execution.
|
||||
*
|
||||
* There is currently no special support for joins involving CTID; in
|
||||
* particular nothing corresponding to best_inner_indexscan(). Since it's
|
||||
* not very useful to store TIDs of one table in another table, there
|
||||
@ -24,7 +30,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/path/tidpath.c,v 1.29 2007/01/05 22:19:31 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/path/tidpath.c,v 1.30 2007/06/11 01:16:22 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -174,6 +180,12 @@ TidQualFromExpr(Node *expr, int varno)
|
||||
if (IsTidEqualAnyClause((ScalarArrayOpExpr *) expr, varno))
|
||||
rlst = list_make1(expr);
|
||||
}
|
||||
else if (expr && IsA(expr, CurrentOfExpr))
|
||||
{
|
||||
/* another base case: check for CURRENT OF on this rel */
|
||||
if (((CurrentOfExpr *) expr)->cvarno == varno)
|
||||
rlst = list_make1(expr);
|
||||
}
|
||||
else if (and_clause(expr))
|
||||
{
|
||||
foreach(l, ((BoolExpr *) expr)->args)
|
||||
|
Reference in New Issue
Block a user