PostgreSQL Source Code git master
tuptable.h File Reference
#include "access/htup.h"
#include "access/htup_details.h"
#include "access/sysattr.h"
#include "access/tupdesc.h"
#include "storage/buf.h"
Include dependency graph for tuptable.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  TupleTableSlot
 
struct  TupleTableSlotOps
 
struct  VirtualTupleTableSlot
 
struct  HeapTupleTableSlot
 
struct  BufferHeapTupleTableSlot
 
struct  MinimalTupleTableSlot
 

Macros

#define TTS_FLAG_EMPTY   (1 << 1)
 
#define TTS_EMPTY(slot)   (((slot)->tts_flags & TTS_FLAG_EMPTY) != 0)
 
#define TTS_FLAG_SHOULDFREE   (1 << 2)
 
#define TTS_SHOULDFREE(slot)   (((slot)->tts_flags & TTS_FLAG_SHOULDFREE) != 0)
 
#define TTS_FLAG_SLOW   (1 << 3)
 
#define TTS_SLOW(slot)   (((slot)->tts_flags & TTS_FLAG_SLOW) != 0)
 
#define TTS_FLAG_FIXED   (1 << 4)
 
#define TTS_FIXED(slot)   (((slot)->tts_flags & TTS_FLAG_FIXED) != 0)
 
#define FIELDNO_TUPLETABLESLOT_FLAGS   1
 
#define FIELDNO_TUPLETABLESLOT_NVALID   2
 
#define FIELDNO_TUPLETABLESLOT_TUPLEDESCRIPTOR   4
 
#define FIELDNO_TUPLETABLESLOT_VALUES   5
 
#define FIELDNO_TUPLETABLESLOT_ISNULL   6
 
#define TTS_IS_VIRTUAL(slot)   ((slot)->tts_ops == &TTSOpsVirtual)
 
#define TTS_IS_HEAPTUPLE(slot)   ((slot)->tts_ops == &TTSOpsHeapTuple)
 
#define TTS_IS_MINIMALTUPLE(slot)   ((slot)->tts_ops == &TTSOpsMinimalTuple)
 
#define TTS_IS_BUFFERTUPLE(slot)   ((slot)->tts_ops == &TTSOpsBufferHeapTuple)
 
#define FIELDNO_HEAPTUPLETABLESLOT_TUPLE   1
 
#define FIELDNO_HEAPTUPLETABLESLOT_OFF   2
 
#define FIELDNO_MINIMALTUPLETABLESLOT_TUPLE   1
 
#define FIELDNO_MINIMALTUPLETABLESLOT_OFF   4
 
#define TupIsNull(slot)    ((slot) == NULL || TTS_EMPTY(slot))
 

Typedefs

typedef struct TupleTableSlotOps TupleTableSlotOps
 
typedef struct TupleTableSlot TupleTableSlot
 
typedef struct VirtualTupleTableSlot VirtualTupleTableSlot
 
typedef struct HeapTupleTableSlot HeapTupleTableSlot
 
typedef struct BufferHeapTupleTableSlot BufferHeapTupleTableSlot
 
typedef struct MinimalTupleTableSlot MinimalTupleTableSlot
 

Functions

TupleTableSlotMakeTupleTableSlot (TupleDesc tupleDesc, const TupleTableSlotOps *tts_ops)
 
TupleTableSlotExecAllocTableSlot (List **tupleTable, TupleDesc desc, const TupleTableSlotOps *tts_ops)
 
void ExecResetTupleTable (List *tupleTable, bool shouldFree)
 
