PostgreSQL Source Code  git master
tableam.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * tableam.h
4  * POSTGRES table access method definitions.
5  *
6  *
7  * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/access/tableam.h
11  *
12  * NOTES
13  * See tableam.sgml for higher level documentation.
14  *
15  *-------------------------------------------------------------------------
16  */
17 #ifndef TABLEAM_H
18 #define TABLEAM_H
19 
20 #include "access/relscan.h"
21 #include "access/sdir.h"
22 #include "utils/guc.h"
23 #include "utils/rel.h"
24 #include "utils/snapshot.h"
25 
26 
27 #define DEFAULT_TABLE_ACCESS_METHOD "heap"
28 
29 /* GUCs */
30 extern char *default_table_access_method;
31 extern bool synchronize_seqscans;
32 
33 
34 struct BulkInsertStateData;
35 struct IndexInfo;
36 struct SampleScanState;
37 struct TBMIterateResult;
38 struct VacuumParams;
39 struct ValidateIndexState;
40 
41 /*
42  * Bitmask values for the flags argument to the scan_begin callback.
43  */
44 typedef enum ScanOptions
45 {
46  /* one of SO_TYPE_* may be specified */
47  SO_TYPE_SEQSCAN = 1 << 0,
50  SO_TYPE_TIDSCAN = 1 << 3,
51  SO_TYPE_ANALYZE = 1 << 4,
52 
53  /* several of SO_ALLOW_* may be specified */
54  /* allow or disallow use of access strategy */
55  SO_ALLOW_STRAT = 1 << 5,
56  /* report location to syncscan logic? */
57  SO_ALLOW_SYNC = 1 << 6,
58  /* verify visibility page-at-a-time? */
60 
61  /* unregister snapshot at scan end? */
63 } ScanOptions;
64 
65 /*
66  * Result codes for table_{update,delete,lock_tuple}, and for visibility
67  * routines inside table AMs.
68  */
69 typedef enum TM_Result
70 {
71  /*
72  * Signals that the action succeeded (i.e. update/delete performed, lock
73  * was acquired)
74  */
76 
77  /* The affected tuple wasn't visible to the relevant snapshot */
79 
80  /* The affected tuple was already modified by the calling backend */
82 
83  /*
84  * The affected tuple was updated by another transaction. This includes
85  * the case where tuple was moved to another partition.
86  */
88 
89  /* The affected tuple was deleted by another transaction */
91 
92  /*
93  * The affected tuple is currently being modified by another session. This
94  * will only be returned if table_(update/delete/lock_tuple) are
95  * instructed not to wait.
96  */
98 
99  /* lock couldn't be acquired, action skipped. Only used by lock_tuple */
101 } TM_Result;
102 
103 /*
104  * When table_tuple_update, table_tuple_delete, or table_tuple_lock fail
105  * because the target tuple is already outdated, they fill in this struct to
106  * provide information to the caller about what happened.
107  *
108  * ctid is the target's ctid link: it is the same as the target's TID if the
109  * target was deleted, or the location of the replacement tuple if the target
110  * was updated.
111  *
112  * xmax is the outdating transaction's XID. If the caller wants to visit the
113  * replacement tuple, it must check that this matches before believing the
114  * replacement is really a match.
115  *
116  * cmax is the outdating command's CID, but only when the failure code is
117  * TM_SelfModified (i.e., something in the current transaction outdated the
118  * tuple); otherwise cmax is zero. (We make this restriction because
119  * HeapTupleHeaderGetCmax doesn't work for tuples outdated in other
120  * transactions.)
121  */
122 typedef struct TM_FailureData
123 {
127  bool traversed;
129 
130 /* "options" flag bits for table_tuple_insert */
131 #define TABLE_INSERT_SKIP_WAL 0x0001
132 #define TABLE_INSERT_SKIP_FSM 0x0002
133 #define TABLE_INSERT_FROZEN 0x0004
134 #define TABLE_INSERT_NO_LOGICAL 0x0008
135 
136 /* flag bits for table_tuple_lock */
137 /* Follow tuples whose update is in progress if lock modes don't conflict */
138 #define TUPLE_LOCK_FLAG_LOCK_UPDATE_IN_PROGRESS (1 << 0)
139 /* Follow update chain and lock latest version of tuple */
140 #define TUPLE_LOCK_FLAG_FIND_LAST_VERSION (1 << 1)
141 
142 
143 /* Typedef for callback function for table_index_build_scan */
145  ItemPointer tid,
146  Datum *values,
147  bool *isnull,
148  bool tupleIsAlive,
149  void *state);
150 
151 /*
152  * API struct for a table AM. Note this must be allocated in a
153  * server-lifetime manner, typically as a static const struct, which then gets
154  * returned by FormData_pg_am.amhandler.
155  *
156  * In most cases it's not appropriate to call the callbacks directly, use the
157  * table_* wrapper functions instead.
158  *
159  * GetTableAmRoutine() asserts that required callbacks are filled in, remember
160  * to update when adding a callback.
161  */
162 typedef struct TableAmRoutine
163 {
164  /* this must be set to T_TableAmRoutine */
166 
167 
168  /* ------------------------------------------------------------------------
169  * Slot related callbacks.
170  * ------------------------------------------------------------------------
171  */
172 
173  /*
174  * Return slot implementation suitable for storing a tuple of this AM.
175  */
176  const TupleTableSlotOps *(*slot_callbacks) (Relation rel);
177 
178 
179  /* ------------------------------------------------------------------------
180  * Table scan callbacks.
181  * ------------------------------------------------------------------------
182  */
183 
184  /*
185  * Start a scan of `rel`. The callback has to return a TableScanDesc,
186  * which will typically be embedded in a larger, AM specific, struct.
187  *
188  * If nkeys != 0, the results need to be filtered by those scan keys.
189  *
190  * pscan, if not NULL, will have already been initialized with
191  * parallelscan_initialize(), and has to be for the same relation. Will
192  * only be set coming from table_beginscan_parallel().
193  *
194  * `flags` is a bitmask indicating the type of scan (ScanOptions's
195  * SO_TYPE_*, currently only one may be specified), options controlling
196  * the scan's behaviour (ScanOptions's SO_ALLOW_*, several may be
197  * specified, an AM may ignore unsupported ones) and whether the snapshot
198  * needs to be deallocated at scan_end (ScanOptions's SO_TEMP_SNAPSHOT).
199  */
200  TableScanDesc (*scan_begin) (Relation rel,
201  Snapshot snapshot,
202  int nkeys, struct ScanKeyData *key,
203  ParallelTableScanDesc pscan,
204  uint32 flags);
205 
206  /*
207  * Release resources and deallocate scan. If TableScanDesc.temp_snap,
208  * TableScanDesc.rs_snapshot needs to be unregistered.
209  */
210  void (*scan_end) (TableScanDesc scan);
211 
212  /*
213  * Restart relation scan. If set_params is set to true, allow_{strat,
214  * sync, pagemode} (see scan_begin) changes should be taken into account.
215  */
216  void (*scan_rescan) (TableScanDesc scan, struct ScanKeyData *key,
217  bool set_params, bool allow_strat,
218  bool allow_sync, bool allow_pagemode);
219 
220  /*
221  * Return next tuple from `scan`, store in slot.
222  */
223  bool (*scan_getnextslot) (TableScanDesc scan,
224  ScanDirection direction,
225  TupleTableSlot *slot);
226 
227 
228  /* ------------------------------------------------------------------------
229  * Parallel table scan related functions.
230  * ------------------------------------------------------------------------
231  */
232 
233  /*
234  * Estimate the size of shared memory needed for a parallel scan of this
235  * relation. The snapshot does not need to be accounted for.
236  */
237  Size (*parallelscan_estimate) (Relation rel);
238 
239  /*
240  * Initialize ParallelTableScanDesc for a parallel scan of this relation.
241  * `pscan` will be sized according to parallelscan_estimate() for the same
242  * relation.
243  */
244  Size (*parallelscan_initialize) (Relation rel,
245  ParallelTableScanDesc pscan);
246 
247  /*
248  * Reinitialize `pscan` for a new scan. `rel` will be the same relation as
249  * when `pscan` was initialized by parallelscan_initialize.
250  */
251  void (*parallelscan_reinitialize) (Relation rel,
252  ParallelTableScanDesc pscan);
253 
254 
255  /* ------------------------------------------------------------------------
256  * Index Scan Callbacks
257  * ------------------------------------------------------------------------
258  */
259 
260  /*
261  * Prepare to fetch tuples from the relation, as needed when fetching
262  * tuples for an index scan. The callback has to return an
263  * IndexFetchTableData, which the AM will typically embed in a larger
264  * structure with additional information.
265  *
266  * Tuples for an index scan can then be fetched via index_fetch_tuple.
267  */
268  struct IndexFetchTableData *(*index_fetch_begin) (Relation rel);
269 
270  /*
271  * Reset index fetch. Typically this will release cross index fetch
272  * resources held in IndexFetchTableData.
273  */
274  void (*index_fetch_reset) (struct IndexFetchTableData *data);
275 
276  /*
277  * Release resources and deallocate index fetch.
278  */
279  void (*index_fetch_end) (struct IndexFetchTableData *data);
280 
281  /*
282  * Fetch tuple at `tid` into `slot`, after doing a visibility test
283  * according to `snapshot`. If a tuple was found and passed the visibility
284  * test, return true, false otherwise.
285  *
286  * Note that AMs that do not necessarily update indexes when indexed
287  * columns do not change, need to return the current/correct version of
288  * the tuple that is visible to the snapshot, even if the tid points to an
289  * older version of the tuple.
290  *
291  * *call_again is false on the first call to index_fetch_tuple for a tid.
292  * If there potentially is another tuple matching the tid, *call_again
293  * needs be set to true by index_fetch_tuple, signalling to the caller
294  * that index_fetch_tuple should be called again for the same tid.
295  *
296  * *all_dead, if all_dead is not NULL, should be set to true by
297  * index_fetch_tuple iff it is guaranteed that no backend needs to see
298  * that tuple. Index AMs can use that to avoid returning that tid in
299  * future searches.
300  */
301  bool (*index_fetch_tuple) (struct IndexFetchTableData *scan,
302  ItemPointer tid,
303  Snapshot snapshot,
304  TupleTableSlot *slot,
305  bool *call_again, bool *all_dead);
306 
307 
308  /* ------------------------------------------------------------------------
309  * Callbacks for non-modifying operations on individual tuples
310  * ------------------------------------------------------------------------
311  */
312 
313  /*
314  * Fetch tuple at `tid` into `slot`, after doing a visibility test
315  * according to `snapshot`. If a tuple was found and passed the visibility
316  * test, returns true, false otherwise.
317  */
318  bool (*tuple_fetch_row_version) (Relation rel,
319  ItemPointer tid,
320  Snapshot snapshot,
321  TupleTableSlot *slot);
322 
323  /*
324  * Is tid valid for a scan of this relation.
325  */
326  bool (*tuple_tid_valid) (TableScanDesc scan,
327  ItemPointer tid);
328 
329  /*
330  * Return the latest version of the tuple at `tid`, by updating `tid` to
331  * point at the newest version.
332  */
333  void (*tuple_get_latest_tid) (TableScanDesc scan,
334  ItemPointer tid);
335 
336  /*
337  * Does the tuple in `slot` satisfy `snapshot`? The slot needs to be of
338  * the appropriate type for the AM.
339  */
340  bool (*tuple_satisfies_snapshot) (Relation rel,
341  TupleTableSlot *slot,
342  Snapshot snapshot);
343 
344  /* see table_compute_xid_horizon_for_tuples() */
345  TransactionId (*compute_xid_horizon_for_tuples) (Relation rel,
346  ItemPointerData *items,
347  int nitems);
348 
349 
350  /* ------------------------------------------------------------------------
351  * Manipulations of physical tuples.
352  * ------------------------------------------------------------------------
353  */
354 
355  /* see table_tuple_insert() for reference about parameters */
356  void (*tuple_insert) (Relation rel, TupleTableSlot *slot,
357  CommandId cid, int options,
358  struct BulkInsertStateData *bistate);
359 
360  /* see table_tuple_insert_speculative() for reference about parameters */
361  void (*tuple_insert_speculative) (Relation rel,
362  TupleTableSlot *slot,
363  CommandId cid,
364  int options,
365  struct BulkInsertStateData *bistate,
366  uint32 specToken);
367 
368  /* see table_tuple_complete_speculative() for reference about parameters */
369  void (*tuple_complete_speculative) (Relation rel,
370  TupleTableSlot *slot,
371  uint32 specToken,
372  bool succeeded);
373 
374  /* see table_multi_insert() for reference about parameters */
375  void (*multi_insert) (Relation rel, TupleTableSlot **slots, int nslots,
376  CommandId cid, int options, struct BulkInsertStateData *bistate);
377 
378  /* see table_tuple_delete() for reference about parameters */
379  TM_Result (*tuple_delete) (Relation rel,
380  ItemPointer tid,
381  CommandId cid,
382  Snapshot snapshot,
383  Snapshot crosscheck,
384  bool wait,
385  TM_FailureData *tmfd,
386  bool changingPart);
387 
388  /* see table_tuple_update() for reference about parameters */
389  TM_Result (*tuple_update) (Relation rel,
390  ItemPointer otid,
391  TupleTableSlot *slot,
392  CommandId cid,
393  Snapshot snapshot,
394  Snapshot crosscheck,
395  bool wait,
396  TM_FailureData *tmfd,
397  LockTupleMode *lockmode,
398  bool *update_indexes);
399 
400  /* see table_tuple_lock() for reference about parameters */
401  TM_Result (*tuple_lock) (Relation rel,
402  ItemPointer tid,
403  Snapshot snapshot,
404  TupleTableSlot *slot,
405  CommandId cid,
407  LockWaitPolicy wait_policy,
408  uint8 flags,
409  TM_FailureData *tmfd);
410 
411  /*
412  * Perform operations necessary to complete insertions made via
413  * tuple_insert and multi_insert with a BulkInsertState specified. This
414  * may for example be used to flush the relation, when the
415  * TABLE_INSERT_SKIP_WAL option was used.
416  *
417  * Typically callers of tuple_insert and multi_insert will just pass all
418  * the flags that apply to them, and each AM has to decide which of them
419  * make sense for it, and then only take actions in finish_bulk_insert for
420  * those flags, and ignore others.
421  *
422  * Optional callback.
423  */
424  void (*finish_bulk_insert) (Relation rel, int options);
425 
426 
427  /* ------------------------------------------------------------------------
428  * DDL related functionality.
429  * ------------------------------------------------------------------------
430  */
431 
432  /*
433  * This callback needs to create a new relation filenode for `rel`, with
434  * appropriate durability behaviour for `persistence`.
435  *
436  * Note that only the subset of the relcache filled by
437  * RelationBuildLocalRelation() can be relied upon and that the relation's
438  * catalog entries will either not yet exist (new relation), or will still
439  * reference the old relfilenode.
440  *
441  * As output *freezeXid, *minmulti must be set to the values appropriate
442  * for pg_class.{relfrozenxid, relminmxid}. For AMs that don't need those
443  * fields to be filled they can be set to InvalidTransactionId and
444  * InvalidMultiXactId, respectively.
445  *
446  * See also table_relation_set_new_filenode().
447  */
448  void (*relation_set_new_filenode) (Relation rel,
449  const RelFileNode *newrnode,
450  char persistence,
451  TransactionId *freezeXid,
452  MultiXactId *minmulti);
453 
454  /*
455  * This callback needs to remove all contents from `rel`'s current
456  * relfilenode. No provisions for transactional behaviour need to be made.
457  * Often this can be implemented by truncating the underlying storage to
458  * its minimal size.
459  *
460  * See also table_relation_nontransactional_truncate().
461  */
462  void (*relation_nontransactional_truncate) (Relation rel);
463 
464  /*
465  * See table_relation_copy_data().
466  *
467  * This can typically be implemented by directly copying the underlying
468  * storage, unless it contains references to the tablespace internally.
469  */
470  void (*relation_copy_data) (Relation rel,
471  const RelFileNode *newrnode);
472 
473  /* See table_relation_copy_for_cluster() */
474  void (*relation_copy_for_cluster) (Relation NewTable,
475  Relation OldTable,
476  Relation OldIndex,
477  bool use_sort,
479  TransactionId *xid_cutoff,
480  MultiXactId *multi_cutoff,
481  double *num_tuples,
482  double *tups_vacuumed,
483  double *tups_recently_dead);
484 
485  /*
486  * React to VACUUM command on the relation. The VACUUM can be
487  * triggered by a user or by autovacuum. The specific actions
488  * performed by the AM will depend heavily on the individual AM.
489  *
490  * On entry a transaction is already established, and the relation is
491  * locked with a ShareUpdateExclusive lock.
492  *
493  * Note that neither VACUUM FULL (and CLUSTER), nor ANALYZE go through
494  * this routine, even if (for ANALYZE) it is part of the same VACUUM
495  * command.
496  *
497  * There probably, in the future, needs to be a separate callback to
498  * integrate with autovacuum's scheduling.
499  */
500  void (*relation_vacuum) (Relation onerel,
501  struct VacuumParams *params,
502  BufferAccessStrategy bstrategy);
503 
504  /*
505  * Prepare to analyze block `blockno` of `scan`. The scan has been started
506  * with table_beginscan_analyze(). See also
507  * table_scan_analyze_next_block().
508  *
509  * The callback may acquire resources like locks that are held until
510  * table_scan_analyze_next_tuple() returns false. It e.g. can make sense
511  * to hold a lock until all tuples on a block have been analyzed by
512  * scan_analyze_next_tuple.
513  *
514  * The callback can return false if the block is not suitable for
515  * sampling, e.g. because it's a metapage that could never contain tuples.
516  *
517  * XXX: This obviously is primarily suited for block-based AMs. It's not
518  * clear what a good interface for non block based AMs would be, so there
519  * isn't one yet.
520  */
521  bool (*scan_analyze_next_block) (TableScanDesc scan,
522  BlockNumber blockno,
523  BufferAccessStrategy bstrategy);
524 
525  /*
526  * See table_scan_analyze_next_tuple().
527  *
528  * Not every AM might have a meaningful concept of dead rows, in which
529  * case it's OK to not increment *deadrows - but note that that may
530  * influence autovacuum scheduling (see comment for relation_vacuum
531  * callback).
532  */
533  bool (*scan_analyze_next_tuple) (TableScanDesc scan,
535  double *liverows,
536  double *deadrows,
537  TupleTableSlot *slot);
538 
539  /* see table_index_build_range_scan for reference about parameters */
540  double (*index_build_range_scan) (Relation table_rel,
541  Relation index_rel,
542  struct IndexInfo *index_info,
543  bool allow_sync,
544  bool anyvisible,
545  bool progress,
546  BlockNumber start_blockno,
547  BlockNumber numblocks,
549  void *callback_state,
550  TableScanDesc scan);
551 
552  /* see table_index_validate_scan for reference about parameters */
553  void (*index_validate_scan) (Relation table_rel,
554  Relation index_rel,
555  struct IndexInfo *index_info,
556  Snapshot snapshot,
557  struct ValidateIndexState *state);
558 
559 
560  /* ------------------------------------------------------------------------
561  * Miscellaneous functions.
562  * ------------------------------------------------------------------------
563  */
564 
565  /*
566  * See table_relation_size().
567  *
568  * Note that currently a few callers use the MAIN_FORKNUM size to figure
569  * out the range of potentially interesting blocks (brin, analyze). It's
570  * probable that we'll need to revise the interface for those at some
571  * point.
572  */
573  uint64 (*relation_size) (Relation rel, ForkNumber forkNumber);
574 
575 
576  /*
577  * This callback should return true if the relation requires a TOAST table
578  * and false if it does not. It may wish to examine the relation's tuple
579  * descriptor before making a decision, but if it uses some other method
580  * of storing large values (or if it does not support them) it can simply
581  * return false.
582  */
583  bool (*relation_needs_toast_table) (Relation rel);
584 
585  /*
586  * This callback should return the OID of the table AM that implements
587  * TOAST tables for this AM. If the relation_needs_toast_table callback
588  * always returns false, this callback is not required.
589  */
590  Oid (*relation_toast_am) (Relation rel);
591 
592  /*
593  * This callback is invoked when detoasting a value stored in a toast
594  * table implemented by this AM. See table_relation_fetch_toast_slice()
595  * for more details.
596  */
597  void (*relation_fetch_toast_slice) (Relation toastrel, Oid valueid,
598  int32 attrsize,
599  int32 sliceoffset,
600  int32 slicelength,
601  struct varlena *result);
602 
603 
604  /* ------------------------------------------------------------------------
605  * Planner related functions.
606  * ------------------------------------------------------------------------
607  */
608 
609  /*
610  * See table_relation_estimate_size().
611  *
612  * While block oriented, it shouldn't be too hard for an AM that doesn't
613  * internally use blocks to convert into a usable representation.
614  *
615  * This differs from the relation_size callback by returning size
616  * estimates (both relation size and tuple count) for planning purposes,
617  * rather than returning a currently correct estimate.
618  */
619  void (*relation_estimate_size) (Relation rel, int32 *attr_widths,
620  BlockNumber *pages, double *tuples,
621  double *allvisfrac);
622 
623 
624  /* ------------------------------------------------------------------------
625  * Executor related functions.
626  * ------------------------------------------------------------------------
627  */
628 
629  /*
630  * Prepare to fetch / check / return tuples from `tbmres->blockno` as part
631  * of a bitmap table scan. `scan` was started via table_beginscan_bm().
632  * Return false if there are no tuples to be found on the page, true
633  * otherwise.
634  *
635  * This will typically read and pin the target block, and do the necessary
636  * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might
637  * make sense to perform tuple visibility checks at this time). For some
638  * AMs it will make more sense to do all the work referencing `tbmres`
639  * contents here, for others it might be better to defer more work to
640  * scan_bitmap_next_tuple.
641  *
642  * If `tbmres->blockno` is -1, this is a lossy scan and all visible tuples
643  * on the page have to be returned, otherwise the tuples at offsets in
644  * `tbmres->offsets` need to be returned.
645  *
646  * XXX: Currently this may only be implemented if the AM uses md.c as its
647  * storage manager, and uses ItemPointer->ip_blkid in a manner that maps
648  * blockids directly to the underlying storage. nodeBitmapHeapscan.c
649  * performs prefetching directly using that interface. This probably
650  * needs to be rectified at a later point.
651  *
652  * XXX: Currently this may only be implemented if the AM uses the
653  * visibilitymap, as nodeBitmapHeapscan.c unconditionally accesses it to
654  * perform prefetching. This probably needs to be rectified at a later
655  * point.
656  *
657  * Optional callback, but either both scan_bitmap_next_block and
658  * scan_bitmap_next_tuple need to exist, or neither.
659  */
660  bool (*scan_bitmap_next_block) (TableScanDesc scan,
661  struct TBMIterateResult *tbmres);
662 
663  /*
664  * Fetch the next tuple of a bitmap table scan into `slot` and return true
665  * if a visible tuple was found, false otherwise.
666  *
667  * For some AMs it will make more sense to do all the work referencing
668  * `tbmres` contents in scan_bitmap_next_block, for others it might be
669  * better to defer more work to this callback.
670  *
671  * Optional callback, but either both scan_bitmap_next_block and
672  * scan_bitmap_next_tuple need to exist, or neither.
673  */
674  bool (*scan_bitmap_next_tuple) (TableScanDesc scan,
675  struct TBMIterateResult *tbmres,
676  TupleTableSlot *slot);
677 
678  /*
679  * Prepare to fetch tuples from the next block in a sample scan. Return
680  * false if the sample scan is finished, true otherwise. `scan` was
681  * started via table_beginscan_sampling().
682  *
683  * Typically this will first determine the target block by calling the
684  * TsmRoutine's NextSampleBlock() callback if not NULL, or alternatively
685  * perform a sequential scan over all blocks. The determined block is
686  * then typically read and pinned.
687  *
688  * As the TsmRoutine interface is block based, a block needs to be passed
689  * to NextSampleBlock(). If that's not appropriate for an AM, it
690  * internally needs to perform mapping between the internal and a block
691  * based representation.
692  *
693  * Note that it's not acceptable to hold deadlock prone resources such as
694  * lwlocks until scan_sample_next_tuple() has exhausted the tuples on the
695  * block - the tuple is likely to be returned to an upper query node, and
696  * the next call could be off a long while. Holding buffer pins and such
697  * is obviously OK.
698  *
699  * Currently it is required to implement this interface, as there's no
700  * alternative way (contrary e.g. to bitmap scans) to implement sample
701  * scans. If infeasible to implement, the AM may raise an error.
702  */
703  bool (*scan_sample_next_block) (TableScanDesc scan,
704  struct SampleScanState *scanstate);
705 
706  /*
707  * This callback, only called after scan_sample_next_block has returned
708  * true, should determine the next tuple to be returned from the selected
709  * block using the TsmRoutine's NextSampleTuple() callback.
710  *
711  * The callback needs to perform visibility checks, and only return
712  * visible tuples. That obviously can mean calling NextSampleTuple()
713  * multiple times.
714  *
715  * The TsmRoutine interface assumes that there's a maximum offset on a
716  * given page, so if that doesn't apply to an AM, it needs to emulate that
717  * assumption somehow.
718  */
719  bool (*scan_sample_next_tuple) (TableScanDesc scan,
720  struct SampleScanState *scanstate,
721  TupleTableSlot *slot);
722 
724 
725 
726 /* ----------------------------------------------------------------------------
727  * Slot functions.
728  * ----------------------------------------------------------------------------
729  */
730 
731 /*
732  * Returns slot callbacks suitable for holding tuples of the appropriate type
733  * for the relation. Works for tables, views, foreign tables and partitioned
734  * tables.
735  */
737 
738 /*
739  * Returns slot using the callbacks returned by table_slot_callbacks(), and
740  * registers it on *reglist.
741  */
742 extern TupleTableSlot *table_slot_create(Relation rel, List **reglist);
743 
744 
745 /* ----------------------------------------------------------------------------
746  * Table scan functions.
747  * ----------------------------------------------------------------------------
748  */
749 
750 /*
751  * Start a scan of `rel`. Returned tuples pass a visibility test of
752  * `snapshot`, and if nkeys != 0, the results are filtered by those scan keys.
753  */
754 static inline TableScanDesc
756  int nkeys, struct ScanKeyData *key)
757 {
758  uint32 flags = SO_TYPE_SEQSCAN |
760 
761  return rel->rd_tableam->scan_begin(rel, snapshot, nkeys, key, NULL, flags);
762 }
763 
764 /*
765  * Like table_beginscan(), but for scanning catalog. It'll automatically use a
766  * snapshot appropriate for scanning catalog relations.
767  */
768 extern TableScanDesc table_beginscan_catalog(Relation rel, int nkeys,
769  struct ScanKeyData *key);
770 
771 /*
772  * Like table_beginscan(), but table_beginscan_strat() offers an extended API
773  * that lets the caller control whether a nondefault buffer access strategy
774  * can be used, and whether syncscan can be chosen (possibly resulting in the
775  * scan not starting from block zero). Both of these default to true with
776  * plain table_beginscan.
777  */
778 static inline TableScanDesc
780  int nkeys, struct ScanKeyData *key,
781  bool allow_strat, bool allow_sync)
782 {
784 
785  if (allow_strat)
786  flags |= SO_ALLOW_STRAT;
787  if (allow_sync)
788  flags |= SO_ALLOW_SYNC;
789 
790  return rel->rd_tableam->scan_begin(rel, snapshot, nkeys, key, NULL, flags);
791 }
792 
793 /*
794  * table_beginscan_bm is an alternative entry point for setting up a
795  * TableScanDesc for a bitmap heap scan. Although that scan technology is
796  * really quite unlike a standard seqscan, there is just enough commonality to
797  * make it worth using the same data structure.
798  */
799 static inline TableScanDesc
801  int nkeys, struct ScanKeyData *key)
802 {
804 
805  return rel->rd_tableam->scan_begin(rel, snapshot, nkeys, key, NULL, flags);
806 }
807 
808 /*
809  * table_beginscan_sampling is an alternative entry point for setting up a
810  * TableScanDesc for a TABLESAMPLE scan. As with bitmap scans, it's worth
811  * using the same data structure although the behavior is rather different.
812  * In addition to the options offered by table_beginscan_strat, this call
813  * also allows control of whether page-mode visibility checking is used.
814  */
815 static inline TableScanDesc
817  int nkeys, struct ScanKeyData *key,
818  bool allow_strat, bool allow_sync,
819  bool allow_pagemode)
820 {
821  uint32 flags = SO_TYPE_SAMPLESCAN;
822 
823  if (allow_strat)
824  flags |= SO_ALLOW_STRAT;
825  if (allow_sync)
826  flags |= SO_ALLOW_SYNC;
827  if (allow_pagemode)
828  flags |= SO_ALLOW_PAGEMODE;
829 
830  return rel->rd_tableam->scan_begin(rel, snapshot, nkeys, key, NULL, flags);
831 }
832 
833 /*
834  * table_beginscan_tid is an alternative entry point for setting up a
835  * TableScanDesc for a Tid scan. As with bitmap scans, it's worth using
836  * the same data structure although the behavior is rather different.
837  */
838 static inline TableScanDesc
840 {
841  uint32 flags = SO_TYPE_TIDSCAN;
842 
843  return rel->rd_tableam->scan_begin(rel, snapshot, 0, NULL, NULL, flags);
844 }
845 
846 /*
847  * table_beginscan_analyze is an alternative entry point for setting up a
848  * TableScanDesc for an ANALYZE scan. As with bitmap scans, it's worth using
849  * the same data structure although the behavior is rather different.
850  */
851 static inline TableScanDesc
853 {
854  uint32 flags = SO_TYPE_ANALYZE;
855 
856  return rel->rd_tableam->scan_begin(rel, NULL, 0, NULL, NULL, flags);
857 }
858 
859 /*
860  * End relation scan.
861  */
862 static inline void
864 {
865  scan->rs_rd->rd_tableam->scan_end(scan);
866 }
867 
868 /*
869  * Restart a relation scan.
870  */
871 static inline void
873  struct ScanKeyData *key)
874 {
875  scan->rs_rd->rd_tableam->scan_rescan(scan, key, false, false, false, false);
876 }
877 
878 /*
879  * Restart a relation scan after changing params.
880  *
881  * This call allows changing the buffer strategy, syncscan, and pagemode
882  * options before starting a fresh scan. Note that although the actual use of
883  * syncscan might change (effectively, enabling or disabling reporting), the
884  * previously selected startblock will be kept.
885  */
886 static inline void
888  bool allow_strat, bool allow_sync, bool allow_pagemode)
889 {
890  scan->rs_rd->rd_tableam->scan_rescan(scan, key, true,
891  allow_strat, allow_sync,
892  allow_pagemode);
893 }
894 
895 /*
896  * Update snapshot used by the scan.
897  */
898 extern void table_scan_update_snapshot(TableScanDesc scan, Snapshot snapshot);
899 
900 /*
901  * Return next tuple from `scan`, store in slot.
902  */
903 static inline bool
905 {
906  slot->tts_tableOid = RelationGetRelid(sscan->rs_rd);
907  return sscan->rs_rd->rd_tableam->scan_getnextslot(sscan, direction, slot);
908 }
909 
910 
911 /* ----------------------------------------------------------------------------
912  * Parallel table scan related functions.
913  * ----------------------------------------------------------------------------
914  */
915 
916 /*
917  * Estimate the size of shared memory needed for a parallel scan of this
918  * relation.
919  */
920 extern Size table_parallelscan_estimate(Relation rel, Snapshot snapshot);
921 
922 /*
923  * Initialize ParallelTableScanDesc for a parallel scan of this
924  * relation. `pscan` needs to be sized according to parallelscan_estimate()
925  * for the same relation. Call this just once in the leader process; then,
926  * individual workers attach via table_beginscan_parallel.
927  */
929  ParallelTableScanDesc pscan,
930  Snapshot snapshot);
931 
932 /*
933  * Begin a parallel scan. `pscan` needs to have been initialized with
934  * table_parallelscan_initialize(), for the same relation. The initialization
935  * does not need to have happened in this backend.
936  *
937  * Caller must hold a suitable lock on the relation.
938  */
940  ParallelTableScanDesc pscan);
941 
942 /*
943  * Restart a parallel scan. Call this in the leader process. Caller is
944  * responsible for making sure that all workers have finished the scan
945  * beforehand.
946  */
947 static inline void
949 {
950  rel->rd_tableam->parallelscan_reinitialize(rel, pscan);
951 }
952 
953 
954 /* ----------------------------------------------------------------------------
955  * Index scan related functions.
956  * ----------------------------------------------------------------------------
957  */
958 
959 /*
960  * Prepare to fetch tuples from the relation, as needed when fetching tuples
961  * for an index scan.
962  *
963  * Tuples for an index scan can then be fetched via table_index_fetch_tuple().
964  */
965 static inline IndexFetchTableData *
967 {
968  return rel->rd_tableam->index_fetch_begin(rel);
969 }
970 
971 /*
972  * Reset index fetch. Typically this will release cross index fetch resources
973  * held in IndexFetchTableData.
974  */
975 static inline void
977 {
978  scan->rel->rd_tableam->index_fetch_reset(scan);
979 }
980 
981 /*
982  * Release resources and deallocate index fetch.
983  */
984 static inline void
986 {
987  scan->rel->rd_tableam->index_fetch_end(scan);
988 }
989 
990 /*
991  * Fetches, as part of an index scan, tuple at `tid` into `slot`, after doing
992  * a visibility test according to `snapshot`. If a tuple was found and passed
993  * the visibility test, returns true, false otherwise.
994  *
995  * *call_again needs to be false on the first call to table_index_fetch_tuple() for
996  * a tid. If there potentially is another tuple matching the tid, *call_again
997  * will be set to true, signalling that table_index_fetch_tuple() should be called
998  * again for the same tid.
999  *
1000  * *all_dead, if all_dead is not NULL, will be set to true by
1001  * table_index_fetch_tuple() iff it is guaranteed that no backend needs to see
1002  * that tuple. Index AMs can use that to avoid returning that tid in future
1003  * searches.
1004  *
1005  * The difference between this function and table_fetch_row_version is that
1006  * this function returns the currently visible version of a row if the AM
1007  * supports storing multiple row versions reachable via a single index entry
1008  * (like heap's HOT). Whereas table_fetch_row_version only evaluates the
1009  * tuple exactly at `tid`. Outside of index entry ->table tuple lookups,
1010  * table_tuple_fetch_row_version is what's usually needed.
1011  */
1012 static inline bool
1014  ItemPointer tid,
1015  Snapshot snapshot,
1016  TupleTableSlot *slot,
1017  bool *call_again, bool *all_dead)
1018 {
1019 
1020  return scan->rel->rd_tableam->index_fetch_tuple(scan, tid, snapshot,
1021  slot, call_again,
1022  all_dead);
1023 }
1024 
1025 /*
1026  * This is a convenience wrapper around table_index_fetch_tuple() which
1027  * returns whether there are table tuple items corresponding to an index
1028  * entry. This likely is only useful to verify if there's a conflict in a
1029  * unique index.
1030  */
1031 extern bool table_index_fetch_tuple_check(Relation rel,
1032  ItemPointer tid,
1033  Snapshot snapshot,
1034  bool *all_dead);
1035 
1036 
1037 /* ------------------------------------------------------------------------
1038  * Functions for non-modifying operations on individual tuples
1039  * ------------------------------------------------------------------------
1040  */
1041 
1042 
1043 /*
1044  * Fetch tuple at `tid` into `slot`, after doing a visibility test according to
1045  * `snapshot`. If a tuple was found and passed the visibility test, returns
1046  * true, false otherwise.
1047  *
1048  * See table_index_fetch_tuple's comment about what the difference between
1049  * these functions is. It is correct to use this function outside of index
1050  * entry->table tuple lookups.
1051  */
1052 static inline bool
1054  ItemPointer tid,
1055  Snapshot snapshot,
1056  TupleTableSlot *slot)
1057 {
1058  return rel->rd_tableam->tuple_fetch_row_version(rel, tid, snapshot, slot);
1059 }
1060 
1061 /*
1062  * Verify that `tid` is a potentially valid tuple identifier. That doesn't
1063  * mean that the pointed to row needs to exist or be visible, but that
1064  * attempting to fetch the row (e.g. with table_get_latest_tid() or
1065  * table_fetch_row_version()) should not error out if called with that tid.
1066  *
1067  * `scan` needs to have been started via table_beginscan().
1068  */
1069 static inline bool
1071 {
1072  return scan->rs_rd->rd_tableam->tuple_tid_valid(scan, tid);
1073 }
1074 
1075 /*
1076  * Return the latest version of the tuple at `tid`, by updating `tid` to
1077  * point at the newest version.
1078  */
1080 
1081 /*
1082  * Return true iff tuple in slot satisfies the snapshot.
1083  *
1084  * This assumes the slot's tuple is valid, and of the appropriate type for the
1085  * AM.
1086  *
1087  * Some AMs might modify the data underlying the tuple as a side-effect. If so
1088  * they ought to mark the relevant buffer dirty.
1089  */
1090 static inline bool
1092  Snapshot snapshot)
1093 {
1094  return rel->rd_tableam->tuple_satisfies_snapshot(rel, slot, snapshot);
1095 }
1096 
1097 /*
1098  * Compute the newest xid among the tuples pointed to by items. This is used
1099  * to compute what snapshots to conflict with when replaying WAL records for
1100  * page-level index vacuums.
1101  */
1102 static inline TransactionId
1104  ItemPointerData *items,
1105  int nitems)
1106 {
1107  return rel->rd_tableam->compute_xid_horizon_for_tuples(rel, items, nitems);
1108 }
1109 
1110 
1111 /* ----------------------------------------------------------------------------
1112  * Functions for manipulations of physical tuples.
1113  * ----------------------------------------------------------------------------
1114  */
1115 
1116 /*
1117  * Insert a tuple from a slot into table AM routine.
1118  *
1119  * The options bitmask allows the caller to specify options that may change the
1120  * behaviour of the AM. The AM will ignore options that it does not support.
1121  *
1122  * If the TABLE_INSERT_SKIP_WAL option is specified, the new tuple doesn't
1123  * need to be logged to WAL, even for a non-temp relation. It is the AMs
1124  * choice whether this optimization is supported.
1125  *
1126  * If the TABLE_INSERT_SKIP_FSM option is specified, AMs are free to not reuse
1127  * free space in the relation. This can save some cycles when we know the
1128  * relation is new and doesn't contain useful amounts of free space.
1129  * TABLE_INSERT_SKIP_FSM is commonly passed directly to
1130  * RelationGetBufferForTuple. See that method for more information.
1131  *
1132  * TABLE_INSERT_FROZEN should only be specified for inserts into
1133  * relfilenodes created during the current subtransaction and when
1134  * there are no prior snapshots or pre-existing portals open.
1135  * This causes rows to be frozen, which is an MVCC violation and
1136  * requires explicit options chosen by user.
1137  *
1138  * TABLE_INSERT_NO_LOGICAL force-disables the emitting of logical decoding
1139  * information for the tuple. This should solely be used during table rewrites
1140  * where RelationIsLogicallyLogged(relation) is not yet accurate for the new
1141  * relation.
1142  *
1143  * Note that most of these options will be applied when inserting into the
1144  * heap's TOAST table, too, if the tuple requires any out-of-line data.
1145  *
1146  * The BulkInsertState object (if any; bistate can be NULL for default
1147  * behavior) is also just passed through to RelationGetBufferForTuple. If
1148  * `bistate` is provided, table_finish_bulk_insert() needs to be called.
1149  *
1150  * On return the slot's tts_tid and tts_tableOid are updated to reflect the
1151  * insertion. But note that any toasting of fields within the slot is NOT
1152  * reflected in the slots contents.
1153  */
1154 static inline void
1156  int options, struct BulkInsertStateData *bistate)
1157 {
1158  rel->rd_tableam->tuple_insert(rel, slot, cid, options,
1159  bistate);
1160 }
1161 
1162 /*
1163  * Perform a "speculative insertion". These can be backed out afterwards
1164  * without aborting the whole transaction. Other sessions can wait for the
1165  * speculative insertion to be confirmed, turning it into a regular tuple, or
1166  * aborted, as if it never existed. Speculatively inserted tuples behave as
1167  * "value locks" of short duration, used to implement INSERT .. ON CONFLICT.
1168  *
1169  * A transaction having performed a speculative insertion has to either abort,
1170  * or finish the speculative insertion with
1171  * table_tuple_complete_speculative(succeeded = ...).
1172  */
1173 static inline void
1175  CommandId cid, int options,
1176  struct BulkInsertStateData *bistate,
1177  uint32 specToken)
1178 {
1179  rel->rd_tableam->tuple_insert_speculative(rel, slot, cid, options,
1180  bistate, specToken);
1181 }
1182 
1183 /*
1184  * Complete "speculative insertion" started in the same transaction. If
1185  * succeeded is true, the tuple is fully inserted, if false, it's removed.
1186  */
1187 static inline void
1189  uint32 specToken, bool succeeded)
1190 {
1191  rel->rd_tableam->tuple_complete_speculative(rel, slot, specToken,
1192  succeeded);
1193 }
1194 
1195 /*
1196  * Insert multiple tuples into a table.
1197  *
1198  * This is like table_insert(), but inserts multiple tuples in one
1199  * operation. That's often faster than calling table_insert() in a loop,
1200  * because e.g. the AM can reduce WAL logging and page locking overhead.
1201  *
1202  * Except for taking `nslots` tuples as input, and an array of TupleTableSlots
1203  * in `slots`, the parameters for table_multi_insert() are the same as for
1204  * table_tuple_insert().
1205  *
1206  * Note: this leaks memory into the current memory context. You can create a
1207  * temporary context before calling this, if that's a problem.
1208  */
1209 static inline void
1210 table_multi_insert(Relation rel, TupleTableSlot **slots, int nslots,
1211  CommandId cid, int options, struct BulkInsertStateData *bistate)
1212 {
1213  rel->rd_tableam->multi_insert(rel, slots, nslots,
1214  cid, options, bistate);
1215 }
1216 
1217 /*
1218  * Delete a tuple.
1219  *
1220  * NB: do not call this directly unless prepared to deal with
1221  * concurrent-update conditions. Use simple_table_tuple_delete instead.
1222  *
1223  * Input parameters:
1224  * relation - table to be modified (caller must hold suitable lock)
1225  * tid - TID of tuple to be deleted
1226  * cid - delete command ID (used for visibility test, and stored into
1227  * cmax if successful)
1228  * crosscheck - if not InvalidSnapshot, also check tuple against this
1229  * wait - true if should wait for any conflicting update to commit/abort
1230  * Output parameters:
1231  * tmfd - filled in failure cases (see below)
1232  * changingPart - true iff the tuple is being moved to another partition
1233  * table due to an update of the partition key. Otherwise, false.
1234  *
1235  * Normal, successful return value is TM_Ok, which means we did actually
1236  * delete it. Failure return codes are TM_SelfModified, TM_Updated, and
1237  * TM_BeingModified (the last only possible if wait == false).
1238  *
1239  * In the failure cases, the routine fills *tmfd with the tuple's t_ctid,
1240  * t_xmax, and, if possible, and, if possible, t_cmax. See comments for
1241  * struct TM_FailureData for additional info.
1242  */
1243 static inline TM_Result
1245  Snapshot snapshot, Snapshot crosscheck, bool wait,
1246  TM_FailureData *tmfd, bool changingPart)
1247 {
1248  return rel->rd_tableam->tuple_delete(rel, tid, cid,
1249  snapshot, crosscheck,
1250  wait, tmfd, changingPart);
1251 }
1252 
1253 /*
1254  * Update a tuple.
1255  *
1256  * NB: do not call this directly unless you are prepared to deal with
1257  * concurrent-update conditions. Use simple_table_tuple_update instead.
1258  *
1259  * Input parameters:
1260  * relation - table to be modified (caller must hold suitable lock)
1261  * otid - TID of old tuple to be replaced
1262  * slot - newly constructed tuple data to store
1263  * cid - update command ID (used for visibility test, and stored into
1264  * cmax/cmin if successful)
1265  * crosscheck - if not InvalidSnapshot, also check old tuple against this
1266  * wait - true if should wait for any conflicting update to commit/abort
1267  * Output parameters:
1268  * tmfd - filled in failure cases (see below)
1269  * lockmode - filled with lock mode acquired on tuple
1270  * update_indexes - in success cases this is set to true if new index entries
1271  * are required for this tuple
1272  *
1273  * Normal, successful return value is TM_Ok, which means we did actually
1274  * update it. Failure return codes are TM_SelfModified, TM_Updated, and
1275  * TM_BeingModified (the last only possible if wait == false).
1276  *
1277  * On success, the slot's tts_tid and tts_tableOid are updated to match the new
1278  * stored tuple; in particular, slot->tts_tid is set to the TID where the
1279  * new tuple was inserted, and its HEAP_ONLY_TUPLE flag is set iff a HOT
1280  * update was done. However, any TOAST changes in the new tuple's
1281  * data are not reflected into *newtup.
1282  *
1283  * In the failure cases, the routine fills *tmfd with the tuple's t_ctid,
1284  * t_xmax, and, if possible, t_cmax. See comments for struct TM_FailureData
1285  * for additional info.
1286  */
1287 static inline TM_Result
1289  CommandId cid, Snapshot snapshot, Snapshot crosscheck,
1290  bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode,
1291  bool *update_indexes)
1292 {
1293  return rel->rd_tableam->tuple_update(rel, otid, slot,
1294  cid, snapshot, crosscheck,
1295  wait, tmfd,
1296  lockmode, update_indexes);
1297 }
1298 
1299 /*
1300  * Lock a tuple in the specified mode.
1301  *
1302  * Input parameters:
1303  * relation: relation containing tuple (caller must hold suitable lock)
1304  * tid: TID of tuple to lock
1305  * snapshot: snapshot to use for visibility determinations
1306  * cid: current command ID (used for visibility test, and stored into
1307  * tuple's cmax if lock is successful)
1308  * mode: lock mode desired
1309  * wait_policy: what to do if tuple lock is not available
1310  * flags:
1311  * If TUPLE_LOCK_FLAG_LOCK_UPDATE_IN_PROGRESS, follow the update chain to
1312  * also lock descendant tuples if lock modes don't conflict.
1313  * If TUPLE_LOCK_FLAG_FIND_LAST_VERSION, follow the update chain and lock
1314  * latest version.
1315  *
1316  * Output parameters:
1317  * *slot: contains the target tuple
1318  * *tmfd: filled in failure cases (see below)
1319  *
1320  * Function result may be:
1321  * TM_Ok: lock was successfully acquired
1322  * TM_Invisible: lock failed because tuple was never visible to us
1323  * TM_SelfModified: lock failed because tuple updated by self
1324  * TM_Updated: lock failed because tuple updated by other xact
1325  * TM_Deleted: lock failed because tuple deleted by other xact
1326  * TM_WouldBlock: lock couldn't be acquired and wait_policy is skip
1327  *
1328  * In the failure cases other than TM_Invisible and TM_Deleted, the routine
1329  * fills *tmfd with the tuple's t_ctid, t_xmax, and, if possible, t_cmax. See
1330  * comments for struct TM_FailureData for additional info.
1331  */
1332 static inline TM_Result
1335  LockWaitPolicy wait_policy, uint8 flags,
1336  TM_FailureData *tmfd)
1337 {
1338  return rel->rd_tableam->tuple_lock(rel, tid, snapshot, slot,
1339  cid, mode, wait_policy,
1340  flags, tmfd);
1341 }
1342 
1343 /*
1344  * Perform operations necessary to complete insertions made via
1345  * tuple_insert and multi_insert with a BulkInsertState specified. This
1346  * e.g. may e.g. used to flush the relation when inserting with
1347  * TABLE_INSERT_SKIP_WAL specified.
1348  */
1349 static inline void
1351 {
1352  /* optional callback */
1353  if (rel->rd_tableam && rel->rd_tableam->finish_bulk_insert)
1354  rel->rd_tableam->finish_bulk_insert(rel, options);
1355 }
1356 
1357 
1358 /* ------------------------------------------------------------------------
1359  * DDL related functionality.
1360  * ------------------------------------------------------------------------
1361  */
1362 
1363 /*
1364  * Create storage for `rel` in `newrnode`, with persistence set to
1365  * `persistence`.
1366  *
1367  * This is used both during relation creation and various DDL operations to
1368  * create a new relfilenode that can be filled from scratch. When creating
1369  * new storage for an existing relfilenode, this should be called before the
1370  * relcache entry has been updated.
1371  *
1372  * *freezeXid, *minmulti are set to the xid / multixact horizon for the table
1373  * that pg_class.{relfrozenxid, relminmxid} have to be set to.
1374  */
1375 static inline void
1377  const RelFileNode *newrnode,
1378  char persistence,
1379  TransactionId *freezeXid,
1380  MultiXactId *minmulti)
1381 {
1382  rel->rd_tableam->relation_set_new_filenode(rel, newrnode, persistence,
1383  freezeXid, minmulti);
1384 }
1385 
1386 /*
1387  * Remove all table contents from `rel`, in a non-transactional manner.
1388  * Non-transactional meaning that there's no need to support rollbacks. This
1389  * commonly only is used to perform truncations for relfilenodes created in the
1390  * current transaction.
1391  */
1392 static inline void
1394 {
1396 }
1397 
1398 /*
1399  * Copy data from `rel` into the new relfilenode `newrnode`. The new
1400  * relfilenode may not have storage associated before this function is
1401  * called. This is only supposed to be used for low level operations like
1402  * changing a relation's tablespace.
1403  */
1404 static inline void
1406 {
1407  rel->rd_tableam->relation_copy_data(rel, newrnode);
1408 }
1409 
1410 /*
1411  * Copy data from `OldTable` into `NewTable`, as part of a CLUSTER or VACUUM
1412  * FULL.
1413  *
1414  * Additional Input parameters:
1415  * - use_sort - if true, the table contents are sorted appropriate for
1416  * `OldIndex`; if false and OldIndex is not InvalidOid, the data is copied
1417  * in that index's order; if false and OldIndex is InvalidOid, no sorting is
1418  * performed
1419  * - OldIndex - see use_sort
1420  * - OldestXmin - computed by vacuum_set_xid_limits(), even when
1421  * not needed for the relation's AM
1422  * - *xid_cutoff - ditto
1423  * - *multi_cutoff - ditto
1424  *
1425  * Output parameters:
1426  * - *xid_cutoff - rel's new relfrozenxid value, may be invalid
1427  * - *multi_cutoff - rel's new relminmxid value, may be invalid
1428  * - *tups_vacuumed - stats, for logging, if appropriate for AM
1429  * - *tups_recently_dead - stats, for logging, if appropriate for AM
1430  */
1431 static inline void
1433  Relation OldIndex,
1434  bool use_sort,
1436  TransactionId *xid_cutoff,
1437  MultiXactId *multi_cutoff,
1438  double *num_tuples,
1439  double *tups_vacuumed,
1440  double *tups_recently_dead)
1441 {
1442  OldTable->rd_tableam->relation_copy_for_cluster(OldTable, NewTable, OldIndex,
1443  use_sort, OldestXmin,
1444  xid_cutoff, multi_cutoff,
1445  num_tuples, tups_vacuumed,
1446  tups_recently_dead);
1447 }
1448 
1449 /*
1450  * Perform VACUUM on the relation. The VACUUM can be triggered by a user or by
1451  * autovacuum. The specific actions performed by the AM will depend heavily on
1452  * the individual AM.
1453  *
1454  * On entry a transaction needs to already been established, and the
1455  * table is locked with a ShareUpdateExclusive lock.
1456  *
1457  * Note that neither VACUUM FULL (and CLUSTER), nor ANALYZE go through this
1458  * routine, even if (for ANALYZE) it is part of the same VACUUM command.
1459  */
1460 static inline void
1462  BufferAccessStrategy bstrategy)
1463 {
1464  rel->rd_tableam->relation_vacuum(rel, params, bstrategy);
1465 }
1466 
1467 /*
1468  * Prepare to analyze block `blockno` of `scan`. The scan needs to have been
1469  * started with table_beginscan_analyze(). Note that this routine might
1470  * acquire resources like locks that are held until
1471  * table_scan_analyze_next_tuple() returns false.
1472  *
1473  * Returns false if block is unsuitable for sampling, true otherwise.
1474  */
1475 static inline bool
1477  BufferAccessStrategy bstrategy)
1478 {
1479  return scan->rs_rd->rd_tableam->scan_analyze_next_block(scan, blockno,
1480  bstrategy);
1481 }
1482 
1483 /*
1484  * Iterate over tuples in the block selected with
1485  * table_scan_analyze_next_block() (which needs to have returned true, and
1486  * this routine may not have returned false for the same block before). If a
1487  * tuple that's suitable for sampling is found, true is returned and a tuple
1488  * is stored in `slot`.
1489  *
1490  * *liverows and *deadrows are incremented according to the encountered
1491  * tuples.
1492  */
1493 static inline bool
1495  double *liverows, double *deadrows,
1496  TupleTableSlot *slot)
1497 {
1498  return scan->rs_rd->rd_tableam->scan_analyze_next_tuple(scan, OldestXmin,
1499  liverows, deadrows,
1500  slot);
1501 }
1502 
1503 /*
1504  * table_index_build_scan - scan the table to find tuples to be indexed
1505  *
1506  * This is called back from an access-method-specific index build procedure
1507  * after the AM has done whatever setup it needs. The parent table relation
1508  * is scanned to find tuples that should be entered into the index. Each
1509  * such tuple is passed to the AM's callback routine, which does the right
1510  * things to add it to the new index. After we return, the AM's index
1511  * build procedure does whatever cleanup it needs.
1512  *
1513  * The total count of live tuples is returned. This is for updating pg_class
1514  * statistics. (It's annoying not to be able to do that here, but we want to
1515  * merge that update with others; see index_update_stats.) Note that the
1516  * index AM itself must keep track of the number of index tuples; we don't do
1517  * so here because the AM might reject some of the tuples for its own reasons,
1518  * such as being unable to store NULLs.
1519  *
1520  * If 'progress', the PROGRESS_SCAN_BLOCKS_TOTAL counter is updated when
1521  * starting the scan, and PROGRESS_SCAN_BLOCKS_DONE is updated as we go along.
1522  *
1523  * A side effect is to set indexInfo->ii_BrokenHotChain to true if we detect
1524  * any potentially broken HOT chains. Currently, we set this if there are any
1525  * RECENTLY_DEAD or DELETE_IN_PROGRESS entries in a HOT chain, without trying
1526  * very hard to detect whether they're really incompatible with the chain tip.
1527  * This only really makes sense for heap AM, it might need to be generalized
1528  * for other AMs later.
1529  */
1530 static inline double
1532  Relation index_rel,
1533  struct IndexInfo *index_info,
1534  bool allow_sync,
1535  bool progress,
1537  void *callback_state,
1538  TableScanDesc scan)
1539 {
1540  return table_rel->rd_tableam->index_build_range_scan(table_rel,
1541  index_rel,
1542  index_info,
1543  allow_sync,
1544  false,
1545  progress,
1546  0,
1548  callback,
1549  callback_state,
1550  scan);
1551 }
1552 
1553 /*
1554  * As table_index_build_scan(), except that instead of scanning the complete
1555  * table, only the given number of blocks are scanned. Scan to end-of-rel can
1556  * be signalled by passing InvalidBlockNumber as numblocks. Note that
1557  * restricting the range to scan cannot be done when requesting syncscan.
1558  *
1559  * When "anyvisible" mode is requested, all tuples visible to any transaction
1560  * are indexed and counted as live, including those inserted or deleted by
1561  * transactions that are still in progress.
1562  */
1563 static inline double
1565  Relation index_rel,
1566  struct IndexInfo *index_info,
1567  bool allow_sync,
1568  bool anyvisible,
1569  bool progress,
1570  BlockNumber start_blockno,
1571  BlockNumber numblocks,
1573  void *callback_state,
1574  TableScanDesc scan)
1575 {
1576  return table_rel->rd_tableam->index_build_range_scan(table_rel,
1577  index_rel,
1578  index_info,
1579  allow_sync,
1580  anyvisible,
1581  progress,
1582  start_blockno,
1583  numblocks,
1584  callback,
1585  callback_state,
1586  scan);
1587 }
1588 
1589 /*
1590  * table_index_validate_scan - second table scan for concurrent index build
1591  *
1592  * See validate_index() for an explanation.
1593  */
1594 static inline void
1596  Relation index_rel,
1597  struct IndexInfo *index_info,
1598  Snapshot snapshot,
1599  struct ValidateIndexState *state)
1600 {
1601  table_rel->rd_tableam->index_validate_scan(table_rel,
1602  index_rel,
1603  index_info,
1604  snapshot,
1605  state);
1606 }
1607 
1608 
1609 /* ----------------------------------------------------------------------------
1610  * Miscellaneous functionality
1611  * ----------------------------------------------------------------------------
1612  */
1613 
1614 /*
1615  * Return the current size of `rel` in bytes. If `forkNumber` is
1616  * InvalidForkNumber, return the relation's overall size, otherwise the size
1617  * for the indicated fork.
1618  *
1619  * Note that the overall size might not be the equivalent of the sum of sizes
1620  * for the individual forks for some AMs, e.g. because the AMs storage does
1621  * not neatly map onto the builtin types of forks.
1622  */
1623 static inline uint64
1625 {
1626  return rel->rd_tableam->relation_size(rel, forkNumber);
1627 }
1628 
1629 /*
1630  * table_relation_needs_toast_table - does this relation need a toast table?
1631  */
1632 static inline bool
1634 {
1635  return rel->rd_tableam->relation_needs_toast_table(rel);
1636 }
1637 
1638 /*
1639  * Return the OID of the AM that should be used to implement the TOAST table
1640  * for this relation.
1641  */
1642 static inline Oid
1644 {
1645  return rel->rd_tableam->relation_toast_am(rel);
1646 }
1647 
1648 /*
1649  * Fetch all or part of a TOAST value from a TOAST table.
1650  *
1651  * If this AM is never used to implement a TOAST table, then this callback
1652  * is not needed. But, if toasted values are ever stored in a table of this
1653  * type, then you will need this callback.
1654  *
1655  * toastrel is the relation in which the toasted value is stored.
1656  *
1657  * valueid identifes which toast value is to be fetched. For the heap,
1658  * this corresponds to the values stored in the chunk_id column.
1659  *
1660  * attrsize is the total size of the toast value to be fetched.
1661  *
1662  * sliceoffset is the offset within the toast value of the first byte that
1663  * should be fetched.
1664  *
1665  * slicelength is the number of bytes from the toast value that should be
1666  * fetched.
1667  *
1668  * result is caller-allocated space into which the fetched bytes should be
1669  * stored.
1670  */
1671 static inline void
1673  int32 attrsize, int32 sliceoffset,
1674  int32 slicelength, struct varlena *result)
1675 {
1676  toastrel->rd_tableam->relation_fetch_toast_slice(toastrel, valueid,
1677  attrsize,
1678  sliceoffset, slicelength,
1679  result);
1680 }
1681 
1682 
1683 /* ----------------------------------------------------------------------------
1684  * Planner related functionality
1685  * ----------------------------------------------------------------------------
1686  */
1687 
1688 /*
1689  * Estimate the current size of the relation, as an AM specific workhorse for
1690  * estimate_rel_size(). Look there for an explanation of the parameters.
1691  */
1692 static inline void
1694  BlockNumber *pages, double *tuples,
1695  double *allvisfrac)
1696 {
1697  rel->rd_tableam->relation_estimate_size(rel, attr_widths, pages, tuples,
1698  allvisfrac);
1699 }
1700 
1701 
1702 /* ----------------------------------------------------------------------------
1703  * Executor related functionality
1704  * ----------------------------------------------------------------------------
1705  */
1706 
1707 /*
1708  * Prepare to fetch / check / return tuples from `tbmres->blockno` as part of
1709  * a bitmap table scan. `scan` needs to have been started via
1710  * table_beginscan_bm(). Returns false if there are no tuples to be found on
1711  * the page, true otherwise.
1712  *
1713  * Note, this is an optionally implemented function, therefore should only be
1714  * used after verifying the presence (at plan time or such).
1715  */
1716 static inline bool
1718  struct TBMIterateResult *tbmres)
1719 {
1720  return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan,
1721  tbmres);
1722 }
1723 
1724 /*
1725  * Fetch the next tuple of a bitmap table scan into `slot` and return true if
1726  * a visible tuple was found, false otherwise.
1727  * table_scan_bitmap_next_block() needs to previously have selected a
1728  * block (i.e. returned true), and no previous
1729  * table_scan_bitmap_next_tuple() for the same block may have
1730  * returned false.
1731  */
1732 static inline bool
1734  struct TBMIterateResult *tbmres,
1735  TupleTableSlot *slot)
1736 {
1737  return scan->rs_rd->rd_tableam->scan_bitmap_next_tuple(scan,
1738  tbmres,
1739  slot);
1740 }
1741 
1742 /*
1743  * Prepare to fetch tuples from the next block in a sample scan. Returns false
1744  * if the sample scan is finished, true otherwise. `scan` needs to have been
1745  * started via table_beginscan_sampling().
1746  *
1747  * This will call the TsmRoutine's NextSampleBlock() callback if necessary
1748  * (i.e. NextSampleBlock is not NULL), or perform a sequential scan over the
1749  * underlying relation.
1750  */
1751 static inline bool
1753  struct SampleScanState *scanstate)
1754 {
1755  return scan->rs_rd->rd_tableam->scan_sample_next_block(scan, scanstate);
1756 }
1757 
1758 /*
1759  * Fetch the next sample tuple into `slot` and return true if a visible tuple
1760  * was found, false otherwise. table_scan_sample_next_block() needs to
1761  * previously have selected a block (i.e. returned true), and no previous
1762  * table_scan_sample_next_tuple() for the same block may have returned false.
1763  *
1764  * This will call the TsmRoutine's NextSampleTuple() callback.
1765  */
1766 static inline bool
1768  struct SampleScanState *scanstate,
1769  TupleTableSlot *slot)
1770 {
1771  return scan->rs_rd->rd_tableam->scan_sample_next_tuple(scan, scanstate,
1772  slot);
1773 }
1774 
1775 
1776 /* ----------------------------------------------------------------------------
1777  * Functions to make modifications a bit simpler.
1778  * ----------------------------------------------------------------------------
1779  */
1780 
1781 extern void simple_table_tuple_insert(Relation rel, TupleTableSlot *slot);
1782 extern void simple_table_tuple_delete(Relation rel, ItemPointer tid,
1783  Snapshot snapshot);
1784 extern void simple_table_tuple_update(Relation rel, ItemPointer otid,
1785  TupleTableSlot *slot, Snapshot snapshot,
1786  bool *update_indexes);
1787 
1788 
1789 /* ----------------------------------------------------------------------------
1790  * Helper functions to implement parallel scans for block oriented AMs.
1791  * ----------------------------------------------------------------------------
1792  */
1793 
1796  ParallelTableScanDesc pscan);
1798  ParallelTableScanDesc pscan);
1803 
1804 
1805 /* ----------------------------------------------------------------------------
1806  * Helper functions to implement relation sizing for block oriented AMs.
1807  * ----------------------------------------------------------------------------
1808  */
1809 
1810 extern uint64 table_block_relation_size(Relation rel, ForkNumber forkNumber);
1812  int32 *attr_widths,
1813  BlockNumber *pages,
1814  double *tuples,
1815  double *allvisfrac,
1816  Size overhead_bytes_per_tuple,
1817  Size usable_bytes_per_page);
1818 
1819 /* ----------------------------------------------------------------------------
1820  * Functions in tableamapi.c
1821  * ----------------------------------------------------------------------------
1822  */
1823 
1824 extern const TableAmRoutine *GetTableAmRoutine(Oid amhandler);
1825 extern const TableAmRoutine *GetHeapamTableAmRoutine(void);
1826 extern bool check_default_table_access_method(char **newval, void **extra,
1827  GucSource source);
1828 
1829 #endif /* TABLEAM_H */
bool(* scan_getnextslot)(TableScanDesc scan, ScanDirection direction, TupleTableSlot *slot)
Definition: tableam.h:223
void(* relation_estimate_size)(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, double *allvisfrac)
Definition: tableam.h:619
Oid tts_tableOid
Definition: tuptable.h:131
uint32 CommandId
Definition: c.h:527
ItemPointerData ctid
Definition: tableam.h:124
static bool table_scan_bitmap_next_tuple(TableScanDesc scan, struct TBMIterateResult *tbmres, TupleTableSlot *slot)
Definition: tableam.h:1733
static void table_relation_estimate_size(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, double *allvisfrac)
Definition: tableam.h:1693
static PgChecksumMode mode
Definition: pg_checksums.c:61
Oid(* relation_toast_am)(Relation rel)
Definition: tableam.h:590
LockTupleMode
Definition: lockoptions.h:49
ScanOptions
Definition: tableam.h:44
NodeTag type
Definition: tableam.h:165
static void table_relation_copy_data(Relation rel, const RelFileNode *newrnode)
Definition: tableam.h:1405
TM_Result(* tuple_update)(Relation rel, ItemPointer otid, TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck, bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode, bool *update_indexes)
Definition: tableam.h:389
void table_tuple_get_latest_tid(TableScanDesc scan, ItemPointer tid)
Definition: tableam.c:228
void table_parallelscan_initialize(Relation rel, ParallelTableScanDesc pscan, Snapshot snapshot)
Definition: tableam.c:141
uint32 TransactionId
Definition: c.h:513
Size table_block_parallelscan_initialize(Relation rel, ParallelTableScanDesc pscan)
Definition: tableam.c:374
Size table_block_parallelscan_estimate(Relation rel)
Definition: tableam.c:368
struct TableAmRoutine TableAmRoutine
struct IndexFetchTableData *(* index_fetch_begin)(Relation rel)
Definition: tableam.h:268
void(* index_fetch_reset)(struct IndexFetchTableData *data)
Definition: tableam.h:274
void table_block_parallelscan_reinitialize(Relation rel, ParallelTableScanDesc pscan)
Definition: tableam.c:392
void(* scan_end)(TableScanDesc scan)
Definition: tableam.h:210
bool(* scan_sample_next_block)(TableScanDesc scan, struct SampleScanState *scanstate)
Definition: tableam.h:703
uint64(* relation_size)(Relation rel, ForkNumber forkNumber)
Definition: tableam.h:573
static void table_relation_fetch_toast_slice(Relation toastrel, Oid valueid, int32 attrsize, int32 sliceoffset, int32 slicelength, struct varlena *result)
Definition: tableam.h:1672
char * default_table_access_method
Definition: tableam.c:34
CommandId cmax
Definition: tableam.h:126
double(* index_build_range_scan)(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, bool allow_sync, bool anyvisible, bool progress, BlockNumber start_blockno, BlockNumber numblocks, IndexBuildCallback callback, void *callback_state, TableScanDesc scan)
Definition: tableam.h:540
unsigned char uint8
Definition: c.h:365
static void table_relation_vacuum(Relation rel, struct VacuumParams *params, BufferAccessStrategy bstrategy)
Definition: tableam.h:1461
static IndexFetchTableData * table_index_fetch_begin(Relation rel)
Definition: tableam.h:966
void(* index_validate_scan)(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, Snapshot snapshot, struct ValidateIndexState *state)
Definition: tableam.h:553
static void table_finish_bulk_insert(Relation rel, int options)
Definition: tableam.h:1350
static bool table_scan_sample_next_block(TableScanDesc scan, struct SampleScanState *scanstate)
Definition: tableam.h:1752
uint32 BlockNumber
Definition: block.h:31
static TableScanDesc table_beginscan_sampling(Relation rel, Snapshot snapshot, int nkeys, struct ScanKeyData *key, bool allow_strat, bool allow_sync, bool allow_pagemode)
Definition: tableam.h:816
bool(* tuple_fetch_row_version)(Relation rel, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot)
Definition: tableam.h:318
static bool table_scan_getnextslot(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot)
Definition: tableam.h:904
void(* relation_nontransactional_truncate)(Relation rel)
Definition: tableam.h:462
unsigned int Oid
Definition: postgres_ext.h:31
NodeTag
Definition: nodes.h:26
TransactionId(* compute_xid_horizon_for_tuples)(Relation rel, ItemPointerData *items, int nitems)
Definition: tableam.h:345
static void table_rescan(TableScanDesc scan, struct ScanKeyData *key)
Definition: tableam.h:872
static void table_tuple_complete_speculative(Relation rel, TupleTableSlot *slot, uint32 specToken, bool succeeded)
Definition: tableam.h:1188
bool(* scan_analyze_next_block)(TableScanDesc scan, BlockNumber blockno, BufferAccessStrategy bstrategy)
Definition: tableam.h:521
void table_block_parallelscan_startblock_init(Relation rel, ParallelBlockTableScanDesc pbscan)
Definition: tableam.c:407
static TableScanDesc table_beginscan_strat(Relation rel, Snapshot snapshot, int nkeys, struct ScanKeyData *key, bool allow_strat, bool allow_sync)
Definition: tableam.h:779
static void table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid, int options, struct BulkInsertStateData *bistate)
Definition: tableam.h:1155
uint64 table_block_relation_size(Relation rel, ForkNumber forkNumber)
Definition: tableam.c:508
signed int int32
Definition: c.h:355
void table_scan_update_snapshot(TableScanDesc scan, Snapshot snapshot)
Definition: tableam.c:110
GucSource
Definition: guc.h:105
bool synchronize_seqscans
Definition: tableam.c:35
void(* tuple_insert_speculative)(Relation rel, TupleTableSlot *slot, CommandId cid, int options, struct BulkInsertStateData *bistate, uint32 specToken)
Definition: tableam.h:361
Definition: type.h:89
void(* scan_rescan)(TableScanDesc scan, struct ScanKeyData *key, bool set_params, bool allow_strat, bool allow_sync, bool allow_pagemode)
Definition: tableam.h:216
static bool table_scan_sample_next_tuple(TableScanDesc scan, struct SampleScanState *scanstate, TupleTableSlot *slot)
Definition: tableam.h:1767
static TransactionId table_compute_xid_horizon_for_tuples(Relation rel, ItemPointerData *items, int nitems)
Definition: tableam.h:1103
bool table_index_fetch_tuple_check(Relation rel, ItemPointer tid, Snapshot snapshot, bool *all_dead)
Definition: tableam.c:201
void(* tuple_insert)(Relation rel, TupleTableSlot *slot, CommandId cid, int options, struct BulkInsertStateData *bistate)
Definition: tableam.h:356
static void table_relation_nontransactional_truncate(Relation rel)
Definition: tableam.h:1393
static bool table_scan_analyze_next_block(TableScanDesc scan, BlockNumber blockno, BufferAccessStrategy bstrategy)
Definition: tableam.h:1476
TransactionId xmax
Definition: tableam.h:125
void(* finish_bulk_insert)(Relation rel, int options)
Definition: tableam.h:424
static TableScanDesc table_beginscan(Relation rel, Snapshot snapshot, int nkeys, struct ScanKeyData *key)
Definition: tableam.h:755
void(* tuple_complete_speculative)(Relation rel, TupleTableSlot *slot, uint32 specToken, bool succeeded)
Definition: tableam.h:369
static double table_index_build_scan(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, bool allow_sync, bool progress, IndexBuildCallback callback, void *callback_state, TableScanDesc scan)
Definition: tableam.h:1531
static TM_Result table_tuple_lock(Relation rel, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, CommandId cid, LockTupleMode mode, LockWaitPolicy wait_policy, uint8 flags, TM_FailureData *tmfd)
Definition: tableam.h:1333
bool(* scan_bitmap_next_block)(TableScanDesc scan, struct TBMIterateResult *tbmres)
Definition: tableam.h:660
void(* relation_set_new_filenode)(Relation rel, const RelFileNode *newrnode, char persistence, TransactionId *freezeXid, MultiXactId *minmulti)
Definition: tableam.h:448
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
Definition: test_ifaddrs.c:48
void simple_table_tuple_update(Relation rel, ItemPointer otid, TupleTableSlot *slot, Snapshot snapshot, bool *update_indexes)
Definition: tableam.c:320
TableScanDesc(* scan_begin)(Relation rel, Snapshot snapshot, int nkeys, struct ScanKeyData *key, ParallelTableScanDesc pscan, uint32 flags)
Definition: tableam.h:200
void(* multi_insert)(Relation rel, TupleTableSlot **slots, int nslots, CommandId cid, int options, struct BulkInsertStateData *bistate)
Definition: tableam.h:375
void(* relation_copy_for_cluster)(Relation NewTable, Relation OldTable, Relation OldIndex, bool use_sort, TransactionId OldestXmin, TransactionId *xid_cutoff, MultiXactId *multi_cutoff, double *num_tuples, double *tups_vacuumed, double *tups_recently_dead)
Definition: tableam.h:474
bool(* scan_analyze_next_tuple)(TableScanDesc scan, TransactionId OldestXmin, double *liverows, double *deadrows, TupleTableSlot *slot)
Definition: tableam.h:533
bool(* scan_bitmap_next_tuple)(TableScanDesc scan, struct TBMIterateResult *tbmres, TupleTableSlot *slot)
Definition: tableam.h:674
static double table_index_build_range_scan(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, bool allow_sync, bool anyvisible, bool progress, BlockNumber start_blockno, BlockNumber numblocks, IndexBuildCallback callback, void *callback_state, TableScanDesc scan)
Definition: tableam.h:1564
static uint64 table_relation_size(Relation rel, ForkNumber forkNumber)
Definition: tableam.h:1624
TableScanDesc table_beginscan_parallel(Relation rel, ParallelTableScanDesc pscan)
Definition: tableam.c:161
ScanDirection
Definition: sdir.h:22
static TransactionId OldestXmin
Definition: vacuumlazy.c:316
Size table_parallelscan_estimate(Relation rel, Snapshot snapshot)
Definition: tableam.c:126
unsigned int uint32
Definition: c.h:367
void(* relation_copy_data)(Relation rel, const RelFileNode *newrnode)
Definition: tableam.h:470
static void table_multi_insert(Relation rel, TupleTableSlot **slots, int nslots, CommandId cid, int options, struct BulkInsertStateData *bistate)
Definition: tableam.h:1210
void(* parallelscan_reinitialize)(Relation rel, ParallelTableScanDesc pscan)
Definition: tableam.h:251
ForkNumber
Definition: relpath.h:40
static void table_parallelscan_reinitialize(Relation rel, ParallelTableScanDesc pscan)
Definition: tableam.h:948
static bool table_tuple_fetch_row_version(Relation rel, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot)
Definition: tableam.h:1053
static char ** options
int progress
Definition: pgbench.c:234
TM_Result
Definition: tableam.h:69
uintptr_t Datum
Definition: postgres.h:367
static void table_tuple_insert_speculative(Relation rel, TupleTableSlot *slot, CommandId cid, int options, struct BulkInsertStateData *bistate, uint32 specToken)
Definition: tableam.h:1174
static bool table_index_fetch_tuple(struct IndexFetchTableData *scan, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, bool *call_again, bool *all_dead)
Definition: tableam.h:1013
const struct TableAmRoutine * rd_tableam
Definition: rel.h:151
static void table_rescan_set_params(TableScanDesc scan, struct ScanKeyData *key, bool allow_strat, bool allow_sync, bool allow_pagemode)
Definition: tableam.h:887
BlockNumber table_block_parallelscan_nextpage(Relation rel, ParallelBlockTableScanDesc pbscan)
Definition: tableam.c:450
static TM_Result table_tuple_delete(Relation rel, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, bool wait, TM_FailureData *tmfd, bool changingPart)
Definition: tableam.h:1244
bool(* relation_needs_toast_table)(Relation rel)
Definition: tableam.h:583
static void table_index_fetch_reset(struct IndexFetchTableData *scan)
Definition: tableam.h:976
TransactionId MultiXactId
Definition: c.h:523
void(* index_fetch_end)(struct IndexFetchTableData *data)
Definition: tableam.h:279
TM_Result(* tuple_lock)(Relation rel, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, CommandId cid, LockTupleMode mode, LockWaitPolicy wait_policy, uint8 flags, TM_FailureData *tmfd)
Definition: tableam.h:401
TupleTableSlot * table_slot_create(Relation rel, List **reglist)
Definition: tableam.c:77
static bool table_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot)
Definition: tableam.h:1091
static bool table_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin, double *liverows, double *deadrows, TupleTableSlot *slot)
Definition: tableam.h:1494
Definition: regguts.h:298
Definition: tableam.h:75
bool(* tuple_satisfies_snapshot)(Relation rel, TupleTableSlot *slot, Snapshot snapshot)
Definition: tableam.h:340
const TableAmRoutine * GetHeapamTableAmRoutine(void)
size_t Size
Definition: c.h:466
#define InvalidBlockNumber
Definition: block.h:33
struct TM_FailureData TM_FailureData
#define newval
bool(* scan_sample_next_tuple)(TableScanDesc scan, struct SampleScanState *scanstate, TupleTableSlot *slot)
Definition: tableam.h:719
void table_block_relation_estimate_size(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, double *allvisfrac, Size overhead_bytes_per_tuple, Size usable_bytes_per_page)
Definition: tableam.c:548
void simple_table_tuple_insert(Relation rel, TupleTableSlot *slot)
Definition: tableam.c:261
static void table_relation_set_new_filenode(Relation rel, const RelFileNode *newrnode, char persistence, TransactionId *freezeXid, MultiXactId *minmulti)
Definition: tableam.h:1376
Relation rs_rd
Definition: relscan.h:34
static void table_endscan(TableScanDesc scan)
Definition: tableam.h:863
void simple_table_tuple_delete(Relation rel, ItemPointer tid, Snapshot snapshot)
Definition: tableam.c:275
static Datum values[MAXATTR]
Definition: bootstrap.c:167
static TableScanDesc table_beginscan_tid(Relation rel, Snapshot snapshot)
Definition: tableam.h:839
TableScanDesc table_beginscan_catalog(Relation rel, int nkeys, struct ScanKeyData *key)
Definition: tableam.c:98
bool(* tuple_tid_valid)(TableScanDesc scan, ItemPointer tid)
Definition: tableam.h:326
static void table_index_validate_scan(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, Snapshot snapshot, struct ValidateIndexState *state)
Definition: tableam.h:1595
bool check_default_table_access_method(char **newval, void **extra, GucSource source)
Definition: tableamapi.c:111
const TupleTableSlotOps * table_slot_callbacks(Relation rel)
Definition: tableam.c:44
static bool table_scan_bitmap_next_block(TableScanDesc scan, struct TBMIterateResult *tbmres)
Definition: tableam.h:1717
static TableScanDesc table_beginscan_bm(Relation rel, Snapshot snapshot, int nkeys, struct ScanKeyData *key)
Definition: tableam.h:800
static bool table_tuple_tid_valid(TableScanDesc scan, ItemPointer tid)
Definition: tableam.h:1070
Definition: c.h:555
static bool table_relation_needs_toast_table(Relation rel)
Definition: tableam.h:1633
void(* relation_vacuum)(Relation onerel, struct VacuumParams *params, BufferAccessStrategy bstrategy)
Definition: tableam.h:500
static Oid table_relation_toast_am(Relation rel)
Definition: tableam.h:1643
Relation rel
Definition: relscan.h:91
static TM_Result table_tuple_update(Relation rel, ItemPointer otid, TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck, bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode, bool *update_indexes)
Definition: tableam.h:1288
bool traversed
Definition: tableam.h:127
static void table_index_fetch_end(struct IndexFetchTableData *scan)
Definition: tableam.h:985
Definition: pg_list.h:50
const TableAmRoutine * GetTableAmRoutine(Oid amhandler)
Definition: tableamapi.c:34
bool(* index_fetch_tuple)(struct IndexFetchTableData *scan, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, bool *call_again, bool *all_dead)
Definition: tableam.h:301
TM_Result(* tuple_delete)(Relation rel, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, bool wait, TM_FailureData *tmfd, bool changingPart)
Definition: tableam.h:379
#define RelationGetRelid(relation)
Definition: rel.h:436
static void table_relation_copy_for_cluster(Relation OldTable, Relation NewTable, Relation OldIndex, bool use_sort, TransactionId OldestXmin, TransactionId *xid_cutoff, MultiXactId *multi_cutoff, double *num_tuples, double *tups_vacuumed, double *tups_recently_dead)
Definition: tableam.h:1432
LockWaitPolicy
Definition: lockoptions.h:36
void(* IndexBuildCallback)(Relation index, ItemPointer tid, Datum *values, bool *isnull, bool tupleIsAlive, void *state)
Definition: tableam.h:144
void(* relation_fetch_toast_slice)(Relation toastrel, Oid valueid, int32 attrsize, int32 sliceoffset, int32 slicelength, struct varlena *result)
Definition: tableam.h:597
unsigned char bool
Definition: c.h:317
static TableScanDesc table_beginscan_analyze(Relation rel)
Definition: tableam.h:852
struct TableScanDescData * TableScanDesc
Definition: relscan.h:49