123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /*-------------------------------------------------------------------------
- *
- * relscan.h
- * POSTGRES relation scan descriptor definitions.
- *
- *
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * src/include/access/relscan.h
- *
- *-------------------------------------------------------------------------
- */
- #ifndef RELSCAN_H
- #define RELSCAN_H
- #include "access/genam.h"
- #include "access/heapam.h"
- #include "access/htup_details.h"
- #include "access/itup.h"
- #include "access/tupdesc.h"
- /*
- * Shared state for parallel heap scan.
- *
- * Each backend participating in a parallel heap scan has its own
- * HeapScanDesc in backend-private memory, and those objects all contain
- * a pointer to this structure. The information here must be sufficient
- * to properly initialize each new HeapScanDesc as workers join the scan,
- * and it must act as a font of block numbers for those workers.
- */
- typedef struct ParallelHeapScanDescData
- {
- Oid phs_relid; /* OID of relation to scan */
- bool phs_syncscan; /* report location to syncscan logic? */
- BlockNumber phs_nblocks; /* # blocks in relation at start of scan */
- slock_t phs_mutex; /* mutual exclusion for block number fields */
- BlockNumber phs_startblock; /* starting block number */
- BlockNumber phs_cblock; /* current block number */
- char phs_snapshot_data[FLEXIBLE_ARRAY_MEMBER];
- } ParallelHeapScanDescData;
- typedef struct HeapScanDescData
- {
- /* scan parameters */
- Relation rs_rd; /* heap relation descriptor */
- Snapshot rs_snapshot; /* snapshot to see */
- int rs_nkeys; /* number of scan keys */
- ScanKey rs_key; /* array of scan key descriptors */
- bool rs_bitmapscan; /* true if this is really a bitmap scan */
- bool rs_samplescan; /* true if this is really a sample scan */
- bool rs_pageatatime; /* verify visibility page-at-a-time? */
- bool rs_allow_strat; /* allow or disallow use of access strategy */
- bool rs_allow_sync; /* allow or disallow use of syncscan */
- bool rs_temp_snap; /* unregister snapshot at scan end? */
- /* state set up at initscan time */
- BlockNumber rs_nblocks; /* total number of blocks in rel */
- BlockNumber rs_startblock; /* block # to start at */
- BlockNumber rs_numblocks; /* max number of blocks to scan */
- /* rs_numblocks is usually InvalidBlockNumber, meaning "scan whole rel" */
- BufferAccessStrategy rs_strategy; /* access strategy for reads */
- bool rs_syncscan; /* report location to syncscan logic? */
- /* scan current state */
- bool rs_inited; /* false = scan not init'd yet */
- HeapTupleData rs_ctup; /* current tuple in scan, if any */
- BlockNumber rs_cblock; /* current block # in scan, if any */
- Buffer rs_cbuf; /* current buffer in scan, if any */
- /* NB: if rs_cbuf is not InvalidBuffer, we hold a pin on that buffer */
- ParallelHeapScanDesc rs_parallel; /* parallel scan information */
- /* these fields only used in page-at-a-time mode and for bitmap scans */
- int rs_cindex; /* current tuple's index in vistuples */
- int rs_ntuples; /* number of visible tuples on page */
- OffsetNumber rs_vistuples[MaxHeapTuplesPerPage]; /* their offsets */
- } HeapScanDescData;
- /*
- * We use the same IndexScanDescData structure for both amgettuple-based
- * and amgetbitmap-based index scans. Some fields are only relevant in
- * amgettuple-based scans.
- */
- typedef struct IndexScanDescData
- {
- /* scan parameters */
- Relation heapRelation; /* heap relation descriptor, or NULL */
- Relation indexRelation; /* index relation descriptor */
- Snapshot xs_snapshot; /* snapshot to see */
- int numberOfKeys; /* number of index qualifier conditions */
- int numberOfOrderBys; /* number of ordering operators */
- ScanKey keyData; /* array of index qualifier descriptors */
- ScanKey orderByData; /* array of ordering op descriptors */
- bool xs_want_itup; /* caller requests index tuples */
- /* signaling to index AM about killing index tuples */
- bool kill_prior_tuple; /* last-returned tuple is dead */
- bool ignore_killed_tuples; /* do not return killed entries */
- bool xactStartedInRecovery; /* prevents killing/seeing killed
- * tuples */
- /* index access method's private state */
- void *opaque; /* access-method-specific info */
- /* in an index-only scan, this is valid after a successful amgettuple */
- IndexTuple xs_itup; /* index tuple returned by AM */
- TupleDesc xs_itupdesc; /* rowtype descriptor of xs_itup */
- /* xs_ctup/xs_cbuf/xs_recheck are valid after a successful index_getnext */
- HeapTupleData xs_ctup; /* current heap tuple, if any */
- Buffer xs_cbuf; /* current heap buffer in scan, if any */
- /* NB: if xs_cbuf is not InvalidBuffer, we hold a pin on that buffer */
- bool xs_recheck; /* T means scan keys must be rechecked */
- /*
- * When fetching with an ordering operator, the values of the ORDER BY
- * expressions of the last returned tuple, according to the index. If
- * xs_recheckorderby is true, these need to be rechecked just like the
- * scan keys, and the values returned here are a lower-bound on the actual
- * values.
- */
- Datum *xs_orderbyvals;
- bool *xs_orderbynulls;
- bool xs_recheckorderby;
- /* state data for traversing HOT chains in index_getnext */
- bool xs_continue_hot; /* T if must keep walking HOT chain */
- } IndexScanDescData;
- /* Struct for heap-or-index scans of system tables */
- typedef struct SysScanDescData
- {
- Relation heap_rel; /* catalog being scanned */
- Relation irel; /* NULL if doing heap scan */
- HeapScanDesc scan; /* only valid in heap-scan case */
- IndexScanDesc iscan; /* only valid in index-scan case */
- Snapshot snapshot; /* snapshot to unregister at end of scan */
- } SysScanDescData;
- #endif /* RELSCAN_H */
|