1 /*------------------------------------------------------------------------- 2 * 3 * relscan.h 4 * POSTGRES relation scan descriptor definitions. 5 * 6 * 7 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/access/relscan.h 11 * 12 *------------------------------------------------------------------------- 13 */ 14 #ifndef RELSCAN_H 15 #define RELSCAN_H 16 17 #include "access/htup_details.h" 18 #include "access/itup.h" 19 #include "port/atomics.h" 20 #include "storage/buf.h" 21 #include "storage/spin.h" 22 #include "utils/relcache.h" 23 24 25 struct ParallelTableScanDescData; 26 27 /* 28 * Generic descriptor for table scans. This is the base-class for table scans, 29 * which needs to be embedded in the scans of individual AMs. 30 */ 31 typedef struct TableScanDescData 32 { 33 /* scan parameters */ 34 Relation rs_rd; /* heap relation descriptor */ 35 struct SnapshotData *rs_snapshot; /* snapshot to see */ 36 int rs_nkeys; /* number of scan keys */ 37 struct ScanKeyData *rs_key; /* array of scan key descriptors */ 38 39 /* 40 * Information about type and behaviour of the scan, a bitmask of members 41 * of the ScanOptions enum (see tableam.h). 42 */ 43 uint32 rs_flags; 44 45 struct ParallelTableScanDescData *rs_parallel; /* parallel scan 46 * information */ 47 48 } TableScanDescData; 49 typedef struct TableScanDescData *TableScanDesc; 50 51 /* 52 * Shared state for parallel table scan. 53 * 54 * Each backend participating in a parallel table scan has its own 55 * TableScanDesc in backend-private memory, and those objects all contain a 56 * pointer to this structure. The information here must be sufficient to 57 * properly initialize each new TableScanDesc as workers join the scan, and it 58 * must act as a information what to scan for those workers. 59 */ 60 typedef struct ParallelTableScanDescData 61 { 62 Oid phs_relid; /* OID of relation to scan */ 63 bool phs_syncscan; /* report location to syncscan logic? */ 64 bool phs_snapshot_any; /* SnapshotAny, not phs_snapshot_data? */ 65 Size phs_snapshot_off; /* data for snapshot */ 66 } ParallelTableScanDescData; 67 typedef struct ParallelTableScanDescData *ParallelTableScanDesc; 68 69 /* 70 * Shared state for parallel table scans, for block oriented storage. 71 */ 72 typedef struct ParallelBlockTableScanDescData 73 { 74 ParallelTableScanDescData base; 75 76 BlockNumber phs_nblocks; /* # blocks in relation at start of scan */ 77 slock_t phs_mutex; /* mutual exclusion for setting startblock */ 78 BlockNumber phs_startblock; /* starting block number */ 79 pg_atomic_uint64 phs_nallocated; /* number of blocks allocated to 80 * workers so far. */ 81 } ParallelBlockTableScanDescData; 82 typedef struct ParallelBlockTableScanDescData *ParallelBlockTableScanDesc; 83 84 /* 85 * Base class for fetches from a table via an index. This is the base-class 86 * for such scans, which needs to be embedded in the respective struct for 87 * individual AMs. 88 */ 89 typedef struct IndexFetchTableData 90 { 91 Relation rel; 92 } IndexFetchTableData; 93 94 /* 95 * We use the same IndexScanDescData structure for both amgettuple-based 96 * and amgetbitmap-based index scans. Some fields are only relevant in 97 * amgettuple-based scans. 98 */ 99 typedef struct IndexScanDescData 100 { 101 /* scan parameters */ 102 Relation heapRelation; /* heap relation descriptor, or NULL */ 103 Relation indexRelation; /* index relation descriptor */ 104 struct SnapshotData *xs_snapshot; /* snapshot to see */ 105 int numberOfKeys; /* number of index qualifier conditions */ 106 int numberOfOrderBys; /* number of ordering operators */ 107 struct ScanKeyData *keyData; /* array of index qualifier descriptors */ 108 struct ScanKeyData *orderByData; /* array of ordering op descriptors */ 109 bool xs_want_itup; /* caller requests index tuples */ 110 bool xs_temp_snap; /* unregister snapshot at scan end? */ 111 112 /* signaling to index AM about killing index tuples */ 113 bool kill_prior_tuple; /* last-returned tuple is dead */ 114 bool ignore_killed_tuples; /* do not return killed entries */ 115 bool xactStartedInRecovery; /* prevents killing/seeing killed 116 * tuples */ 117 118 /* index access method's private state */ 119 void *opaque; /* access-method-specific info */ 120 121 /* 122 * In an index-only scan, a successful amgettuple call must fill either 123 * xs_itup (and xs_itupdesc) or xs_hitup (and xs_hitupdesc) to provide the 124 * data returned by the scan. It can fill both, in which case the heap 125 * format will be used. 126 */ 127 IndexTuple xs_itup; /* index tuple returned by AM */ 128 struct TupleDescData *xs_itupdesc; /* rowtype descriptor of xs_itup */ 129 HeapTuple xs_hitup; /* index data returned by AM, as HeapTuple */ 130 struct TupleDescData *xs_hitupdesc; /* rowtype descriptor of xs_hitup */ 131 132 ItemPointerData xs_heaptid; /* result */ 133 bool xs_heap_continue; /* T if must keep walking, potential 134 * further results */ 135 IndexFetchTableData *xs_heapfetch; 136 137 bool xs_recheck; /* T means scan keys must be rechecked */ 138 139 /* 140 * When fetching with an ordering operator, the values of the ORDER BY 141 * expressions of the last returned tuple, according to the index. If 142 * xs_recheckorderby is true, these need to be rechecked just like the 143 * scan keys, and the values returned here are a lower-bound on the actual 144 * values. 145 */ 146 Datum *xs_orderbyvals; 147 bool *xs_orderbynulls; 148 bool xs_recheckorderby; 149 150 /* parallel index scan information, in shared memory */ 151 struct ParallelIndexScanDescData *parallel_scan; 152 } IndexScanDescData; 153 154 /* Generic structure for parallel scans */ 155 typedef struct ParallelIndexScanDescData 156 { 157 Oid ps_relid; 158 Oid ps_indexid; 159 Size ps_offset; /* Offset in bytes of am specific structure */ 160 char ps_snapshot_data[FLEXIBLE_ARRAY_MEMBER]; 161 } ParallelIndexScanDescData; 162 163 struct TupleTableSlot; 164 165 /* Struct for storage-or-index scans of system tables */ 166 typedef struct SysScanDescData 167 { 168 Relation heap_rel; /* catalog being scanned */ 169 Relation irel; /* NULL if doing heap scan */ 170 struct TableScanDescData *scan; /* only valid in storage-scan case */ 171 struct IndexScanDescData *iscan; /* only valid in index-scan case */ 172 struct SnapshotData *snapshot; /* snapshot to unregister at end of scan */ 173 struct TupleTableSlot *slot; 174 } SysScanDescData; 175 176 #endif /* RELSCAN_H */ 177