1/*-------------------------------------------------------------------------
2 *
3 * lockoptions.h
4 * Common header for some locking-related declarations.
5 *
6 *
7 * Copyright (c) 2014-2019, PostgreSQL Global Development Group
8 *
9 * src/include/nodes/lockoptions.h
10 *
11 *-------------------------------------------------------------------------
12 */
13#ifndef LOCKOPTIONS_H
14#define LOCKOPTIONS_H
15
16/*
17 * This enum represents the different strengths of FOR UPDATE/SHARE clauses.
18 * The ordering here is important, because the highest numerical value takes
19 * precedence when a RTE is specified multiple ways. See applyLockingClause.
20 */
21typedef enum LockClauseStrength
22{
23 LCS_NONE, /* no such clause - only used in PlanRowMark */
24 LCS_FORKEYSHARE, /* FOR KEY SHARE */
25 LCS_FORSHARE, /* FOR SHARE */
26 LCS_FORNOKEYUPDATE, /* FOR NO KEY UPDATE */
27 LCS_FORUPDATE /* FOR UPDATE */
28} LockClauseStrength;
29
30/*
31 * This enum controls how to deal with rows being locked by FOR UPDATE/SHARE
32 * clauses (i.e., it represents the NOWAIT and SKIP LOCKED options).
33 * The ordering here is important, because the highest numerical value takes
34 * precedence when a RTE is specified multiple ways. See applyLockingClause.
35 */
36typedef enum LockWaitPolicy
37{
38 /* Wait for the lock to become available (default behavior) */
39 LockWaitBlock,
40 /* Skip rows that can't be locked (SKIP LOCKED) */
41 LockWaitSkip,
42 /* Raise an error if a row cannot be locked (NOWAIT) */
43 LockWaitError
44} LockWaitPolicy;
45
46/*
47 * Possible lock modes for a tuple.
48 */
49typedef enum LockTupleMode
50{
51 /* SELECT FOR KEY SHARE */
52 LockTupleKeyShare,
53 /* SELECT FOR SHARE */
54 LockTupleShare,
55 /* SELECT FOR NO KEY UPDATE, and UPDATEs that don't modify key columns */
56 LockTupleNoKeyExclusive,
57 /* SELECT FOR UPDATE, UPDATEs that modify key columns, and DELETE */
58 LockTupleExclusive
59} LockTupleMode;
60
61#endif /* LOCKOPTIONS_H */
62