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 80 extern void HeapTupleSetHintBits(HeapTupleHeader tuple, Buffer buffer, 81 uint16 infomask, TransactionId xid); 82 extern bool HeapTupleHeaderIsOnlyLocked(HeapTupleHeader tuple); 83 84 /* 85 * To avoid leaking too much knowledge about reorderbuffer implementation 86 * details this is implemented in reorderbuffer.c not tqual.c. 87 */ 88 struct HTAB; 89 extern bool ResolveCminCmaxDuringDecoding(struct HTAB *tuplecid_data, 90 Snapshot snapshot, 91 HeapTuple htup, 92 Buffer buffer, 93 CommandId *cmin, CommandId *cmax); 94 95 /* 96 * We don't provide a static SnapshotDirty variable because it would be 97 * non-reentrant. Instead, users of that snapshot type should declare a 98 * local variable of type SnapshotData, and initialize it with this macro. 99 */ 100 #define InitDirtySnapshot(snapshotdata) \ 101 ((snapshotdata).satisfies = HeapTupleSatisfiesDirty) 102 103 /* 104 * Similarly, some initialization is required for SnapshotToast. We need 105 * to set lsn and whenTaken correctly to support snapshot_too_old. 106 */ 107 #define InitToastSnapshot(snapshotdata, l, w) \ 108 ((snapshotdata).satisfies = HeapTupleSatisfiesToast, \ 109 (snapshotdata).lsn = (l), \ 110 (snapshotdata).whenTaken = (w)) 111 112 #endif /* TQUAL_H */ 113