TupleTableSlotMakeSingleTupleTableSlot (TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
 
void ExecDropSingleTupleTableSlot (TupleTableSlot *slot)
 
void ExecSetSlotDescriptor (TupleTableSlot *slot, TupleDesc tupdesc)
 
TupleTableSlotExecStoreHeapTuple (HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
 
void ExecForceStoreHeapTuple (HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
 
TupleTableSlotExecStoreBufferHeapTuple (HeapTuple tuple, TupleTableSlot *slot, Buffer buffer)
 
TupleTableSlotExecStorePinnedBufferHeapTuple (HeapTuple tuple, TupleTableSlot *slot, Buffer buffer)
 
TupleTableSlotExecStoreMinimalTuple (MinimalTuple mtup, TupleTableSlot *slot, bool shouldFree)
 
void ExecForceStoreMinimalTuple (MinimalTuple mtup, TupleTableSlot *slot, bool shouldFree)
 
TupleTableSlotExecStoreVirtualTuple (TupleTableSlot *slot)
 
TupleTableSlotExecStoreAllNullTuple (TupleTableSlot *slot)
 
void ExecStoreHeapTupleDatum (Datum data, TupleTableSlot *slot)
 
HeapTuple ExecFetchSlotHeapTuple (TupleTableSlot *slot, bool materialize, bool *shouldFree)
 
MinimalTuple ExecFetchSlotMinimalTuple (TupleTableSlot *slot, bool *shouldFree)
 
Datum ExecFetchSlotHeapTupleDatum (TupleTableSlot *slot)
 
void slot_getmissingattrs (TupleTableSlot *slot, int startAttNum, int lastAttNum)
 
void slot_getsomeattrs_int (TupleTableSlot *slot, int attnum)
 
static void slot_getsomeattrs (TupleTableSlot *slot, int attnum)
 
static void slot_getallattrs (TupleTableSlot *slot)
 
static bool slot_attisnull (TupleTableSlot *slot, int attnum)
 
static Datum slot_getattr (TupleTableSlot *slot, int attnum, bool *isnull)
 
static Datum slot_getsysattr (TupleTableSlot *slot, int attnum, bool *isnull)
 
static bool slot_is_current_xact_tuple (TupleTableSlot *slot)
 
static TupleTableSlotExecClearTuple (TupleTableSlot *slot)
 
static void ExecMaterializeSlot (TupleTableSlot *slot)
 
static HeapTuple ExecCopySlotHeapTuple (TupleTableSlot *slot)
 
static MinimalTuple ExecCopySlotMinimalTuple (TupleTableSlot *slot)
 
static TupleTableSlotExecCopySlot (TupleTableSlot *dstslot, TupleTableSlot *srcslot)
 

Variables

PGDLLIMPORT const TupleTableSlotOps TTSOpsVirtual
 
PGDLLIMPORT const TupleTableSlotOps TTSOpsHeapTuple
 
PGDLLIMPORT const TupleTableSlotOps TTSOpsMinimalTuple
 
PGDLLIMPORT const TupleTableSlotOps TTSOpsBufferHeapTuple
 

Macro Definition Documentation

◆ FIELDNO_HEAPTUPLETABLESLOT_OFF

#define FIELDNO_HEAPTUPLETABLESLOT_OFF   2

Definition at line 261 of file tuptable.h.

◆ FIELDNO_HEAPTUPLETABLESLOT_TUPLE

#define FIELDNO_HEAPTUPLETABLESLOT_TUPLE   1

Definition at line 259 of file tuptable.h.

◆ FIELDNO_MINIMALTUPLETABLESLOT_OFF

#define FIELDNO_MINIMALTUPLETABLESLOT_OFF   4

Definition at line 299 of file tuptable.h.

◆ FIELDNO_MINIMALTUPLETABLESLOT_TUPLE

#define FIELDNO_MINIMALTUPLETABLESLOT_TUPLE   1

Definition at line 295 of file tuptable.h.

◆ FIELDNO_TUPLETABLESLOT_FLAGS

#define FIELDNO_TUPLETABLESLOT_FLAGS   1

Definition at line 117 of file tuptable.h.

◆ FIELDNO_TUPLETABLESLOT_ISNULL

#define FIELDNO_TUPLETABLESLOT_ISNULL   6

Definition at line 126 of file tuptable.h.

◆ FIELDNO_TUPLETABLESLOT_NVALID

#define FIELDNO_TUPLETABLESLOT_NVALID   2

Definition at line 119 of file tuptable.h.

◆ FIELDNO_TUPLETABLESLOT_TUPLEDESCRIPTOR

#define FIELDNO_TUPLETABLESLOT_TUPLEDESCRIPTOR   4

Definition at line 122 of file tuptable.h.

◆ FIELDNO_TUPLETABLESLOT_VALUES

#define FIELDNO_TUPLETABLESLOT_VALUES   5

Definition at line 124 of file tuptable.h.

◆ TTS_EMPTY

#define TTS_EMPTY (   slot)    (((slot)->tts_flags & TTS_FLAG_EMPTY) != 0)

Definition at line 96 of file tuptable.h.

◆ TTS_FIXED

#define TTS_FIXED (   slot)    (((slot)->tts_flags & TTS_FLAG_FIXED) != 0)

Definition at line 108 of file tuptable.h.

◆ TTS_FLAG_EMPTY

#define TTS_FLAG_EMPTY   (1 << 1)

Definition at line 95 of file tuptable.h.

◆ TTS_FLAG_FIXED

#define TTS_FLAG_FIXED   (1 << 4)

Definition at line 107 of file tuptable.h.

◆ TTS_FLAG_SHOULDFREE

#define TTS_FLAG_SHOULDFREE   (1 << 2)

Definition at line 99 of file tuptable.h.

◆ TTS_FLAG_SLOW

#define TTS_FLAG_SLOW   (1 << 3)

Definition at line 103 of file tuptable.h.

◆ TTS_IS_BUFFERTUPLE

#define TTS_IS_BUFFERTUPLE (   slot)    ((slot)->tts_ops == &TTSOpsBufferHeapTuple)

Definition at line 237 of file tuptable.h.

◆ TTS_IS_HEAPTUPLE

#define TTS_IS_HEAPTUPLE (   slot)    ((slot)->tts_ops == &TTSOpsHeapTuple)

Definition at line 235 of file tuptable.h.

◆ TTS_IS_MINIMALTUPLE

#define TTS_IS_MINIMALTUPLE (   slot)    ((slot)->tts_ops == &TTSOpsMinimalTuple)

Definition at line 236 of file tuptable.h.

◆ TTS_IS_VIRTUAL

#define TTS_IS_VIRTUAL (   slot)    ((slot)->tts_ops == &TTSOpsVirtual)

Definition at line 234 of file tuptable.h.

◆ TTS_SHOULDFREE

#define TTS_SHOULDFREE (   slot)    (((slot)->tts_flags & TTS_FLAG_SHOULDFREE) != 0)

Definition at line 100 of file tuptable.h.

◆ TTS_SLOW

#define TTS_SLOW (   slot)    (((slot)->tts_flags & TTS_FLAG_SLOW) != 0)

Definition at line 104 of file tuptable.h.

◆ TupIsNull

#define TupIsNull (   slot)     ((slot) == NULL || TTS_EMPTY(slot))

Definition at line 306 of file tuptable.h.

Typedef Documentation

◆ BufferHeapTupleTableSlot

◆ HeapTupleTableSlot

◆ MinimalTupleTableSlot

◆ TupleTableSlot

◆ TupleTableSlotOps

Definition at line 111 of file tuptable.h.

◆ VirtualTupleTableSlot

Function Documentation

◆ ExecAllocTableSlot()

TupleTableSlot * ExecAllocTableSlot ( List **  tupleTable,
TupleDesc  desc,
const TupleTableSlotOps tts_ops 
)

Definition at line 1358 of file execTuples.c.

1360{
1361 TupleTableSlot *slot = MakeTupleTableSlot(desc, tts_ops);
1362
1363 *tupleTable = lappend(*tupleTable, slot);
1364
1365 return slot;
1366}
TupleTableSlot * MakeTupleTableSlot(TupleDesc tupleDesc, const TupleTableSlotOps *tts_ops)
Definition: execTuples.c:1299
List * lappend(List *list, void *datum)
Definition: list.c:339

References lappend(), and MakeTupleTableSlot().

Referenced by ExecInitExtraTupleSlot(), ExecInitIndexOnlyScan(), ExecInitResultSlot(), ExecInitScanTupleSlot(), and find_hash_columns().

◆ ExecClearTuple()

static TupleTableSlot * ExecClearTuple ( TupleTableSlot slot)
inlinestatic

Definition at line 454 of file tuptable.h.

455{
456 slot->tts_ops->clear(slot);
457
458 return slot;
459}
void(* clear)(TupleTableSlot *slot)
Definition: tuptable.h:151
const TupleTableSlotOps *const tts_ops
Definition: tuptable.h:121

References TupleTableSlotOps::clear, and TupleTableSlot::tts_ops.

Referenced by AfterTriggerExecute(), agg_retrieve_hash_table_in_memory(), apply_returning_filter(), ATRewriteTable(), begin_partition(), BitmapHeapNext(), buildSubPlanHash(), check_publications(), check_publications_origin(), CopyFrom(), CopyMultiInsertBufferFlush(), copyTemplateDependencies(), CteScanNext(), DefineTSConfiguration(), do_tup_output(), EnumValuesCreate(), eval_windowaggregates(), EvalPlanQual(), ExecAppend(), ExecAppendAsyncGetNext(), ExecARUpdateTriggers(), ExecBatchInsert(), ExecCheckTIDVisible(), ExecComputeStoredGenerated(), ExecDelete(), ExecDropSingleTupleTableSlot(), ExecEvalAggOrderedTransTuple(), ExecEvalPreOrderedDistinctMulti(), ExecFilterJunk(), ExecFindPartition(), ExecForceStoreHeapTuple(), ExecForceStoreMinimalTuple(), ExecHashJoinGetSavedTuple(), ExecHashSubPlan(), ExecIncrementalSort(), ExecInsert(), ExecLockRows(), ExecMaterial(), ExecMergeAppend(), ExecOnConflictUpdate(), ExecParallelHashJoinOuterGetTuple(), ExecProject(), ExecProjectSRF(), ExecReScanAgg(), ExecReScanCteScan(), ExecReScanFunctionScan(), ExecReScanGroup(), ExecReScanIncrementalSort(), ExecReScanMaterial(), ExecReScanMergeJoin(), ExecReScanNamedTuplestoreScan(), ExecReScanSetOp(), ExecReScanSort(), ExecReScanTableFuncScan(), ExecReScanUnique(), ExecReScanValuesScan(), ExecReScanWindowAgg(), ExecReScanWorkTableScan(), ExecResetTupleTable(), ExecScan(), ExecScanFetch(), ExecScanReScan(), ExecSetSlotDescriptor(), ExecSort(), ExecStoreAllNullTuple(), ExecStoreHeapTupleDatum(), ExecUnique(), execute_attr_map_slot(), ExecWindowAgg(), fetch_remote_table_info(), fetch_table_list(), fileIterateForeignScan(), finalize_aggregates(), FunctionNext(), gather_getnext(), gather_merge_clear_tuples(), gather_merge_init(), get_actual_variable_endpoint(), get_returning_data(), hashagg_spill_tuple(), heap_getnextslot(), heap_getnextslot_tidrange(), heapam_scan_analyze_next_tuple(), heapam_scan_sample_next_tuple(), hypothetical_dense_rank_final(), hypothetical_rank_common(), IndexNext(), IndexNextWithReorder(), IndexOnlyNext(), InsertPgAttributeTuples(), MakeConfigurationMapping(), ordered_set_shutdown(), ordered_set_transition_multi(), pgoutput_row_filter(), postgresIterateDirectModify(), postgresIterateForeignScan(), prepare_hash_slot(), prepare_probe_slot(), process_ordered_aggregate_multi(), recordMultipleDependencies(), RunFromStore(), setop_load_group(), setop_retrieve_hash_table(), setop_retrieve_sorted(), ShutdownSetExpr(), slot_modify_data(), slot_store_data(), StoreIndexTuple(), switchToPresortedPrefixMode(), synchronize_slots(), tablesample_getnext(), tfuncLoadRows(), TidNext(), TidRangeNext(), tts_buffer_heap_copyslot(), tuplesort_gettupleslot(), tuplestore_gettupleslot(), update_frameheadpos(), update_frametailpos(), update_grouptailpos(), validate_remote_info(), ValuesNext(), and WinRowsArePeers().

◆ ExecCopySlot()

◆ ExecCopySlotHeapTuple()

static HeapTuple ExecCopySlotHeapTuple ( TupleTableSlot slot)
inlinestatic

◆ ExecCopySlotMinimalTuple()

static MinimalTuple ExecCopySlotMinimalTuple ( TupleTableSlot slot)
inlinestatic

◆ ExecDropSingleTupleTableSlot()

void ExecDropSingleTupleTableSlot ( TupleTableSlot slot)

Definition at line 1441 of file execTuples.c.

1442{
1443 /* This should match ExecResetTupleTable's processing of one slot */
1444 Assert(IsA(slot, TupleTableSlot));
1445 ExecClearTuple(slot);
1446 slot->tts_ops->release(slot);
1447 if (slot->tts_tupleDescriptor)
1449 if (!TTS_FIXED(slot))
1450 {
1451 if (slot->tts_values)
1452 pfree(slot->tts_values);
1453 if (slot->tts_isnull)
1454 pfree(slot->tts_isnull);
1455 }
1456 pfree(slot);
1457}
void pfree(void *pointer)
Definition: mcxt.c:1521
#define IsA(nodeptr, _type_)
Definition: nodes.h:158
void(* release)(TupleTableSlot *slot)
Definition: tuptable.h:143
bool * tts_isnull
Definition: tuptable.h:127
Datum * tts_values
Definition: tuptable.h:125
#define ReleaseTupleDesc(tupdesc)
Definition: tupdesc.h:212
#define TTS_FIXED(slot)
Definition: tuptable.h:108
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Definition: tuptable.h:454

References Assert, ExecClearTuple(), IsA, pfree(), TupleTableSlotOps::release, ReleaseTupleDesc, TTS_FIXED, TupleTableSlot::tts_isnull, TupleTableSlot::tts_ops, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by acquire_sample_rows(), AfterTriggerFreeQuery(), afterTriggerInvokeEvents(), ATRewriteTable(), CatalogIndexInsert(), check_default_partition_contents(), check_exclusion_or_unique_constraint(), check_publications(), check_publications_origin(), compute_expr_stats(), compute_index_stats(), CopyMultiInsertBufferCleanup(), copyTemplateDependencies(), DefineTSConfiguration(), DoCopyTo(), end_tup_output(), EnumValuesCreate(), ExecCleanupTupleRouting(), ExecEndIncrementalSort(), ExecEndModifyTable(), fetch_remote_table_info(), fetch_table_list(), FindConflictTuple(), freestate_cluster(), get_actual_variable_range(), get_rel_sync_entry(), heap_entry_is_visible(), heapam_index_build_range_scan(), heapam_index_validate_scan(), heapam_relation_copy_for_cluster(), hypothetical_dense_rank_final(), IndexCheckExclusion(), InsertPgAttributeTuples(), make_build_data(), MakeConfigurationMapping(), pgoutput_change(), recordMultipleDependencies(), RelationFindReplTupleSeq(), RI_Initial_Check(), RunFromStore(), systable_endscan(), systable_endscan_ordered(), table_index_fetch_tuple_check(), tstoreShutdownReceiver(), validateDomainCheckConstraint(), validateDomainNotNullConstraint(), and validateForeignKeyConstraint().

◆ ExecFetchSlotHeapTuple()

HeapTuple ExecFetchSlotHeapTuple ( TupleTableSlot slot,
bool  materialize,
bool *  shouldFree 
)

Definition at line 1831 of file execTuples.c.

1832{
1833 /*
1834 * sanity checks
1835 */
1836 Assert(slot != NULL);
1837 Assert(!TTS_EMPTY(slot));
1838
1839 /* Materialize the tuple so that the slot "owns" it, if requested. */
1840 if (materialize)
1841 slot->tts_ops->materialize(slot);
1842
1843 if (slot->tts_ops->get_heap_tuple == NULL)
1844 {
1845 if (shouldFree)
1846 *shouldFree = true;
1847 return slot->tts_ops->copy_heap_tuple(slot);
1848 }
1849 else
1850 {
1851 if (shouldFree)
1852 *shouldFree = false;
1853 return slot->tts_ops->get_heap_tuple(slot);
1854 }
1855}
HeapTuple(* get_heap_tuple)(TupleTableSlot *slot)
Definition: tuptable.h:194
void(* materialize)(TupleTableSlot *slot)
Definition: tuptable.h:179

References Assert, TupleTableSlotOps::copy_heap_tuple, TupleTableSlotOps::get_heap_tuple, TupleTableSlotOps::materialize, TTS_EMPTY, and TupleTableSlot::tts_ops.

Referenced by AfterTriggerExecute(), apply_returning_filter(), CatalogTuplesMultiInsertWithInfo(), ExecBRDeleteTriggers(), ExecBRInsertTriggers(), ExecBRUpdateTriggers(), ExecFetchSlotHeapTupleDatum(), ExecIRInsertTriggers(), ExecIRUpdateTriggers(), heap_multi_insert(), heapam_relation_copy_for_cluster(), heapam_tuple_complete_speculative(), heapam_tuple_insert(), heapam_tuple_insert_speculative(), heapam_tuple_update(), systable_getnext(), systable_getnext_ordered(), systable_recheck_tuple(), and validateForeignKeyConstraint().

◆ ExecFetchSlotHeapTupleDatum()

Datum ExecFetchSlotHeapTupleDatum ( TupleTableSlot slot)

Definition at line 1910 of file execTuples.c.

1911{
1912 HeapTuple tup;
1913 TupleDesc tupdesc;
1914 bool shouldFree;
1915 Datum ret;
1916
1917 /* Fetch slot's contents in regular-physical-tuple form */
1918 tup = ExecFetchSlotHeapTuple(slot, false, &shouldFree);
1919 tupdesc = slot->tts_tupleDescriptor;
1920
1921 /* Convert to Datum form */
1922 ret = heap_copy_tuple_as_datum(tup, tupdesc);
1923
1924 if (shouldFree)
1925 pfree(tup);
1926
1927 return ret;
1928}
HeapTuple ExecFetchSlotHeapTuple(TupleTableSlot *slot, bool materialize, bool *shouldFree)
Definition: execTuples.c:1831
Datum heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc)
Definition: heaptuple.c:1081
uintptr_t Datum
Definition: postgres.h:69

References ExecFetchSlotHeapTuple(), heap_copy_tuple_as_datum(), pfree(), and TupleTableSlot::tts_tupleDescriptor.

Referenced by ExecMakeFunctionResultSet(), and postquel_get_single_result().

◆ ExecFetchSlotMinimalTuple()

MinimalTuple ExecFetchSlotMinimalTuple ( TupleTableSlot slot,
bool *  shouldFree 
)

Definition at line 1879 of file execTuples.c.

1881{
1882 /*
1883 * sanity checks
1884 */
1885 Assert(slot != NULL);
1886 Assert(!TTS_EMPTY(slot));
1887
1888 if (slot->tts_ops->get_minimal_tuple)
1889 {
1890 if (shouldFree)
1891 *shouldFree = false;
1892 return slot->tts_ops->get_minimal_tuple(slot);
1893 }
1894 else
1895 {
1896 if (shouldFree)
1897 *shouldFree = true;
1898 return slot->tts_ops->copy_minimal_tuple(slot);
1899 }
1900}
MinimalTuple(* get_minimal_tuple)(TupleTableSlot *slot)
Definition: tuptable.h:202

References Assert, TupleTableSlotOps::copy_minimal_tuple, TupleTableSlotOps::get_minimal_tuple, TTS_EMPTY, and TupleTableSlot::tts_ops.

Referenced by ExecHashJoinImpl(), ExecHashSkewTableInsert(), ExecHashTableInsert(), ExecParallelHashJoinPartitionOuter(), ExecParallelHashTableInsert(), ExecParallelHashTableInsertCurrentBatch(), hashagg_spill_tuple(), and tqueueReceiveSlot().

◆ ExecForceStoreHeapTuple()

void ExecForceStoreHeapTuple ( HeapTuple  tuple,
TupleTableSlot slot,
bool  shouldFree 
)

Definition at line 1656 of file execTuples.c.

1659{
1660 if (TTS_IS_HEAPTUPLE(slot))
1661 {
1662 ExecStoreHeapTuple(tuple, slot, shouldFree);
1663 }
1664 else if (TTS_IS_BUFFERTUPLE(slot))
1665 {
1666 MemoryContext oldContext;
1668
1669 ExecClearTuple(slot);
1670 slot->tts_flags &= ~TTS_FLAG_EMPTY;
1671 oldContext = MemoryContextSwitchTo(slot->tts_mcxt);
1672 bslot->base.tuple = heap_copytuple(tuple);
1674 MemoryContextSwitchTo(oldContext);
1675
1676 if (shouldFree)
1677 pfree(tuple);
1678 }
1679 else
1680 {
1681 ExecClearTuple(slot);
1683 slot->tts_values, slot->tts_isnull);
1685
1686 if (shouldFree)
1687 {
1688 ExecMaterializeSlot(slot);
1689 pfree(tuple);
1690 }
1691 }
1692}
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
Definition: execTuples.c:1739
TupleTableSlot * ExecStoreHeapTuple(HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
Definition: execTuples.c:1539
HeapTuple heap_copytuple(HeapTuple tuple)
Definition: heaptuple.c:778
void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
Definition: heaptuple.c:1346
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
MemoryContext tts_mcxt
Definition: tuptable.h:128
uint16 tts_flags
Definition: tuptable.h:118
#define TTS_FLAG_SHOULDFREE
Definition: tuptable.h:99
#define TTS_IS_BUFFERTUPLE(slot)
Definition: tuptable.h:237
static void ExecMaterializeSlot(TupleTableSlot *slot)
Definition: tuptable.h:472
#define TTS_IS_HEAPTUPLE(slot)
Definition: tuptable.h:235

References ExecClearTuple(), ExecMaterializeSlot(), ExecStoreHeapTuple(), ExecStoreVirtualTuple(), heap_copytuple(), heap_deform_tuple(), MemoryContextSwitchTo(), pfree(), TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, TTS_IS_BUFFERTUPLE, TTS_IS_HEAPTUPLE, TupleTableSlot::tts_isnull, TupleTableSlot::tts_mcxt, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by agg_retrieve_direct(), ExecARDeleteTriggers(), ExecARUpdateTriggers(), ExecBRDeleteTriggers(), ExecBRInsertTriggers(), ExecBRUpdateTriggers(), ExecDelete(), ExecIRDeleteTriggers(), ExecIRInsertTriggers(), ExecIRUpdateTriggers(), ExecMergeMatched(), ExecModifyTable(), IndexNextWithReorder(), IndexOnlyNext(), and store_returning_result().

◆ ExecForceStoreMinimalTuple()

void ExecForceStoreMinimalTuple ( MinimalTuple  mtup,
TupleTableSlot slot,
bool  shouldFree 
)

Definition at line 1699 of file execTuples.c.

1702{
1703 if (TTS_IS_MINIMALTUPLE(slot))
1704 {
1705 tts_minimal_store_tuple(slot, mtup, shouldFree);
1706 }
1707 else
1708 {
1709 HeapTupleData htup;
1710
1711 ExecClearTuple(slot);
1712
1713 htup.t_len = mtup->t_len + MINIMAL_TUPLE_OFFSET;
1714 htup.t_data = (HeapTupleHeader) ((char *) mtup - MINIMAL_TUPLE_OFFSET);
1716 slot->tts_values, slot->tts_isnull);
1718
1719 if (shouldFree)
1720 {
1721 ExecMaterializeSlot(slot);
1722 pfree(mtup);
1723 }
1724 }
1725}
static void tts_minimal_store_tuple(TupleTableSlot *slot, MinimalTuple mtup, bool shouldFree)
Definition: execTuples.c:680
HeapTupleHeaderData * HeapTupleHeader
Definition: htup.h:23
#define MINIMAL_TUPLE_OFFSET
Definition: htup_details.h:617
uint32 t_len
Definition: htup.h:64
HeapTupleHeader t_data
Definition: htup.h:68
#define TTS_IS_MINIMALTUPLE(slot)
Definition: tuptable.h:236

References ExecClearTuple(), ExecMaterializeSlot(), ExecStoreVirtualTuple(), heap_deform_tuple(), MINIMAL_TUPLE_OFFSET, pfree(), HeapTupleData::t_data, HeapTupleData::t_len, MinimalTupleData::t_len, TTS_IS_MINIMALTUPLE, TupleTableSlot::tts_isnull, tts_minimal_store_tuple(), TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by ExecHashJoinGetSavedTuple(), ExecParallelHashJoinNewBatch(), and ExecParallelHashJoinOuterGetTuple().

◆ ExecMaterializeSlot()

◆ ExecResetTupleTable()

void ExecResetTupleTable ( List tupleTable,
bool  shouldFree 
)

Definition at line 1378 of file execTuples.c.

1380{
1381 ListCell *lc;
1382
1383 foreach(lc, tupleTable)
1384 {
1386
1387 /* Always release resources and reset the slot to empty */
1388 ExecClearTuple(slot);
1389 slot->tts_ops->release(slot);
1390 if (slot->tts_tupleDescriptor)
1391 {
1393 slot->tts_tupleDescriptor = NULL;
1394 }
1395
1396 /* If shouldFree, release memory occupied by the slot itself */
1397 if (shouldFree)
1398 {
1399 if (!TTS_FIXED(slot))
1400 {
1401 if (slot->tts_values)
1402 pfree(slot->tts_values);
1403 if (slot->tts_isnull)
1404 pfree(slot->tts_isnull);
1405 }
1406 pfree(slot);
1407 }
1408 }
1409
1410 /* If shouldFree, release the list structure */
1411 if (shouldFree)
1412 list_free(tupleTable);
1413}
void list_free(List *list)
Definition: list.c:1546
#define lfirst_node(type, lc)
Definition: pg_list.h:176

References ExecClearTuple(), lfirst_node, list_free(), pfree(), TupleTableSlotOps::release, ReleaseTupleDesc, TTS_FIXED, TupleTableSlot::tts_isnull, TupleTableSlot::tts_ops, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by afterTriggerInvokeEvents(), CopyFrom(), EvalPlanQualEnd(), ExecEndPlan(), and finish_edata().

◆ ExecSetSlotDescriptor()

void ExecSetSlotDescriptor ( TupleTableSlot slot,
TupleDesc  tupdesc 
)

Definition at line 1476 of file execTuples.c.

1478{
1479 Assert(!TTS_FIXED(slot));
1480
1481 /* For safety, make sure slot is empty before changing it */
1482 ExecClearTuple(slot);
1483
1484 /*
1485 * Release any old descriptor. Also release old Datum/isnull arrays if
1486 * present (we don't bother to check if they could be re-used).
1487 */
1488 if (slot->tts_tupleDescriptor)
1490
1491 if (slot->tts_values)
1492 pfree(slot->tts_values);
1493 if (slot->tts_isnull)
1494 pfree(slot->tts_isnull);
1495
1496 /*
1497 * Install the new descriptor; if it's refcounted, bump its refcount.
1498 */
1499 slot->tts_tupleDescriptor = tupdesc;
1500 PinTupleDesc(tupdesc);
1501
1502 /*
1503 * Allocate Datum/isnull arrays of the appropriate size. These must have
1504 * the same lifetime as the slot, so allocate in the slot's own context.
1505 */
1506 slot->tts_values = (Datum *)
1507 MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(Datum));
1508 slot->tts_isnull = (bool *)
1509 MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(bool));
1510}
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:1181
#define PinTupleDesc(tupdesc)
Definition: tupdesc.h:206

