mirror of
https://github.com/postgres/postgres.git
synced 2026-04-22 14:47:29 -04:00
This adds a new ON CONFLICT action DO SELECT [FOR UPDATE/SHARE], which returns the pre-existing rows when conflicts are detected. The INSERT statement must have a RETURNING clause, when DO SELECT is specified. The optional FOR UPDATE/SHARE clause allows the rows to be locked before they are are returned. As with a DO UPDATE conflict action, an optional WHERE clause may be used to prevent rows from being selected for return (but as with a DO UPDATE action, rows filtered out by the WHERE clause are still locked). Bumps catversion as stored rules change. Author: Andreas Karlsson <andreas@proxel.se> Author: Marko Tiikkaja <marko@joh.to> Author: Viktor Holmberg <v@viktorh.net> Reviewed-by: Joel Jacobson <joel@compiler.org> Reviewed-by: Kirill Reshke <reshkekirill@gmail.com> Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com> Reviewed-by: Jian He <jian.universality@gmail.com> Discussion: https://postgr.es/m/d631b406-13b7-433e-8c0b-c6040c4b4663@Spark Discussion: https://postgr.es/m/5fca222d-62ae-4a2f-9fcb-0eca56277094@Spark Discussion: https://postgr.es/m/2b5db2e6-8ece-44d0-9890-f256fdca9f7e@proxel.se Discussion: https://postgr.es/m/CAL9smLCdV-v3KgOJX3mU19FYK82N7yzqJj2HAwWX70E=P98kgQ@mail.gmail.com
62 lines
1.9 KiB
C
62 lines
1.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* lockoptions.h
|
|
* Common header for some locking-related declarations.
|
|
*
|
|
*
|
|
* Copyright (c) 2014-2026, PostgreSQL Global Development Group
|
|
*
|
|
* src/include/nodes/lockoptions.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef LOCKOPTIONS_H
|
|
#define LOCKOPTIONS_H
|
|
|
|
/*
|
|
* This enum represents the different strengths of FOR UPDATE/SHARE clauses.
|
|
* The ordering here is important, because the highest numerical value takes
|
|
* precedence when a RTE is specified multiple ways. See applyLockingClause.
|
|
*/
|
|
typedef enum LockClauseStrength
|
|
{
|
|
LCS_NONE, /* no such clause - only used in PlanRowMark
|
|
* and ON CONFLICT DO SELECT */
|
|
LCS_FORKEYSHARE, /* FOR KEY SHARE */
|
|
LCS_FORSHARE, /* FOR SHARE */
|
|
LCS_FORNOKEYUPDATE, /* FOR NO KEY UPDATE */
|
|
LCS_FORUPDATE, /* FOR UPDATE */
|
|
} LockClauseStrength;
|
|
|
|
/*
|
|
* This enum controls how to deal with rows being locked by FOR UPDATE/SHARE
|
|
* clauses (i.e., it represents the NOWAIT and SKIP LOCKED options).
|
|
* The ordering here is important, because the highest numerical value takes
|
|
* precedence when a RTE is specified multiple ways. See applyLockingClause.
|
|
*/
|
|
typedef enum LockWaitPolicy
|
|
{
|
|
/* Wait for the lock to become available (default behavior) */
|
|
LockWaitBlock,
|
|
/* Skip rows that can't be locked (SKIP LOCKED) */
|
|
LockWaitSkip,
|
|
/* Raise an error if a row cannot be locked (NOWAIT) */
|
|
LockWaitError,
|
|
} LockWaitPolicy;
|
|
|
|
/*
|
|
* Possible lock modes for a tuple.
|
|
*/
|
|
typedef enum LockTupleMode
|
|
{
|
|
/* SELECT FOR KEY SHARE */
|
|
LockTupleKeyShare,
|
|
/* SELECT FOR SHARE */
|
|
LockTupleShare,
|
|
/* SELECT FOR NO KEY UPDATE, and UPDATEs that don't modify key columns */
|
|
LockTupleNoKeyExclusive,
|
|
/* SELECT FOR UPDATE, UPDATEs that modify key columns, and DELETE */
|
|
LockTupleExclusive,
|
|
} LockTupleMode;
|
|
|
|
#endif /* LOCKOPTIONS_H */
|