1 /*-------------------------------------------------------------------------
2  *
3  * tqual.h
4  *	  POSTGRES "time qualification" definitions, ie, tuple visibility rules.
5  *
6  *	  Should be moved/renamed...    - vadim 07/28/98
7  *
8  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
9  * Portions Copyright (c) 1994, Regents of the University of California
10  *
11  * src/include/utils/tqual.h
12  *
13  *-------------------------------------------------------------------------
14  */
15 #ifndef TQUAL_H
16 #define TQUAL_H
17 
18 #include "utils/snapshot.h"
19 #include "access/xlogdefs.h"
20 
21 
22 /* Static variables representing various special snapshot semantics */
23 extern PGDLLIMPORT SnapshotData SnapshotSelfData;
24 extern PGDLLIMPORT SnapshotData SnapshotAnyData;
25 extern PGDLLIMPORT SnapshotData CatalogSnapshotData;
26 
27 #define SnapshotSelf		(&SnapshotSelfData)
28 #define SnapshotAny			(&SnapshotAnyData)
29 
30 /* This macro encodes the knowledge of which snapshots are MVCC-safe */
31 #define IsMVCCSnapshot(snapshot)  \
32 	((snapshot)->satisfies == HeapTupleSatisfiesMVCC || \
33 	 (snapshot)->satisfies == HeapTupleSatisfiesHistoricMVCC)
34 
35 /*
36  * HeapTupleSatisfiesVisibility
37  *		True iff heap tuple satisfies a time qual.
38  *
39  * Notes:
40  *	Assumes heap tuple is valid.
41  *	Beware of multiple evaluations of snapshot argument.
42  *	Hint bits in the HeapTuple's t_infomask may be updated as a side effect;
43  *	if so, the indicated buffer is marked dirty.
44  */
45 #define HeapTupleSatisfiesVisibility(tuple, snapshot, buffer) \
46 	((*(snapshot)->satisfies) (tuple, snapshot, buffer))
47 
48 /* Result codes for HeapTupleSatisfiesVacuum */
49 typedef enum
50 {
51 	HEAPTUPLE_DEAD,				/* tuple is dead and deletable */
52 	HEAPTUPLE_LIVE,				/* tuple is live (committed, no deleter) */
53 	HEAPTUPLE_RECENTLY_DEAD,	/* tuple is dead, but not deletable yet */
54 	HEAPTUPLE_INSERT_IN_PROGRESS,	/* inserting xact is still in progress */
55 	HEAPTUPLE_DELETE_IN_PROGRESS	/* deleting xact is still in progress */
56 } HTSV_Result;
57 
58 /* These are the "satisfies" test routines for the various snapshot types */
59 extern bool HeapTupleSatisfiesMVCC(HeapTuple htup,
60 					   Snapshot snapshot, Buffer buffer);
61 extern bool HeapTupleSatisfiesSelf(HeapTuple htup,
62 					   Snapshot snapshot, Buffer buffer);
63 extern bool HeapTupleSatisfiesAny(HeapTuple htup,
64 					  Snapshot snapshot, Buffer buffer);
65 extern bool HeapTupleSatisfiesToast(HeapTuple htup,
66 						Snapshot snapshot, Buffer buffer);
67 extern bool HeapTupleSatisfiesDirty(HeapTuple htup,
68 						Snapshot snapshot, Buffer buffer);
69 extern bool HeapTupleSatisfiesHistoricMVCC(HeapTuple htup,
70 							   Snapshot snapshot, Buffer buffer);
71 
72 /* Special "satisfies" routines with different APIs */
73 extern HTSU_Result HeapTupleSatisfiesUpdate(HeapTuple htup,
74 						 CommandId curcid, Buffer buffer);
75 extern HTSV_Result HeapTupleSatisfiesVacuum(HeapTuple htup,
76 						 TransactionId OldestXmin, Buffer buffer);
77 extern bool HeapTupleIsSurelyDead(HeapTuple htup,
78 					  TransactionId OldestXmin);
79 extern bool XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot);
80 
81 extern void HeapTupleSetHintBits(HeapTupleHeader tuple, Buffer buffer,
82 					 uint16 infomask, TransactionId xid);
83 extern bool HeapTupleHeaderIsOnlyLocked(HeapTupleHeader tuple);
84 
85 /*
86  * To avoid leaking too much knowledge about reorderbuffer implementation
87  * details this is implemented in reorderbuffer.c not tqual.c.
88  */
89 struct HTAB;
90 extern bool ResolveCminCmaxDuringDecoding(struct HTAB *tuplecid_data,
91 							  Snapshot snapshot,
92 							  HeapTuple htup,
93 							  Buffer buffer,
94 							  CommandId *cmin, CommandId *cmax);
95 
96 /*
97  * We don't provide a static SnapshotDirty variable because it would be
98  * non-reentrant.  Instead, users of that snapshot type should declare a
99  * local variable of type SnapshotData, and initialize it with this macro.
100  */
101 #define InitDirtySnapshot(snapshotdata)  \
102 	((snapshotdata).satisfies = HeapTupleSatisfiesDirty)
103 
104 /*
105  * Similarly, some initialization is required for SnapshotToast.  We need
106  * to set lsn and whenTaken correctly to support snapshot_too_old.
107  */
108 #define InitToastSnapshot(snapshotdata, l, w)  \
109 	((snapshotdata).satisfies = HeapTupleSatisfiesToast, \
110 	 (snapshotdata).lsn = (l),					\
111 	 (snapshotdata).whenTaken = (w))
112 
113 #endif							/* TQUAL_H */
114