References Assert, ExecClearTuple(), MemoryContextAlloc(), TupleDescData::natts, pfree(), PinTupleDesc, ReleaseTupleDesc, TTS_FIXED, TupleTableSlot::tts_isnull, TupleTableSlot::tts_mcxt, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by ExecAssignScanType(), ExecInitJunkFilter(), and ExecInitJunkFilterConversion().

◆ ExecStoreAllNullTuple()

TupleTableSlot * ExecStoreAllNullTuple ( TupleTableSlot slot)

Definition at line 1763 of file execTuples.c.

1764{
1765 /*
1766 * sanity checks
1767 */
1768 Assert(slot != NULL);
1769 Assert(slot->tts_tupleDescriptor != NULL);
1770
1771 /* Clear any old contents */
1772 ExecClearTuple(slot);
1773
1774 /*
1775 * Fill all the columns of the virtual tuple with nulls
1776 */
1777 MemSet(slot->tts_values, 0,
1778 slot->tts_tupleDescriptor->natts * sizeof(Datum));
1779 memset(slot->tts_isnull, true,
1780 slot->tts_tupleDescriptor->natts * sizeof(bool));
1781
1782 return ExecStoreVirtualTuple(slot);
1783}
#define MemSet(start, val, len)
Definition: c.h:977

