1 /*-------------------------------------------------------------------------
4 * POSTGRES relation scan descriptor definitions.
7 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * src/include/access/relscan.h
12 *-------------------------------------------------------------------------
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"
25 struct ParallelTableScanDescData
;
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.
31 typedef struct TableScanDescData
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 */
39 /* Range of ItemPointers for table_scan_getnextslot_tidrange() to scan. */
40 ItemPointerData rs_mintid
;
41 ItemPointerData rs_maxtid
;
44 * Information about type and behaviour of the scan, a bitmask of members
45 * of the ScanOptions enum (see tableam.h).
49 struct ParallelTableScanDescData
*rs_parallel
; /* parallel scan
52 typedef struct TableScanDescData
*TableScanDesc
;
55 * Shared state for parallel table scan.
57 * Each backend participating in a parallel table scan has its own
58 * TableScanDesc in backend-private memory, and those objects all contain a
59 * pointer to this structure. The information here must be sufficient to
60 * properly initialize each new TableScanDesc as workers join the scan, and it
61 * must act as a information what to scan for those workers.
63 typedef struct ParallelTableScanDescData
65 Oid phs_relid
; /* OID of relation to scan */
66 bool phs_syncscan
; /* report location to syncscan logic? */
67 bool phs_snapshot_any
; /* SnapshotAny, not phs_snapshot_data? */
68 Size phs_snapshot_off
; /* data for snapshot */
69 } ParallelTableScanDescData
;
70 typedef struct ParallelTableScanDescData
*ParallelTableScanDesc
;
73 * Shared state for parallel table scans, for block oriented storage.
75 typedef struct ParallelBlockTableScanDescData
77 ParallelTableScanDescData base
;
79 BlockNumber phs_nblocks
; /* # blocks in relation at start of scan */
80 slock_t phs_mutex
; /* mutual exclusion for setting startblock */
81 BlockNumber phs_startblock
; /* starting block number */
82 pg_atomic_uint64 phs_nallocated
; /* number of blocks allocated to
84 } ParallelBlockTableScanDescData
;
85 typedef struct ParallelBlockTableScanDescData
*ParallelBlockTableScanDesc
;
88 * Per backend state for parallel table scan, for block-oriented storage.
90 typedef struct ParallelBlockTableScanWorkerData
92 uint64 phsw_nallocated
; /* Current # of blocks into the scan */
93 uint32 phsw_chunk_remaining
; /* # blocks left in this chunk */
94 uint32 phsw_chunk_size
; /* The number of blocks to allocate in
95 * each I/O chunk for the scan */
96 } ParallelBlockTableScanWorkerData
;
97 typedef struct ParallelBlockTableScanWorkerData
*ParallelBlockTableScanWorker
;
100 * Base class for fetches from a table via an index. This is the base-class
101 * for such scans, which needs to be embedded in the respective struct for
104 typedef struct IndexFetchTableData
107 } IndexFetchTableData
;
110 * We use the same IndexScanDescData structure for both amgettuple-based
111 * and amgetbitmap-based index scans. Some fields are only relevant in
112 * amgettuple-based scans.
114 typedef struct IndexScanDescData
116 /* scan parameters */
117 Relation heapRelation
; /* heap relation descriptor, or NULL */
118 Relation indexRelation
; /* index relation descriptor */
119 struct SnapshotData
*xs_snapshot
; /* snapshot to see */
120 int numberOfKeys
; /* number of index qualifier conditions */
121 int numberOfOrderBys
; /* number of ordering operators */
122 struct ScanKeyData
*keyData
; /* array of index qualifier descriptors */
123 struct ScanKeyData
*orderByData
; /* array of ordering op descriptors */
124 bool xs_want_itup
; /* caller requests index tuples */
125 bool xs_temp_snap
; /* unregister snapshot at scan end? */
127 /* signaling to index AM about killing index tuples */
128 bool kill_prior_tuple
; /* last-returned tuple is dead */
129 bool ignore_killed_tuples
; /* do not return killed entries */
130 bool xactStartedInRecovery
; /* prevents killing/seeing killed
133 /* index access method's private state */
134 void *opaque
; /* access-method-specific info */
137 * In an index-only scan, a successful amgettuple call must fill either
138 * xs_itup (and xs_itupdesc) or xs_hitup (and xs_hitupdesc) to provide the
139 * data returned by the scan. It can fill both, in which case the heap
140 * format will be used.
142 IndexTuple xs_itup
; /* index tuple returned by AM */
143 struct TupleDescData
*xs_itupdesc
; /* rowtype descriptor of xs_itup */
144 HeapTuple xs_hitup
; /* index data returned by AM, as HeapTuple */
145 struct TupleDescData
*xs_hitupdesc
; /* rowtype descriptor of xs_hitup */
147 ItemPointerData xs_heaptid
; /* result */
148 bool xs_heap_continue
; /* T if must keep walking, potential
150 IndexFetchTableData
*xs_heapfetch
;
152 bool xs_recheck
; /* T means scan keys must be rechecked */
155 * When fetching with an ordering operator, the values of the ORDER BY
156 * expressions of the last returned tuple, according to the index. If
157 * xs_recheckorderby is true, these need to be rechecked just like the
158 * scan keys, and the values returned here are a lower-bound on the actual
161 Datum
*xs_orderbyvals
;
162 bool *xs_orderbynulls
;
163 bool xs_recheckorderby
;
165 /* parallel index scan information, in shared memory */
166 struct ParallelIndexScanDescData
*parallel_scan
;
169 /* Generic structure for parallel scans */
170 typedef struct ParallelIndexScanDescData
174 Size ps_offset
; /* Offset in bytes of am specific structure */
175 char ps_snapshot_data
[FLEXIBLE_ARRAY_MEMBER
];
176 } ParallelIndexScanDescData
;
178 struct TupleTableSlot
;
180 /* Struct for storage-or-index scans of system tables */
181 typedef struct SysScanDescData
183 Relation heap_rel
; /* catalog being scanned */
184 Relation irel
; /* NULL if doing heap scan */
185 struct TableScanDescData
*scan
; /* only valid in storage-scan case */
186 struct IndexScanDescData
*iscan
; /* only valid in index-scan case */
187 struct SnapshotData
*snapshot
; /* snapshot to unregister at end of scan */
188 struct TupleTableSlot
*slot
;
191 #endif /* RELSCAN_H */