References Assert, ExecClearTuple(), ExecStoreVirtualTuple(), MemSet, TupleDescData::natts, TupleTableSlot::tts_isnull, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by ATRewriteTable(), ExecDelete(), ExecGetAllNullSlot(), ExecInitNullTupleSlot(), get_returning_data(), heapam_scan_bitmap_next_tuple(), and prepare_projection_slot().

◆ ExecStoreBufferHeapTuple()

TupleTableSlot * ExecStoreBufferHeapTuple ( HeapTuple  tuple,
TupleTableSlot slot,
Buffer  buffer 
)

Definition at line 1579 of file execTuples.c.

1582{
1583 /*
1584 * sanity checks
1585 */
1586 Assert(tuple != NULL);
1587 Assert(slot != NULL);
1588 Assert(slot->tts_tupleDescriptor != NULL);
1589 Assert(BufferIsValid(buffer));
1590
1591 if (unlikely(!TTS_IS_BUFFERTUPLE(slot)))
1592 elog(ERROR, "trying to store an on-disk heap tuple into wrong type of slot");
1593 tts_buffer_heap_store_tuple(slot, tuple, buffer, false);
1594
1595 slot->tts_tableOid = tuple->t_tableOid;
1596
1597 return slot;
1598}
static bool BufferIsValid(Buffer bufnum)
Definition: bufmgr.h:351
#define unlikely(x)
Definition: c.h:333
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
static void tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple, Buffer buffer, bool transfer_pin)
Definition: execTuples.c:942
Oid t_tableOid
Definition: htup.h:66
Oid tts_tableOid
Definition: tuptable.h:130

References Assert, BufferIsValid(), elog, ERROR, HeapTupleData::t_tableOid, tts_buffer_heap_store_tuple(), TTS_IS_BUFFERTUPLE, TupleTableSlot::tts_tableOid, TupleTableSlot::tts_tupleDescriptor, and unlikely.

Referenced by heap_getnextslot(), heap_getnextslot_tidrange(), heapam_index_build_range_scan(), heapam_index_fetch_tuple(), heapam_scan_analyze_next_tuple(), heapam_scan_bitmap_next_tuple(), and heapam_scan_sample_next_tuple().

◆ ExecStoreHeapTuple()

TupleTableSlot * ExecStoreHeapTuple ( HeapTuple  tuple,
TupleTableSlot slot,
bool  shouldFree 
)

Definition at line 1539 of file execTuples.c.

1542{
1543 /*
1544 * sanity checks
1545 */
1546 Assert(tuple != NULL);
1547 Assert(slot != NULL);
1548 Assert(slot->tts_tupleDescriptor != NULL);
1549
1550 if (unlikely(!TTS_IS_HEAPTUPLE(slot)))
1551 elog(ERROR, "trying to store a heap tuple into wrong type of slot");
1552 tts_heap_store_tuple(slot, tuple, shouldFree);
1553
1554 slot->tts_tableOid = tuple->t_tableOid;
1555
1556 return slot;
1557}
static void tts_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple, bool shouldFree)
Definition: execTuples.c:486

References Assert, elog, ERROR, HeapTupleData::t_tableOid, tts_heap_store_tuple(), TTS_IS_HEAPTUPLE, TupleTableSlot::tts_tableOid, TupleTableSlot::tts_tupleDescriptor, and unlikely.

Referenced by CatalogIndexInsert(), comparetup_cluster_tiebreak(), compute_expr_stats(), compute_index_stats(), ExecForceStoreHeapTuple(), ExecuteCallStmt(), get_returning_data(), heapam_index_validate_scan(), make_build_data(), pgoutput_change(), postgresIterateForeignScan(), and tts_heap_copyslot().

◆ ExecStoreHeapTupleDatum()

void ExecStoreHeapTupleDatum ( Datum  data,
TupleTableSlot slot 
)

Definition at line 1793 of file execTuples.c.

1794{
1795 HeapTupleData tuple = {0};
1796 HeapTupleHeader td;
1797
1799
1801 tuple.t_self = td->t_ctid;
1802 tuple.t_data = td;
1803
1804 ExecClearTuple(slot);
1805
1807 slot->tts_values, slot->tts_isnull);
1809}
#define DatumGetHeapTupleHeader(X)
Definition: fmgr.h:295
#define HeapTupleHeaderGetDatumLength(tup)
Definition: htup_details.h:450
const void * data
ItemPointerData t_self
Definition: htup.h:65
ItemPointerData t_ctid
Definition: htup_details.h:161

References data, DatumGetHeapTupleHeader, ExecClearTuple(), ExecStoreVirtualTuple(), heap_deform_tuple(), HeapTupleHeaderGetDatumLength, HeapTupleHeaderData::t_ctid, HeapTupleData::t_data, HeapTupleData::t_len, HeapTupleData::t_self, TupleTableSlot::tts_isnull, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by EvalPlanQualFetchRowMark().

◆ ExecStoreMinimalTuple()

◆ ExecStorePinnedBufferHeapTuple()

TupleTableSlot * ExecStorePinnedBufferHeapTuple ( HeapTuple  tuple,
TupleTableSlot slot,
Buffer  buffer 
)

Definition at line 1605 of file execTuples.c.

1608{
1609 /*
1610 * sanity checks
1611 */
1612 Assert(tuple != NULL);
1613 Assert(slot != NULL);
1614 Assert(slot->tts_tupleDescriptor != NULL);
1615 Assert(BufferIsValid(buffer));
1616
1617 if (unlikely(!TTS_IS_BUFFERTUPLE(slot)))
1618 elog(ERROR, "trying to store an on-disk heap tuple into wrong type of slot");
1619 tts_buffer_heap_store_tuple(slot, tuple, buffer, true);
1620
1621 slot->tts_tableOid = tuple->t_tableOid;
1622
1623 return slot;
1624}

References Assert, BufferIsValid(), elog, ERROR, HeapTupleData::t_tableOid, tts_buffer_heap_store_tuple(), TTS_IS_BUFFERTUPLE, TupleTableSlot::tts_tableOid, TupleTableSlot::tts_tupleDescriptor, and unlikely.

Referenced by heapam_fetch_row_version(), and heapam_tuple_lock().

◆ ExecStoreVirtualTuple()

TupleTableSlot * ExecStoreVirtualTuple ( TupleTableSlot slot)

◆ MakeSingleTupleTableSlot()

◆ MakeTupleTableSlot()

TupleTableSlot * MakeTupleTableSlot ( TupleDesc  tupleDesc,
const TupleTableSlotOps tts_ops 
)

Definition at line 1299 of file execTuples.c.

1301{
1302 Size basesz,
1303 allocsz;
1304 TupleTableSlot *slot;
1305
1306 basesz = tts_ops->base_slot_size;
1307
1308 /*
1309 * When a fixed descriptor is specified, we can reduce overhead by
1310 * allocating the entire slot in one go.
1311 */
1312 if (tupleDesc)
1313 allocsz = MAXALIGN(basesz) +
1314 MAXALIGN(tupleDesc->natts * sizeof(Datum)) +
1315 MAXALIGN(tupleDesc->natts * sizeof(bool));
1316 else
1317 allocsz = basesz;
1318
1319 slot = palloc0(allocsz);
1320 /* const for optimization purposes, OK to modify at allocation time */
1321 *((const TupleTableSlotOps **) &slot->tts_ops) = tts_ops;
1322 slot->type = T_TupleTableSlot;
1323 slot->tts_flags |= TTS_FLAG_EMPTY;
1324 if (tupleDesc != NULL)
1325 slot->tts_flags |= TTS_FLAG_FIXED;
1326 slot->tts_tupleDescriptor = tupleDesc;
1328 slot->tts_nvalid = 0;
1329
1330 if (tupleDesc != NULL)
1331 {
1332 slot->tts_values = (Datum *)
1333 (((char *) slot)
1334 + MAXALIGN(basesz));
1335 slot->tts_isnull = (bool *)
1336 (((char *) slot)
1337 + MAXALIGN(basesz)
1338 + MAXALIGN(tupleDesc->natts * sizeof(Datum)));
1339
1340 PinTupleDesc(tupleDesc);
1341 }
1342
1343 /*
1344 * And allow slot type specific initialization.
1345 */
1346 slot->tts_ops->init(slot);
1347
1348 return slot;
1349}
#define MAXALIGN(LEN)
Definition: c.h:768
size_t Size
Definition: c.h:562
void * palloc0(Size size)
Definition: mcxt.c:1347
MemoryContext CurrentMemoryContext
Definition: mcxt.c:143
size_t base_slot_size
Definition: tuptable.h:137
void(* init)(TupleTableSlot *slot)
Definition: tuptable.h:140
NodeTag type
Definition: tuptable.h:116
#define TTS_FLAG_EMPTY
Definition: tuptable.h:95
#define TTS_FLAG_FIXED
Definition: tuptable.h:107

References TupleTableSlotOps::base_slot_size, CurrentMemoryContext, TupleTableSlotOps::init, MAXALIGN, TupleDescData::natts, palloc0(), PinTupleDesc, TTS_FLAG_EMPTY, TTS_FLAG_FIXED, TupleTableSlot::tts_flags, TupleTableSlot::tts_isnull, TupleTableSlot::tts_mcxt, TupleTableSlot::tts_nvalid, TupleTableSlot::tts_ops, TupleTableSlot::tts_tupleDescriptor, TupleTableSlot::tts_values, and TupleTableSlot::type.

Referenced by ExecAllocTableSlot(), ExecConstraints(), ExecPartitionCheckEmitError(), ExecWithCheckOptions(), MakeSingleTupleTableSlot(), and pgoutput_change().

◆ slot_attisnull()

static bool slot_attisnull ( TupleTableSlot slot,
int  attnum 
)
inlinestatic

Definition at line 381 of file tuptable.h.

382{
383 Assert(attnum > 0);
384
385 if (attnum > slot->tts_nvalid)
387
388 return slot->tts_isnull[attnum - 1];
389}
int16 attnum
Definition: pg_attribute.h:74
static void slot_getsomeattrs(TupleTableSlot *slot, int attnum)
Definition: tuptable.h:355

References Assert, attnum, slot_getsomeattrs(), TupleTableSlot::tts_isnull, and TupleTableSlot::tts_nvalid.

Referenced by ATRewriteTable(), ExecConstraints(), ri_NullCheck(), slotAllNulls(), slotNoNulls(), and validateDomainNotNullConstraint().

◆ slot_getallattrs()

◆ slot_getattr()

◆ slot_getmissingattrs()

void slot_getmissingattrs ( TupleTableSlot slot,
int  startAttNum,
int  lastAttNum 
)

Definition at line 2055 of file execTuples.c.

2056{
2057 AttrMissing *attrmiss = NULL;
2058
2059 if (slot->tts_tupleDescriptor->constr)
2060 attrmiss = slot->tts_tupleDescriptor->constr->missing;
2061
2062 if (!attrmiss)
2063 {
2064 /* no missing values array at all, so just fill everything in as NULL */
2065 memset(slot->tts_values + startAttNum, 0,
2066 (lastAttNum - startAttNum) * sizeof(Datum));
2067 memset(slot->tts_isnull + startAttNum, 1,
2068 (lastAttNum - startAttNum) * sizeof(bool));
2069 }
2070 else
2071 {
2072 int missattnum;
2073
2074 /* if there is a missing values array we must process them one by one */
2075 for (missattnum = startAttNum;
2076 missattnum < lastAttNum;
2077 missattnum++)
2078 {
2079 slot->tts_values[missattnum] = attrmiss[missattnum].am_value;
2080 slot->tts_isnull[missattnum] = !attrmiss[missattnum].am_present;
2081 }
2082 }
2083}
struct AttrMissing * missing
Definition: tupdesc.h:42
TupleConstr * constr
Definition: tupdesc.h:134

References AttrMissing::am_present, AttrMissing::am_value, TupleDescData::constr, TupleConstr::missing, TupleTableSlot::tts_isnull, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by slot_getsomeattrs_int().

◆ slot_getsomeattrs()

static void slot_getsomeattrs ( TupleTableSlot slot,
int  attnum 
)
inlinestatic

◆ slot_getsomeattrs_int()

void slot_getsomeattrs_int ( TupleTableSlot slot,
int  attnum 
)

Definition at line 2089 of file execTuples.c.

2090{
2091 /* Check for caller errors */
2092 Assert(slot->tts_nvalid < attnum); /* checked in slot_getsomeattrs */
2093 Assert(attnum > 0);
2094
2096 elog(ERROR, "invalid attribute number %d", attnum);
2097
2098 /* Fetch as many attributes as possible from the underlying tuple. */
2099 slot->tts_ops->getsomeattrs(slot, attnum);
2100
2101 /*
2102 * If the underlying tuple doesn't have enough attributes, tuple
2103 * descriptor must have the missing attributes.
2104 */
2105 if (unlikely(slot->tts_nvalid < attnum))
2106 {
2108 slot->tts_nvalid = attnum;
2109 }
2110}
void slot_getmissingattrs(TupleTableSlot *slot, int startAttNum, int lastAttNum)
Definition: execTuples.c:2055
void(* getsomeattrs)(TupleTableSlot *slot, int natts)
Definition: tuptable.h:160

References Assert, attnum, elog, ERROR, TupleTableSlotOps::getsomeattrs, TupleDescData::natts, slot_getmissingattrs(), TupleTableSlot::tts_nvalid, TupleTableSlot::tts_ops, TupleTableSlot::tts_tupleDescriptor, and unlikely.

Referenced by slot_getsomeattrs().

◆ slot_getsysattr()

static Datum slot_getsysattr ( TupleTableSlot slot,
int  attnum,
bool *  isnull 
)
inlinestatic

Definition at line 416 of file tuptable.h.

417{
418 Assert(attnum < 0); /* caller error */
419
421 {
422 *isnull = false;
423 return ObjectIdGetDatum(slot->tts_tableOid);
424 }
426 {
427 *isnull = false;
428 return PointerGetDatum(&slot->tts_tid);
429 }
430
431 /* Fetch the system attribute from the underlying tuple. */
432 return slot->tts_ops->getsysattr(slot, attnum, isnull);
433}
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:327
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:257
Datum(* getsysattr)(TupleTableSlot *slot, int attnum, bool *isnull)
Definition: tuptable.h:167
ItemPointerData tts_tid
Definition: tuptable.h:129
#define TableOidAttributeNumber
Definition: sysattr.h:26
#define SelfItemPointerAttributeNumber
Definition: sysattr.h:21

References Assert, attnum, TupleTableSlotOps::getsysattr, ObjectIdGetDatum(), PointerGetDatum(), SelfItemPointerAttributeNumber, TableOidAttributeNumber, TupleTableSlot::tts_ops, TupleTableSlot::tts_tableOid, and TupleTableSlot::tts_tid.

Referenced by ExecCheckTupleVisible(), execCurrentOf(), ExecEvalSysVar(), ExecOnConflictUpdate(), FormIndexDatum(), and GetTupleTransactionInfo().

◆ slot_is_current_xact_tuple()

static bool slot_is_current_xact_tuple ( TupleTableSlot slot)
inlinestatic

Definition at line 445 of file tuptable.h.

446{
447 return slot->tts_ops->is_current_xact_tuple(slot);
448}
bool(* is_current_xact_tuple)(TupleTableSlot *slot)
Definition: tuptable.h:173

References TupleTableSlotOps::is_current_xact_tuple, and TupleTableSlot::tts_ops.

Referenced by RI_FKey_fk_upd_check_required().

Variable Documentation

◆ TTSOpsBufferHeapTuple

PGDLLIMPORT const TupleTableSlotOps TTSOpsBufferHeapTuple
extern

◆ TTSOpsHeapTuple

◆ TTSOpsMinimalTuple

◆ TTSOpsVirtual