PostgreSQL Source Code git master
Loading...
Searching...
No Matches
execTuples.c File Reference
#include "postgres.h"
#include "access/heaptoast.h"
#include "access/htup_details.h"
#include "access/tupdesc_details.h"
#include "access/xact.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "nodes/nodeFuncs.h"
#include "storage/bufmgr.h"
#include "utils/builtins.h"
#include "utils/expandeddatum.h"
#include "utils/lsyscache.h"
#include "utils/typcache.h"
Include dependency graph for execTuples.c:

Go to the source code of this file.

Functions

static TupleDesc ExecTypeFromTLInternal (List *targetList, bool skipjunk)
 
static pg_attribute_always_inline void slot_deform_heap_tuple (TupleTableSlot *slot, HeapTuple tuple, uint32 *offp, int reqnatts, bool support_cstring)
 
static void tts_buffer_heap_store_tuple (TupleTableSlot *slot, HeapTuple tuple, Buffer buffer, bool transfer_pin)
 
static void tts_heap_store_tuple (TupleTableSlot *slot, HeapTuple tuple, bool shouldFree)
 
static void tts_virtual_init (TupleTableSlot *slot)
 
static void tts_virtual_release (TupleTableSlot *slot)
 
static void tts_virtual_clear (TupleTableSlot *slot)
 
static void tts_virtual_getsomeattrs (TupleTableSlot *slot, int natts)
 
static Datum tts_virtual_getsysattr (TupleTableSlot *slot, int attnum, bool *isnull)
 
static bool tts_virtual_is_current_xact_tuple (TupleTableSlot *slot)
 
static void tts_virtual_materialize (TupleTableSlot *slot)
 
static void tts_virtual_copyslot (TupleTableSlot *dstslot, TupleTableSlot *srcslot)
 
static HeapTuple tts_virtual_copy_heap_tuple (TupleTableSlot *slot)
 
static MinimalTuple tts_virtual_copy_minimal_tuple (TupleTableSlot *slot, Size extra)
 
static void tts_heap_init (TupleTableSlot *slot)
 
static void tts_heap_release (TupleTableSlot *slot)
 
static void tts_heap_clear (TupleTableSlot *slot)
 
static void tts_heap_getsomeattrs (TupleTableSlot *slot, int natts)
 
static Datum tts_heap_getsysattr (TupleTableSlot *slot, int attnum, bool *isnull)
 
static bool tts_heap_is_current_xact_tuple (TupleTableSlot *slot)
 
static void tts_heap_materialize (TupleTableSlot *slot)
 
static void tts_heap_copyslot (TupleTableSlot *dstslot, TupleTableSlot *srcslot)
 
static HeapTuple tts_heap_get_heap_tuple (TupleTableSlot *slot)
 
static HeapTuple tts_heap_copy_heap_tuple (TupleTableSlot *slot)
 
static MinimalTuple tts_heap_copy_minimal_tuple (TupleTableSlot *slot, Size extra)
 
static void tts_minimal_init (TupleTableSlot *slot)
 
static void tts_minimal_release (TupleTableSlot *slot)
 
static void tts_minimal_clear (TupleTableSlot *slot)
 
static void tts_minimal_getsomeattrs (TupleTableSlot *slot, int natts)
 
static Datum tts_minimal_getsysattr (TupleTableSlot *slot, int attnum, bool *isnull)
 
static bool tts_minimal_is_current_xact_tuple (TupleTableSlot *slot)
 
static void tts_minimal_materialize (TupleTableSlot *slot)
 
static void tts_minimal_copyslot (TupleTableSlot *dstslot, TupleTableSlot *srcslot)
 
static MinimalTuple tts_minimal_get_minimal_tuple (TupleTableSlot *slot)
 
static HeapTuple tts_minimal_copy_heap_tuple (TupleTableSlot *slot)
 
static MinimalTuple tts_minimal_copy_minimal_tuple (TupleTableSlot *slot, Size extra)
 
static void tts_minimal_store_tuple (TupleTableSlot *slot, MinimalTuple mtup, bool shouldFree)
 
static void tts_buffer_heap_init (TupleTableSlot *slot)
 
static void tts_buffer_heap_release (TupleTableSlot *slot)
 
static void tts_buffer_heap_clear (TupleTableSlot *slot)
 
static void tts_buffer_heap_getsomeattrs (TupleTableSlot *slot, int natts)
 
static Datum tts_buffer_heap_getsysattr (TupleTableSlot *slot, int attnum, bool *isnull)
 
static bool tts_buffer_is_current_xact_tuple (TupleTableSlot *slot)
 
static void tts_buffer_heap_materialize (TupleTableSlot *slot)
 
static void tts_buffer_heap_copyslot (TupleTableSlot *dstslot, TupleTableSlot *srcslot)
 
static HeapTuple tts_buffer_heap_get_heap_tuple (TupleTableSlot *slot)
 
static HeapTuple tts_buffer_heap_copy_heap_tuple (TupleTableSlot *slot)
 
static MinimalTuple tts_buffer_heap_copy_minimal_tuple (TupleTableSlot *slot, Size extra)
 
TupleTableSlotMakeTupleTableSlot (TupleDesc tupleDesc, const TupleTableSlotOps *tts_ops, uint16 flags)
 
TupleTableSlotExecAllocTableSlot (List **tupleTable, TupleDesc desc, const TupleTableSlotOps *tts_ops, uint16 flags)
 
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)
 
TupleTableSlotExecStoreBufferHeapTuple (HeapTuple tuple, TupleTableSlot *slot, Buffer buffer)
 
TupleTableSlotExecStorePinnedBufferHeapTuple (HeapTuple tuple, TupleTableSlot *slot, Buffer buffer)
 
TupleTableSlotExecStoreMinimalTuple (MinimalTuple mtup, TupleTableSlot *slot, bool shouldFree)
 
void ExecForceStoreHeapTuple (HeapTuple tuple, 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 ExecInitResultTypeTL (PlanState *planstate)
 
void ExecInitResultSlot (PlanState *planstate, const TupleTableSlotOps *tts_ops)
 
void ExecInitResultTupleSlotTL (PlanState *planstate, const TupleTableSlotOps *tts_ops)
 
void ExecInitScanTupleSlot (EState *estate, ScanState *scanstate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops, uint16 flags)
 
TupleTableSlotExecInitExtraTupleSlot (EState *estate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
 
TupleTableSlotExecInitNullTupleSlot (EState *estate, TupleDesc tupType, const TupleTableSlotOps *tts_ops)
 
void slot_getmissingattrs (TupleTableSlot *slot, int startAttNum, int lastAttNum)
 
void slot_getsomeattrs_int (TupleTableSlot *slot, int attnum)
 
TupleDesc ExecTypeFromTL (List *targetList)
 
TupleDesc ExecCleanTypeFromTL (List *targetList)
 
TupleDesc ExecTypeFromExprList (List *exprList)
 
void ExecTypeSetColNames (TupleDesc typeInfo, List *namesList)
 
TupleDesc BlessTupleDesc (TupleDesc tupdesc)
 
AttInMetadataTupleDescGetAttInMetadata (TupleDesc tupdesc)
 
HeapTuple BuildTupleFromCStrings (AttInMetadata *attinmeta, char **values)
 
Datum HeapTupleHeaderGetDatum (HeapTupleHeader tuple)
 
TupOutputStatebegin_tup_output_tupdesc (DestReceiver *dest, TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
 
void do_tup_output (TupOutputState *tstate, const Datum *values, const bool *isnull)
 
void do_text_output_multiline (TupOutputState *tstate, const char *txt)
 
void end_tup_output (TupOutputState *tstate)
 

Variables

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

Function Documentation

◆ begin_tup_output_tupdesc()

TupOutputState * begin_tup_output_tupdesc ( DestReceiver dest,
TupleDesc  tupdesc,
const TupleTableSlotOps tts_ops 
)

Definition at line 2525 of file execTuples.c.

2528{
2530
2532
2533 tstate->slot = MakeSingleTupleTableSlot(tupdesc, tts_ops);
2534 tstate->dest = dest;
2535
2536 tstate->dest->rStartup(tstate->dest, (int) CMD_SELECT, tupdesc);
2537
2538 return tstate;
2539}
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
#define palloc_object(type)
Definition fe_memutils.h:74
@ CMD_SELECT
Definition nodes.h:275
static int fb(int x)

References CMD_SELECT, fb(), MakeSingleTupleTableSlot(), and palloc_object.

Referenced by CreateReplicationSlot(), ExecuteCallStmt(), ExecWaitStmt(), ExplainQuery(), IdentifySystem(), ReadReplicationSlot(), SendTablespaceList(), SendXlogRecPtrResult(), ShowAllGUCConfig(), ShowGUCConfigOption(), and StartReplication().

◆ BlessTupleDesc()

TupleDesc BlessTupleDesc ( TupleDesc  tupdesc)

Definition at line 2338 of file execTuples.c.

2339{
2340 /* Did someone forget to call TupleDescFinalize()? */
2341 Assert(tupdesc->firstNonCachedOffsetAttr >= 0);
2342
2343 if (tupdesc->tdtypeid == RECORDOID &&
2344 tupdesc->tdtypmod < 0)
2346
2347 return tupdesc; /* just for notational convenience */
2348}
#define Assert(condition)
Definition c.h:945
int firstNonCachedOffsetAttr
Definition tupdesc.h:154
int32 tdtypmod
Definition tupdesc.h:152
void assign_record_type_typmod(TupleDesc tupDesc)
Definition typcache.c:2067

References Assert, assign_record_type_typmod(), fb(), TupleDescData::firstNonCachedOffsetAttr, TupleDescData::tdtypeid, and TupleDescData::tdtypmod.

Referenced by aclexplode(), BeginCopyTo(), brin_metapage_info(), bt_page_items_bytea(), bt_page_items_internal(), exec_eval_datum(), ExecEvalWholeRowVar(), ExecInitExprRec(), ExecInitFunctionScan(), get_expr_result_type(), hash_bitmap_info(), hash_metapage_info(), hash_page_items(), hash_page_stats(), init_execution_state(), InitMaterializedSRF(), pg_buffercache_os_pages_internal(), pg_buffercache_pages(), pg_get_catalog_foreign_keys(), pg_get_publication_tables(), pg_get_sequence_data(), pg_lock_status(), pg_prepared_xact(), pg_stat_file(), pg_stat_get_archiver(), pg_stat_get_backend_subxact(), pg_stat_get_replication_slot(), pg_stat_get_subscription_stats(), pg_stat_wal_build_tuple(), pg_stats_ext_mcvlist_items(), pg_visibility_tupdesc(), pg_walfile_name_offset(), pgstathashindex(), PLy_output_setup_record(), setup_firstcall(), ssl_extension_info(), test_custom_stats_fixed_report(), test_custom_stats_var_report(), test_enc_conversion(), test_predtest(), and TupleDescGetAttInMetadata().

◆ BuildTupleFromCStrings()

HeapTuple BuildTupleFromCStrings ( AttInMetadata attinmeta,
char **  values 
)

Definition at line 2405 of file execTuples.c.

2406{
2407 TupleDesc tupdesc = attinmeta->tupdesc;
2408 int natts = tupdesc->natts;
2409 Datum *dvalues;
2410 bool *nulls;
2411 int i;
2412 HeapTuple tuple;
2413
2414 dvalues = (Datum *) palloc(natts * sizeof(Datum));
2415 nulls = (bool *) palloc(natts * sizeof(bool));
2416
2417 /*
2418 * Call the "in" function for each non-dropped attribute, even for nulls,
2419 * to support domains.
2420 */
2421 for (i = 0; i < natts; i++)
2422 {
2423 if (!TupleDescCompactAttr(tupdesc, i)->attisdropped)
2424 {
2425 /* Non-dropped attributes */
2426 dvalues[i] = InputFunctionCall(&attinmeta->attinfuncs[i],
2427 values[i],
2428 attinmeta->attioparams[i],
2429 attinmeta->atttypmods[i]);
2430 if (values[i] != NULL)
2431 nulls[i] = false;
2432 else
2433 nulls[i] = true;
2434 }
2435 else
2436 {
2437 /* Handle dropped attributes by setting to NULL */
2438 dvalues[i] = (Datum) 0;
2439 nulls[i] = true;
2440 }
2441 }
2442
2443 /*
2444 * Form a tuple
2445 */
2446 tuple = heap_form_tuple(tupdesc, dvalues, nulls);
2447
2448 /*
2449 * Release locally palloc'd space. XXX would probably be good to pfree
2450 * values of pass-by-reference datums, as well.
2451 */
2452 pfree(dvalues);
2453 pfree(nulls);
2454
2455 return tuple;
2456}
static Datum values[MAXATTR]
Definition bootstrap.c:188
Datum InputFunctionCall(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod)
Definition fmgr.c:1532
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition heaptuple.c:1037
int i
Definition isn.c:77
void pfree(void *pointer)
Definition mcxt.c:1616
void * palloc(Size size)
Definition mcxt.c:1387
uint64_t Datum
Definition postgres.h:70
FmgrInfo * attinfuncs
Definition funcapi.h:41
TupleDesc tupdesc
Definition funcapi.h:38
Oid * attioparams
Definition funcapi.h:44
int32 * atttypmods
Definition funcapi.h:47
bool attisdropped
Definition tupdesc.h:78
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:193

References AttInMetadata::attinfuncs, AttInMetadata::attioparams, CompactAttribute::attisdropped, AttInMetadata::atttypmods, fb(), heap_form_tuple(), i, InputFunctionCall(), TupleDescData::natts, palloc(), pfree(), AttInMetadata::tupdesc, TupleDescCompactAttr(), and values.

Referenced by bt_metap(), bt_multi_page_stats(), bt_page_stats_internal(), build_pgstattuple_type(), build_tuplestore_recursively(), crosstab(), dblink_get_pkey(), get_crosstab_tuplestore(), libpqrcv_processTuples(), materializeQueryResult(), materializeResult(), pg_get_keywords(), pg_get_multixact_members(), pgp_armor_headers(), pgrowlocks(), pgstatindex_impl(), pltcl_build_tuple_result(), prs_process_call(), show_all_settings(), storeRow(), ts_process_call(), tt_process_call(), and xpath_table().

◆ do_text_output_multiline()

void do_text_output_multiline ( TupOutputState tstate,
const char txt 
)

Definition at line 2573 of file execTuples.c.

2574{
2575 Datum values[1];
2576 bool isnull[1] = {false};
2577
2578 while (*txt)
2579 {
2580 const char *eol;
2581 int len;
2582
2583 eol = strchr(txt, '\n');
2584 if (eol)
2585 {
2586 len = eol - txt;
2587 eol++;
2588 }
2589 else
2590 {
2591 len = strlen(txt);
2592 eol = txt + len;
2593 }
2594
2596 do_tup_output(tstate, values, isnull);
2598 txt = eol;
2599 }
2600}
void do_tup_output(TupOutputState *tstate, const Datum *values, const bool *isnull)
const void size_t len
static Datum PointerGetDatum(const void *X)
Definition postgres.h:342
static Pointer DatumGetPointer(Datum X)
Definition postgres.h:332
text * cstring_to_text_with_len(const char *s, int len)
Definition varlena.c:196

References cstring_to_text_with_len(), DatumGetPointer(), do_tup_output(), fb(), len, pfree(), PointerGetDatum(), and values.

Referenced by ExplainQuery().

◆ do_tup_output()

void do_tup_output ( TupOutputState tstate,
const Datum values,
const bool isnull 
)

Definition at line 2545 of file execTuples.c.

2546{
2547 TupleTableSlot *slot = tstate->slot;
2548 int natts = slot->tts_tupleDescriptor->natts;
2549
2550 /* make sure the slot is clear */
2551 ExecClearTuple(slot);
2552
2553 /* insert data */
2554 memcpy(slot->tts_values, values, natts * sizeof(Datum));
2555 memcpy(slot->tts_isnull, isnull, natts * sizeof(bool));
2556
2557 /* mark slot as containing a virtual tuple */
2559
2560 /* send the tuple to the receiver */
2561 (void) tstate->dest->receiveSlot(slot, tstate->dest);
2562
2563 /* clean up */
2564 ExecClearTuple(slot);
2565}
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
TupleDesc tts_tupleDescriptor
Definition tuptable.h:129
bool * tts_isnull
Definition tuptable.h:133
Datum * tts_values
Definition tuptable.h:131
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Definition tuptable.h:476

References ExecClearTuple(), ExecStoreVirtualTuple(), fb(), TupleDescData::natts, TupleTableSlot::tts_isnull, TupleTableSlot::tts_tupleDescriptor, TupleTableSlot::tts_values, and values.

Referenced by CreateReplicationSlot(), do_text_output_multiline(), IdentifySystem(), ReadReplicationSlot(), SendTablespaceList(), SendXlogRecPtrResult(), ShowAllGUCConfig(), and StartReplication().

◆ end_tup_output()

void end_tup_output ( TupOutputState tstate)

Definition at line 2603 of file execTuples.c.

2604{
2605 tstate->dest->rShutdown(tstate->dest);
2606 /* note that destroying the dest is not ours to do */
2608 pfree(tstate);
2609}
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)

References ExecDropSingleTupleTableSlot(), fb(), and pfree().

Referenced by CreateReplicationSlot(), ExecuteCallStmt(), ExecWaitStmt(), ExplainQuery(), IdentifySystem(), ReadReplicationSlot(), SendTablespaceList(), SendXlogRecPtrResult(), ShowAllGUCConfig(), ShowGUCConfigOption(), and StartReplication().

◆ ExecAllocTableSlot()

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

Definition at line 1430 of file execTuples.c.

1432{
1433 TupleTableSlot *slot = MakeTupleTableSlot(desc, tts_ops, flags);
1434
1435 *tupleTable = lappend(*tupleTable, slot);
1436
1437 return slot;
1438}
TupleTableSlot * MakeTupleTableSlot(TupleDesc tupleDesc, const TupleTableSlotOps *tts_ops, uint16 flags)
List * lappend(List *list, void *datum)
Definition list.c:339

References fb(), lappend(), and MakeTupleTableSlot().

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

◆ ExecCleanTypeFromTL()

TupleDesc ExecCleanTypeFromTL ( List targetList)

Definition at line 2210 of file execTuples.c.

2211{
2212 return ExecTypeFromTLInternal(targetList, true);
2213}
static TupleDesc ExecTypeFromTLInternal(List *targetList, bool skipjunk)

References ExecTypeFromTLInternal().

Referenced by ExecInitJunkFilter(), PlanCacheComputeResultDesc(), and PortalStart().

◆ ExecDropSingleTupleTableSlot()

void ExecDropSingleTupleTableSlot ( TupleTableSlot slot)

Definition at line 1513 of file execTuples.c.

1514{
1515 /* This should match ExecResetTupleTable's processing of one slot */
1516 Assert(IsA(slot, TupleTableSlot));
1517 ExecClearTuple(slot);
1518 slot->tts_ops->release(slot);
1519 if (slot->tts_tupleDescriptor)
1521 if (!TTS_FIXED(slot))
1522 {
1523 if (slot->tts_values)
1524 pfree(slot->tts_values);
1525 if (slot->tts_isnull)
1526 pfree(slot->tts_isnull);
1527 }
1528 pfree(slot);
1529}
#define IsA(nodeptr, _type_)
Definition nodes.h:164
void(* release)(TupleTableSlot *slot)
Definition tuptable.h:156
const TupleTableSlotOps *const tts_ops
Definition tuptable.h:127
#define ReleaseTupleDesc(tupdesc)
Definition tupdesc.h:238
#define TTS_FIXED(slot)
Definition tuptable.h:108

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_pub_dead_tuple_retention(), check_publications(), check_publications_origin_sequences(), check_publications_origin_tables(), compute_expr_stats(), compute_index_stats(), copy_sequences(), CopyMultiInsertBufferCleanup(), CopyRelationTo(), copyTemplateDependencies(), DefineTSConfiguration(), deleteSplitPartitionContext(), end_tup_output(), EnumValuesCreate(), ExecCleanupTupleRouting(), ExecEndIncrementalSort(), ExecEndModifyTable(), fetch_relation_list(), fetch_remote_table_info(), 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(), MergePartitionsMoveRows(), pgoutput_change(), recordMultipleDependencies(), RelationFindDeletedTupleInfoByIndex(), RelationFindDeletedTupleInfoSeq(), RelationFindReplTupleSeq(), RI_Initial_Check(), RunFromStore(), SplitPartitionMoveRows(), systable_endscan(), systable_endscan_ordered(), table_index_fetch_tuple_check(), tstoreShutdownReceiver(), unique_key_recheck(), validateDomainCheckConstraint(), validateDomainNotNullConstraint(), and validateForeignKeyConstraint().

◆ ExecFetchSlotHeapTuple()

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

Definition at line 1909 of file execTuples.c.

1910{
1911 /*
1912 * sanity checks
1913 */
1914 Assert(slot != NULL);
1915 Assert(!TTS_EMPTY(slot));
1916
1917 /* Materialize the tuple so that the slot "owns" it, if requested. */
1918 if (materialize)
1919 slot->tts_ops->materialize(slot);
1920
1921 if (slot->tts_ops->get_heap_tuple == NULL)
1922 {
1923 if (shouldFree)
1924 *shouldFree = true;
1925 return slot->tts_ops->copy_heap_tuple(slot);
1926 }
1927 else
1928 {
1929 if (shouldFree)
1930 *shouldFree = false;
1931 return slot->tts_ops->get_heap_tuple(slot);
1932 }
1933}
HeapTuple(* get_heap_tuple)(TupleTableSlot *slot)
Definition tuptable.h:209
HeapTuple(* copy_heap_tuple)(TupleTableSlot *slot)
Definition tuptable.h:227
void(* materialize)(TupleTableSlot *slot)
Definition tuptable.h:194
#define TTS_EMPTY(slot)
Definition tuptable.h:92

References Assert, TupleTableSlotOps::copy_heap_tuple, fb(), 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(), update_most_recent_deletion_info(), and validateForeignKeyConstraint().

◆ ExecFetchSlotHeapTupleDatum()

Datum ExecFetchSlotHeapTupleDatum ( TupleTableSlot slot)

Definition at line 1988 of file execTuples.c.

1989{
1990 HeapTuple tup;
1991 TupleDesc tupdesc;
1992 bool shouldFree;
1993 Datum ret;
1994
1995 /* Fetch slot's contents in regular-physical-tuple form */
1996 tup = ExecFetchSlotHeapTuple(slot, false, &shouldFree);
1997 tupdesc = slot->tts_tupleDescriptor;
1998
1999 /* Convert to Datum form */
2000 ret = heap_copy_tuple_as_datum(tup, tupdesc);
2001
2002 if (shouldFree)
2003 pfree(tup);
2004
2005 return ret;
2006}
HeapTuple ExecFetchSlotHeapTuple(TupleTableSlot *slot, bool materialize, bool *shouldFree)
Datum heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc)
Definition heaptuple.c:1001

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

Referenced by CopyToJsonOneRow(), ExecMakeFunctionResultSet(), and postquel_get_single_result().

◆ ExecFetchSlotMinimalTuple()

MinimalTuple ExecFetchSlotMinimalTuple ( TupleTableSlot slot,
bool shouldFree 
)

Definition at line 1957 of file execTuples.c.

1959{
1960 /*
1961 * sanity checks
1962 */
1963 Assert(slot != NULL);
1964 Assert(!TTS_EMPTY(slot));
1965
1966 if (slot->tts_ops->get_minimal_tuple)
1967 {
1968 if (shouldFree)
1969 *shouldFree = false;
1970 return slot->tts_ops->get_minimal_tuple(slot);
1971 }
1972 else
1973 {
1974 if (shouldFree)
1975 *shouldFree = true;
1976 return slot->tts_ops->copy_minimal_tuple(slot, 0);
1977 }
1978}
MinimalTuple(* copy_minimal_tuple)(TupleTableSlot *slot, Size extra)
Definition tuptable.h:241
MinimalTuple(* get_minimal_tuple)(TupleTableSlot *slot)
Definition tuptable.h:217

References Assert, TupleTableSlotOps::copy_minimal_tuple, fb(), 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 1734 of file execTuples.c.

1737{
1738 if (TTS_IS_HEAPTUPLE(slot))
1739 {
1740 ExecStoreHeapTuple(tuple, slot, shouldFree);
1741 }
1742 else if (TTS_IS_BUFFERTUPLE(slot))
1743 {
1746
1747 ExecClearTuple(slot);
1748 slot->tts_flags &= ~TTS_FLAG_EMPTY;
1750 bslot->base.tuple = heap_copytuple(tuple);
1753
1754 if (shouldFree)
1755 pfree(tuple);
1756 }
1757 else
1758 {
1759 ExecClearTuple(slot);
1761 slot->tts_values, slot->tts_isnull);
1763
1764 if (shouldFree)
1765 {
1766 ExecMaterializeSlot(slot);
1767 pfree(tuple);
1768 }
1769 }
1770}
TupleTableSlot * ExecStoreHeapTuple(HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
HeapTuple heap_copytuple(HeapTuple tuple)
Definition heaptuple.c:698
void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
Definition heaptuple.c:1266
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124
MemoryContext tts_mcxt
Definition tuptable.h:141
uint16 tts_flags
Definition tuptable.h:124
#define TTS_FLAG_SHOULDFREE
Definition tuptable.h:95
#define TTS_IS_BUFFERTUPLE(slot)
Definition tuptable.h:256
static void ExecMaterializeSlot(TupleTableSlot *slot)
Definition tuptable.h:494
#define TTS_IS_HEAPTUPLE(slot)
Definition tuptable.h:254

References ExecClearTuple(), ExecMaterializeSlot(), ExecStoreHeapTuple(), ExecStoreVirtualTuple(), fb(), 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 1777 of file execTuples.c.

1780{
1781 if (TTS_IS_MINIMALTUPLE(slot))
1782 {
1784 }
1785 else
1786 {
1787 HeapTupleData htup;
1788
1789 ExecClearTuple(slot);
1790
1791 htup.t_len = mtup->t_len + MINIMAL_TUPLE_OFFSET;
1792 htup.t_data = (HeapTupleHeader) ((char *) mtup - MINIMAL_TUPLE_OFFSET);
1794 slot->tts_values, slot->tts_isnull);
1796
1797 if (shouldFree)
1798 {
1799 ExecMaterializeSlot(slot);
1800 pfree(mtup);
1801 }
1802 }
1803}
static void tts_minimal_store_tuple(TupleTableSlot *slot, MinimalTuple mtup, bool shouldFree)
Definition execTuples.c:682
HeapTupleHeaderData * HeapTupleHeader
Definition htup.h:23
#define MINIMAL_TUPLE_OFFSET
uint32 t_len
Definition htup.h:64
HeapTupleHeader t_data
Definition htup.h:68
#define TTS_IS_MINIMALTUPLE(slot)
Definition tuptable.h:255

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

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

◆ ExecInitExtraTupleSlot()

◆ ExecInitNullTupleSlot()

TupleTableSlot * ExecInitNullTupleSlot ( EState estate,
TupleDesc  tupType,
const TupleTableSlotOps tts_ops 
)

Definition at line 2113 of file execTuples.c.

2115{
2116 TupleTableSlot *slot = ExecInitExtraTupleSlot(estate, tupType, tts_ops);
2117
2118 return ExecStoreAllNullTuple(slot);
2119}
TupleTableSlot * ExecInitExtraTupleSlot(EState *estate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
TupleTableSlot * ExecStoreAllNullTuple(TupleTableSlot *slot)

References ExecInitExtraTupleSlot(), ExecStoreAllNullTuple(), and fb().

Referenced by ExecInitHashJoin(), ExecInitMergeJoin(), and ExecInitNestLoop().

◆ ExecInitResultSlot()

void ExecInitResultSlot ( PlanState planstate,
const TupleTableSlotOps tts_ops 
)

Definition at line 2044 of file execTuples.c.

2045{
2046 TupleTableSlot *slot;
2047
2048 slot = ExecAllocTableSlot(&planstate->state->es_tupleTable,
2049 planstate->ps_ResultTupleDesc, tts_ops, 0);
2050 planstate->ps_ResultTupleSlot = slot;
2051
2052 planstate->resultopsfixed = planstate->ps_ResultTupleDesc != NULL;
2053 planstate->resultops = tts_ops;
2054 planstate->resultopsset = true;
2055}
const TupleTableSlotOps * resultops
Definition execnodes.h:1254
bool resultopsset
Definition execnodes.h:1262
EState * state
Definition execnodes.h:1179
TupleDesc ps_ResultTupleDesc
Definition execnodes.h:1214
TupleTableSlot * ps_ResultTupleSlot
Definition execnodes.h:1215
bool resultopsfixed
Definition execnodes.h:1258

References EState::es_tupleTable, ExecAllocTableSlot(), fb(), PlanState::ps_ResultTupleDesc, PlanState::ps_ResultTupleSlot, PlanState::resultops, PlanState::resultopsfixed, PlanState::resultopsset, and PlanState::state.

Referenced by ExecConditionalAssignProjectionInfo(), and ExecInitResultTupleSlotTL().

◆ ExecInitResultTupleSlotTL()

void ExecInitResultTupleSlotTL ( PlanState planstate,
const TupleTableSlotOps tts_ops 
)

◆ ExecInitResultTypeTL()

◆ ExecInitScanTupleSlot()

void ExecInitScanTupleSlot ( EState estate,
ScanState scanstate,
TupleDesc  tupledesc,
const TupleTableSlotOps tts_ops,
uint16  flags 
)

◆ ExecResetTupleTable()

void ExecResetTupleTable ( List tupleTable,
bool  shouldFree 
)

Definition at line 1450 of file execTuples.c.

1452{
1453 ListCell *lc;
1454
1455 foreach(lc, tupleTable)
1456 {
1458
1459 /* Always release resources and reset the slot to empty */
1460 ExecClearTuple(slot);
1461 slot->tts_ops->release(slot);
1462 if (slot->tts_tupleDescriptor)
1463 {
1465 slot->tts_tupleDescriptor = NULL;
1466 }
1467
1468 /* If shouldFree, release memory occupied by the slot itself */
1469 if (shouldFree)
1470 {
1471 if (!TTS_FIXED(slot))
1472 {
1473 if (slot->tts_values)
1474 pfree(slot->tts_values);
1475 if (slot->tts_isnull)
1476 pfree(slot->tts_isnull);
1477 }
1478 pfree(slot);
1479 }
1480 }
1481
1482 /* If shouldFree, release the list structure */
1483 if (shouldFree)
1485}
void list_free(List *list)
Definition list.c:1546
#define lfirst_node(type, lc)
Definition pg_list.h:176

References ExecClearTuple(), fb(), 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 1548 of file execTuples.c.

1550{
1551 Assert(!TTS_FIXED(slot));
1552
1553 /* For safety, make sure slot is empty before changing it */
1554 ExecClearTuple(slot);
1555
1556 /*
1557 * Release any old descriptor. Also release old Datum/isnull arrays if
1558 * present (we don't bother to check if they could be re-used).
1559 */
1560 if (slot->tts_tupleDescriptor)
1562
1563 if (slot->tts_values)
1564 pfree(slot->tts_values);
1565 if (slot->tts_isnull)
1566 pfree(slot->tts_isnull);
1567
1568 /*
1569 * Install the new descriptor; if it's refcounted, bump its refcount.
1570 */
1571 slot->tts_tupleDescriptor = tupdesc;
1572 PinTupleDesc(tupdesc);
1573
1574 /*
1575 * Allocate Datum/isnull arrays of the appropriate size. These must have
1576 * the same lifetime as the slot, so allocate in the slot's own context.
1577 */
1578 slot->tts_values = (Datum *)
1579 MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(Datum));
1580
1581 /*
1582 * We round the size of tts_isnull up to the next highest multiple of 8.
1583 * This is needed as populate_isnull_array() operates on 8 elements at a
1584 * time when converting a tuple's NULL bitmap into a boolean array.
1585 */
1586 slot->tts_isnull = (bool *)
1587 MemoryContextAlloc(slot->tts_mcxt, TYPEALIGN(8, tupdesc->natts * sizeof(bool)));
1588}
#define TYPEALIGN(ALIGNVAL, LEN)
Definition c.h:891
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition mcxt.c:1232
#define PinTupleDesc(tupdesc)
Definition tupdesc.h:232

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

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

◆ ExecStoreAllNullTuple()

TupleTableSlot * ExecStoreAllNullTuple ( TupleTableSlot slot)

Definition at line 1841 of file execTuples.c.

1842{
1843 /*
1844 * sanity checks
1845 */
1846 Assert(slot != NULL);
1848
1849 /* Clear any old contents */
1850 ExecClearTuple(slot);
1851
1852 /*
1853 * Fill all the columns of the virtual tuple with nulls
1854 */
1855 MemSet(slot->tts_values, 0,
1856 slot->tts_tupleDescriptor->natts * sizeof(Datum));
1857 memset(slot->tts_isnull, true,
1858 slot->tts_tupleDescriptor->natts * sizeof(bool));
1859
1860 return ExecStoreVirtualTuple(slot);
1861}
#define MemSet(start, val, len)
Definition c.h:1109

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

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

◆ ExecStoreBufferHeapTuple()

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

Definition at line 1657 of file execTuples.c.

1660{
1661 /*
1662 * sanity checks
1663 */
1664 Assert(tuple != NULL);
1665 Assert(slot != NULL);
1667 Assert(BufferIsValid(buffer));
1668
1669 if (unlikely(!TTS_IS_BUFFERTUPLE(slot)))
1670 elog(ERROR, "trying to store an on-disk heap tuple into wrong type of slot");
1671 tts_buffer_heap_store_tuple(slot, tuple, buffer, false);
1672
1673 slot->tts_tableOid = tuple->t_tableOid;
1674
1675 return slot;
1676}
static bool BufferIsValid(Buffer bufnum)
Definition bufmgr.h:421
#define unlikely(x)
Definition c.h:432
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
static void tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple, Buffer buffer, bool transfer_pin)
Definition execTuples.c:944
Oid t_tableOid
Definition htup.h:66

References Assert, BufferIsValid(), elog, ERROR, fb(), 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 1617 of file execTuples.c.

1620{
1621 /*
1622 * sanity checks
1623 */
1624 Assert(tuple != NULL);
1625 Assert(slot != NULL);
1627
1628 if (unlikely(!TTS_IS_HEAPTUPLE(slot)))
1629 elog(ERROR, "trying to store a heap tuple into wrong type of slot");
1630 tts_heap_store_tuple(slot, tuple, shouldFree);
1631
1632 slot->tts_tableOid = tuple->t_tableOid;
1633
1634 return slot;
1635}
static void tts_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple, bool shouldFree)
Definition execTuples.c:487

References Assert, elog, ERROR, fb(), 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 1871 of file execTuples.c.

1872{
1873 HeapTupleData tuple = {0};
1874 HeapTupleHeader td;
1875
1877
1879 tuple.t_self = td->t_ctid;
1880 tuple.t_data = td;
1881
1882 ExecClearTuple(slot);
1883
1885 slot->tts_values, slot->tts_isnull);
1887}
#define DatumGetHeapTupleHeader(X)
Definition fmgr.h:296
static uint32 HeapTupleHeaderGetDatumLength(const HeapTupleHeaderData *tup)
const void * data
ItemPointerData t_self
Definition htup.h:65
ItemPointerData t_ctid

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 1683 of file execTuples.c.

1686{
1687 /*
1688 * sanity checks
1689 */
1690 Assert(tuple != NULL);
1691 Assert(slot != NULL);
1693 Assert(BufferIsValid(buffer));
1694
1695 if (unlikely(!TTS_IS_BUFFERTUPLE(slot)))
1696 elog(ERROR, "trying to store an on-disk heap tuple into wrong type of slot");
1697 tts_buffer_heap_store_tuple(slot, tuple, buffer, true);
1698
1699 slot->tts_tableOid = tuple->t_tableOid;
1700
1701 return slot;
1702}

References Assert, BufferIsValid(), elog, ERROR, fb(), 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)

Definition at line 1817 of file execTuples.c.

1818{
1819 /*
1820 * sanity checks
1821 */
1822 Assert(slot != NULL);
1824 Assert(TTS_EMPTY(slot));
1825
1826 slot->tts_flags &= ~TTS_FLAG_EMPTY;
1827 slot->tts_nvalid = slot->tts_tupleDescriptor->natts;
1828
1829 return slot;
1830}
AttrNumber tts_nvalid
Definition tuptable.h:126

References Assert, fb(), TupleDescData::natts, TTS_EMPTY, TupleTableSlot::tts_flags, TupleTableSlot::tts_nvalid, and TupleTableSlot::tts_tupleDescriptor.

Referenced by agg_retrieve_hash_table_in_memory(), apply_returning_filter(), ATRewriteTable(), CopyFrom(), copyTemplateDependencies(), DefineTSConfiguration(), do_tup_output(), EnumValuesCreate(), ExecComputeStoredGenerated(), ExecEvalAggOrderedTransTuple(), ExecEvalPreOrderedDistinctMulti(), ExecFilterJunk(), ExecForceStoreHeapTuple(), ExecForceStoreMinimalTuple(), ExecProjectSRF(), ExecSort(), ExecStoreAllNullTuple(), ExecStoreHeapTupleDatum(), execute_attr_map_slot(), fileIterateForeignScan(), FunctionNext(), hashagg_spill_tuple(), hypothetical_dense_rank_final(), hypothetical_rank_common(), InsertPgAttributeTuples(), MakeConfigurationMapping(), MergePartitionsMoveRows(), ordered_set_transition_multi(), pgoutput_row_filter(), prepare_hash_slot(), prepare_probe_slot(), recordMultipleDependencies(), RI_Initial_Check(), RI_PartitionRemove_Check(), slot_modify_data(), slot_store_data(), SplitPartitionMoveRows(), StoreIndexTuple(), and ValuesNext().

◆ ExecTypeFromExprList()

TupleDesc ExecTypeFromExprList ( List exprList)

Definition at line 2259 of file execTuples.c.

2260{
2262 ListCell *lc;
2263 int cur_resno = 1;
2264
2266
2267 foreach(lc, exprList)
2268 {
2269 Node *e = lfirst(lc);
2270
2272 cur_resno,
2273 NULL,
2274 exprType(e),
2275 exprTypmod(e),
2276 0);
2278 cur_resno,
2279 exprCollation(e));
2280 cur_resno++;
2281 }
2282
2284
2285 return typeInfo;
2286}
Oid exprType(const Node *expr)
Definition nodeFuncs.c:42
int32 exprTypmod(const Node *expr)
Definition nodeFuncs.c:304
Oid exprCollation(const Node *expr)
Definition nodeFuncs.c:826
#define lfirst(lc)
Definition pg_list.h:172
static int list_length(const List *l)
Definition pg_list.h:152
e
Definition nodes.h:135
TupleDesc CreateTemplateTupleDesc(int natts)
Definition tupdesc.c:165
void TupleDescFinalize(TupleDesc tupdesc)
Definition tupdesc.c:508
void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
Definition tupdesc.c:1081
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
Definition tupdesc.c:897

References CreateTemplateTupleDesc(), exprCollation(), exprType(), exprTypmod(), fb(), lfirst, list_length(), TupleDescFinalize(), TupleDescInitEntry(), and TupleDescInitEntryCollation().

Referenced by ExecInitExprRec(), ExecInitMemoize(), and ExecInitValuesScan().

◆ ExecTypeFromTL()

◆ ExecTypeFromTLInternal()

static TupleDesc ExecTypeFromTLInternal ( List targetList,
bool  skipjunk 
)
static

Definition at line 2216 of file execTuples.c.

2217{
2219 ListCell *l;
2220 int len;
2221 int cur_resno = 1;
2222
2223 if (skipjunk)
2224 len = ExecCleanTargetListLength(targetList);
2225 else
2226 len = ExecTargetListLength(targetList);
2228
2229 foreach(l, targetList)
2230 {
2231 TargetEntry *tle = lfirst(l);
2232
2233 if (skipjunk && tle->resjunk)
2234 continue;
2236 cur_resno,
2237 tle->resname,
2238 exprType((Node *) tle->expr),
2239 exprTypmod((Node *) tle->expr),
2240 0);
2242 cur_resno,
2243 exprCollation((Node *) tle->expr));
2244 cur_resno++;
2245 }
2246
2248
2249 return typeInfo;
2250}
int ExecTargetListLength(List *targetlist)
Definition execUtils.c:1180
int ExecCleanTargetListLength(List *targetlist)
Definition execUtils.c:1190

References CreateTemplateTupleDesc(), ExecCleanTargetListLength(), ExecTargetListLength(), exprCollation(), exprType(), exprTypmod(), fb(), len, lfirst, TupleDescFinalize(), TupleDescInitEntry(), and TupleDescInitEntryCollation().

Referenced by ExecCleanTypeFromTL(), and ExecTypeFromTL().

◆ ExecTypeSetColNames()

void ExecTypeSetColNames ( TupleDesc  typeInfo,
List namesList 
)

Definition at line 2294 of file execTuples.c.

2295{
2296 int colno = 0;
2297 ListCell *lc;
2298
2299 /* It's only OK to change col names in a not-yet-blessed RECORD type */
2300 Assert(typeInfo->tdtypeid == RECORDOID);
2301 Assert(typeInfo->tdtypmod < 0);
2302
2303 foreach(lc, namesList)
2304 {
2305 char *cname = strVal(lfirst(lc));
2306 Form_pg_attribute attr;
2307
2308 /* Guard against too-long names list (probably can't happen) */
2309 if (colno >= typeInfo->natts)
2310 break;
2311 attr = TupleDescAttr(typeInfo, colno);
2312 colno++;
2313
2314 /*
2315 * Do nothing for empty aliases or dropped columns (these cases
2316 * probably can't arise in RECORD types, either)
2317 */
2318 if (cname[0] == '\0' || attr->attisdropped)
2319 continue;
2320
2321 /* OK, assign the column name */
2322 namestrcpy(&(attr->attname), cname);
2323 }
2324}
void namestrcpy(Name name, const char *str)
Definition name.c:233
FormData_pg_attribute * Form_pg_attribute
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:178
#define strVal(v)
Definition value.h:82

References Assert, fb(), lfirst, namestrcpy(), strVal, and TupleDescAttr().

Referenced by ExecEvalWholeRowVar(), and ExecInitExprRec().

◆ HeapTupleHeaderGetDatum()

Datum HeapTupleHeaderGetDatum ( HeapTupleHeader  tuple)

Definition at line 2494 of file execTuples.c.

2495{
2496 Datum result;
2497 TupleDesc tupDesc;
2498
2499 /* No work if there are no external TOAST pointers in the tuple */
2500 if (!HeapTupleHeaderHasExternal(tuple))
2501 return PointerGetDatum(tuple);
2502
2503 /* Use the type data saved by heap_form_tuple to look up the rowtype */
2506
2507 /* And do the flattening */
2508 result = toast_flatten_tuple_to_datum(tuple,
2510 tupDesc);
2511
2512 ReleaseTupleDesc(tupDesc);
2513
2514 return result;
2515}
Datum toast_flatten_tuple_to_datum(HeapTupleHeader tup, uint32 tup_len, TupleDesc tupleDesc)
Definition heaptoast.c:449
static int32 HeapTupleHeaderGetTypMod(const HeapTupleHeaderData *tup)
#define HeapTupleHeaderHasExternal(tup)
static Oid HeapTupleHeaderGetTypeId(const HeapTupleHeaderData *tup)
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
Definition typcache.c:1947

References HeapTupleHeaderGetDatumLength(), HeapTupleHeaderGetTypeId(), HeapTupleHeaderGetTypMod(), HeapTupleHeaderHasExternal, lookup_rowtype_tupdesc(), PointerGetDatum(), ReleaseTupleDesc, and toast_flatten_tuple_to_datum().

Referenced by HeapTupleGetDatum(), populate_composite(), and populate_recordset_record().

◆ MakeSingleTupleTableSlot()

◆ MakeTupleTableSlot()

TupleTableSlot * MakeTupleTableSlot ( TupleDesc  tupleDesc,
const TupleTableSlotOps tts_ops,
uint16  flags 
)

Definition at line 1351 of file execTuples.c.

1353{
1354 Size basesz,
1355 allocsz;
1356 TupleTableSlot *slot;
1357
1358 basesz = tts_ops->base_slot_size;
1359
1360 /* Ensure callers don't have any way to set transient flags permanently */
1361 flags &= ~TTS_FLAGS_TRANSIENT;
1362
1363 /*
1364 * When a fixed descriptor is specified, we can reduce overhead by
1365 * allocating the entire slot in one go.
1366 *
1367 * We round the size of tts_isnull up to the next highest multiple of 8.
1368 * This is needed as populate_isnull_array() operates on 8 elements at a
1369 * time when converting a tuple's NULL bitmap into a boolean array.
1370 */
1371 if (tupleDesc)
1373 MAXALIGN(tupleDesc->natts * sizeof(Datum)) +
1374 TYPEALIGN(8, tupleDesc->natts * sizeof(bool));
1375 else
1376 allocsz = basesz;
1377
1378 slot = palloc0(allocsz);
1379 /* const for optimization purposes, OK to modify at allocation time */
1380 *((const TupleTableSlotOps **) &slot->tts_ops) = tts_ops;
1381 slot->type = T_TupleTableSlot;
1382 slot->tts_flags = TTS_FLAG_EMPTY | flags;
1383 if (tupleDesc != NULL)
1384 slot->tts_flags |= TTS_FLAG_FIXED;
1387 slot->tts_nvalid = 0;
1388
1389 if (tupleDesc != NULL)
1390 {
1391 slot->tts_values = (Datum *)
1392 (((char *) slot)
1393 + MAXALIGN(basesz));
1394
1395 slot->tts_isnull = (bool *)
1396 (((char *) slot)
1397 + MAXALIGN(basesz)
1398 + MAXALIGN(tupleDesc->natts * sizeof(Datum)));
1399
1401
1402 /*
1403 * Precalculate the maximum guaranteed attribute that has to exist in
1404 * every tuple which gets deformed into this slot. When the
1405 * TTS_FLAG_OBEYS_NOT_NULL_CONSTRAINTS flag is enabled, we simply take
1406 * the precalculated value from the tupleDesc, otherwise the
1407 * optimization is disabled, and we set the value to 0.
1408 */
1409 if ((flags & TTS_FLAG_OBEYS_NOT_NULL_CONSTRAINTS) != 0)
1410 slot->tts_first_nonguaranteed = tupleDesc->firstNonGuaranteedAttr;
1411 else
1412 slot->tts_first_nonguaranteed = 0;
1413 }
1414
1415 /*
1416 * And allow slot type specific initialization.
1417 */
1418 slot->tts_ops->init(slot);
1419
1420 return slot;
1421}
#define MAXALIGN(LEN)
Definition c.h:898
size_t Size
Definition c.h:691
void * palloc0(Size size)
Definition mcxt.c:1417
MemoryContext CurrentMemoryContext
Definition mcxt.c:160
size_t base_slot_size
Definition tuptable.h:150
void(* init)(TupleTableSlot *slot)
Definition tuptable.h:153
NodeTag type
Definition tuptable.h:122
int tts_first_nonguaranteed
Definition tuptable.h:136
#define TTS_FLAG_EMPTY
Definition tuptable.h:91
#define TTS_FLAG_FIXED
Definition tuptable.h:107
#define TTS_FLAG_OBEYS_NOT_NULL_CONSTRAINTS
Definition tuptable.h:102

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

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

◆ slot_deform_heap_tuple()

static pg_attribute_always_inline void slot_deform_heap_tuple ( TupleTableSlot slot,
HeapTuple  tuple,
uint32 offp,
int  reqnatts,
bool  support_cstring 
)
static

Definition at line 1017 of file execTuples.c.

1019{
1023 HeapTupleHeader tup = tuple->t_data;
1024 size_t attnum;
1026 int firstNonGuaranteedAttr;
1027 int firstNullAttr;
1028 int natts;
1029 Datum *values;
1030 bool *isnull;
1031 char *tp; /* ptr to tuple data */
1032 uint32 off; /* offset in tuple data */
1033
1034 /* Did someone forget to call TupleDescFinalize()? */
1035 Assert(tupleDesc->firstNonCachedOffsetAttr >= 0);
1036
1037 isnull = slot->tts_isnull;
1038
1039 /*
1040 * Some callers may form and deform tuples prior to NOT NULL constraints
1041 * being checked. Here we'd like to optimize the case where we only need
1042 * to fetch attributes before or up to the point where the attribute is
1043 * guaranteed to exist in the tuple. We rely on the slot flag being set
1044 * correctly to only enable this optimization when it's valid to do so.
1045 * This optimization allows us to save fetching the number of attributes
1046 * from the tuple and saves the additional cost of handling non-byval
1047 * attrs.
1048 */
1049 firstNonGuaranteedAttr = Min(reqnatts, slot->tts_first_nonguaranteed);
1050
1051 firstNonCacheOffsetAttr = tupleDesc->firstNonCachedOffsetAttr;
1052
1053 if (HeapTupleHasNulls(tuple))
1054 {
1056 tp = (char *) tup + MAXALIGN(offsetof(HeapTupleHeaderData, t_bits) +
1057 BITMAPLEN(natts));
1058
1059 natts = Min(natts, reqnatts);
1060 if (natts > firstNonGuaranteedAttr)
1061 {
1062 bits8 *bp = tup->t_bits;
1063
1064 /* Find the first NULL attr */
1066
1067 /*
1068 * And populate the isnull array for all attributes being fetched
1069 * from the tuple.
1070 */
1071 populate_isnull_array(bp, natts, isnull);
1072 }
1073 else
1074 {
1075 /* Otherwise all required columns are guaranteed to exist */
1076 firstNullAttr = natts;
1077 }
1078 }
1079 else
1080 {
1081 tp = (char *) tup + MAXALIGN(offsetof(HeapTupleHeaderData, t_bits));
1082
1083 /*
1084 * We only need to look at the tuple's natts if we need more than the
1085 * guaranteed number of columns
1086 */
1087 if (reqnatts > firstNonGuaranteedAttr)
1089 else
1090 {
1091 /* No need to access the number of attributes in the tuple */
1092 natts = reqnatts;
1093 }
1094
1095 /* All attrs can be fetched without checking for NULLs */
1096 firstNullAttr = natts;
1097 }
1098
1099 attnum = slot->tts_nvalid;
1100 values = slot->tts_values;
1101 slot->tts_nvalid = reqnatts;
1102
1103 /*
1104 * We store the tupleDesc's CompactAttribute array in 'cattrs' as gcc
1105 * seems to be unwilling to optimize accessing the CompactAttribute
1106 * element efficiently when accessing it via TupleDescCompactAttr().
1107 */
1108 cattrs = tupleDesc->compact_attrs;
1109
1110 /* Ensure we calculated tp correctly */
1111 Assert(tp == (char *) tup + tup->t_hoff);
1112
1113 if (attnum < firstNonGuaranteedAttr)
1114 {
1115 int attlen;
1116
1117 do
1118 {
1119 isnull[attnum] = false;
1120 cattr = &cattrs[attnum];
1121 attlen = cattr->attlen;
1122
1123 /* We don't expect any non-byval types */
1124 pg_assume(attlen > 0);
1125 Assert(cattr->attbyval == true);
1126
1127 off = cattr->attcacheoff;
1128 values[attnum] = fetch_att_noerr(tp + off, true, attlen);
1129 attnum++;
1130 } while (attnum < firstNonGuaranteedAttr);
1131
1132 off += attlen;
1133
1134 if (attnum == reqnatts)
1135 goto done;
1136 }
1137 else
1138 {
1139 /*
1140 * We may be incrementally deforming the tuple, so set 'off' to the
1141 * previously cached value. This may be 0, if the slot has just
1142 * received a new tuple.
1143 */
1144 off = *offp;
1145
1146 /* We expect *offp to be set to 0 when attnum == 0 */
1147 Assert(off == 0 || attnum > 0);
1148 }
1149
1150 /* We can use attcacheoff up until the first NULL */
1152
1153 /*
1154 * Handle the portion of the tuple that we have cached the offset for up
1155 * to the first NULL attribute. The offset is effectively fixed for
1156 * these, so we can use the CompactAttribute's attcacheoff.
1157 */
1159 {
1160 int attlen;
1161
1162 do
1163 {
1164 isnull[attnum] = false;
1165 cattr = &cattrs[attnum];
1166 attlen = cattr->attlen;
1167 off = cattr->attcacheoff;
1168 values[attnum] = fetch_att_noerr(tp + off,
1169 cattr->attbyval,
1170 attlen);
1171 attnum++;
1172 } while (attnum < firstNonCacheOffsetAttr);
1173
1174 /*
1175 * Point the offset after the end of the last attribute with a cached
1176 * offset. We expect the final cached offset attribute to have a
1177 * fixed width, so just add the attlen to the attcacheoff
1178 */
1179 Assert(attlen > 0);
1180 off += attlen;
1181 }
1182
1183 /*
1184 * Handle any portion of the tuple that doesn't have a fixed offset up
1185 * until the first NULL attribute. This loop only differs from the one
1186 * after it by the NULL checks.
1187 */
1188 for (; attnum < firstNullAttr; attnum++)
1189 {
1190 int attlen;
1191
1192 isnull[attnum] = false;
1193 cattr = &cattrs[attnum];
1194 attlen = cattr->attlen;
1195
1196 /*
1197 * Only emit the cstring-related code in align_fetch_then_add() when
1198 * cstring support is needed. We assume support_cstring will be
1199 * passed as a const to allow the compiler to eliminate this branch.
1200 */
1201 if (!support_cstring)
1202 pg_assume(attlen > 0 || attlen == -1);
1203
1204 /* align 'off', fetch the datum, and increment off beyond the datum */
1206 &off,
1207 cattr->attbyval,
1208 attlen,
1209 cattr->attalignby);
1210 }
1211
1212 /*
1213 * Now handle any remaining attributes in the tuple up to the requested
1214 * attnum. This time, include NULL checks as we're now at the first NULL
1215 * attribute.
1216 */
1217 for (; attnum < natts; attnum++)
1218 {
1219 int attlen;
1220
1221 if (isnull[attnum])
1222 {
1223 values[attnum] = (Datum) 0;
1224 continue;
1225 }
1226
1227 cattr = &cattrs[attnum];
1228 attlen = cattr->attlen;
1229
1230 /* As above, only emit cstring code when needed. */
1231 if (!support_cstring)
1232 pg_assume(attlen > 0 || attlen == -1);
1233
1234 /* align 'off', fetch the datum, and increment off beyond the datum */
1236 &off,
1237 cattr->attbyval,
1238 attlen,
1239 cattr->attalignby);
1240 }
1241
1242 /* Fetch any missing attrs and raise an error if reqnatts is invalid */
1243 if (unlikely(attnum < reqnatts))
1244 {
1245 /*
1246 * Cache the offset before calling the function to allow the compiler
1247 * to implement a tail-call optimization
1248 */
1249 *offp = off;
1251 return;
1252 }
1253done:
1254
1255 /* Save current offset for next execution */
1256 *offp = off;
1257}
#define Min(x, y)
Definition c.h:1093
uint8 bits8
Definition c.h:625
#define pg_assume(expr)
Definition c.h:417
uint32_t uint32
Definition c.h:618
void slot_getmissingattrs(TupleTableSlot *slot, int startAttNum, int lastAttNum)
#define HeapTupleHeaderGetNatts(tup)
static bool HeapTupleHasNulls(const HeapTupleData *tuple)
static int BITMAPLEN(int NATTS)
int16 attnum
int16 attlen
static int first_null_attr(const bits8 *bits, int natts)
Definition tupmacs.h:244
static Datum align_fetch_then_add(const char *tupptr, uint32 *off, bool attbyval, int attlen, uint8 attalignby)
Definition tupmacs.h:172
static void populate_isnull_array(const bits8 *bits, int natts, bool *isnull)
Definition tupmacs.h:43
static Datum fetch_att_noerr(const void *T, bool attbyval, int attlen)
Definition tupmacs.h:137

References align_fetch_then_add(), Assert, attlen, attnum, BITMAPLEN(), fb(), fetch_att_noerr(), first_null_attr(), HeapTupleHasNulls(), HeapTupleHeaderGetNatts, MAXALIGN, Min, pg_assume, populate_isnull_array(), slot_getmissingattrs(), HeapTupleData::t_data, TupleTableSlot::tts_first_nonguaranteed, TupleTableSlot::tts_isnull, TupleTableSlot::tts_nvalid, TupleTableSlot::tts_tupleDescriptor, TupleTableSlot::tts_values, unlikely, and values.

Referenced by tts_buffer_heap_getsomeattrs(), tts_heap_getsomeattrs(), and tts_minimal_getsomeattrs().

◆ slot_getmissingattrs()

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

Definition at line 2134 of file execTuples.c.

2135{
2137
2138 /* Check for invalid attnums */
2140 elog(ERROR, "invalid attribute number %d", lastAttNum);
2141
2142 if (slot->tts_tupleDescriptor->constr)
2144
2145 if (!attrmiss)
2146 {
2147 /* no missing values array at all, so just fill everything in as NULL */
2148 for (int attnum = startAttNum; attnum < lastAttNum; attnum++)
2149 {
2150 slot->tts_values[attnum] = (Datum) 0;
2151 slot->tts_isnull[attnum] = true;
2152 }
2153 }
2154 else
2155 {
2156 /* use attrmiss to set the missing values */
2157 for (int attnum = startAttNum; attnum < lastAttNum; attnum++)
2158 {
2159 slot->tts_values[attnum] = attrmiss[attnum].am_value;
2160 slot->tts_isnull[attnum] = !attrmiss[attnum].am_present;
2161 }
2162 }
2163}
struct AttrMissing * missing
Definition tupdesc.h:42
TupleConstr * constr
Definition tupdesc.h:159

References attnum, TupleDescData::constr, elog, ERROR, fb(), TupleConstr::missing, TupleDescData::natts, TupleTableSlot::tts_isnull, TupleTableSlot::tts_tupleDescriptor, TupleTableSlot::tts_values, and unlikely.

Referenced by slot_deform_heap_tuple().

◆ slot_getsomeattrs_int()

void slot_getsomeattrs_int ( TupleTableSlot slot,
int  attnum 
)

Definition at line 2170 of file execTuples.c.

2171{
2172 /* Check for caller errors */
2173 Assert(slot->tts_nvalid < attnum); /* checked in slot_getsomeattrs */
2174 Assert(attnum > 0);
2175
2176 /* Fetch as many attributes as possible from the underlying tuple. */
2177 slot->tts_ops->getsomeattrs(slot, attnum);
2178
2179 /*
2180 * Avoid putting new code here as that would prevent the compiler from
2181 * using the sibling call optimization for the above function.
2182 */
2183}
void(* getsomeattrs)(TupleTableSlot *slot, int natts)
Definition tuptable.h:175

References Assert, attnum, TupleTableSlotOps::getsomeattrs, TupleTableSlot::tts_nvalid, and TupleTableSlot::tts_ops.

◆ tts_buffer_heap_clear()

static void tts_buffer_heap_clear ( TupleTableSlot slot)
static

Definition at line 721 of file execTuples.c.

722{
724
725 /*
726 * Free the memory for heap tuple if allowed. A tuple coming from buffer
727 * can never be freed. But we may have materialized a tuple from buffer.
728 * Such a tuple can be freed.
729 */
730 if (TTS_SHOULDFREE(slot))
731 {
732 /* We should have unpinned the buffer while materializing the tuple. */
733 Assert(!BufferIsValid(bslot->buffer));
734
735 heap_freetuple(bslot->base.tuple);
737 }
738
739 if (BufferIsValid(bslot->buffer))
740 ReleaseBuffer(bslot->buffer);
741
742 slot->tts_nvalid = 0;
743 slot->tts_flags |= TTS_FLAG_EMPTY;
745 bslot->base.tuple = NULL;
746 bslot->base.off = 0;
747 bslot->buffer = InvalidBuffer;
748}
#define InvalidBuffer
Definition buf.h:25
void ReleaseBuffer(Buffer buffer)
Definition bufmgr.c:5505
void heap_freetuple(HeapTuple htup)
Definition heaptuple.c:1384
static void ItemPointerSetInvalid(ItemPointerData *pointer)
Definition itemptr.h:184
ItemPointerData tts_tid
Definition tuptable.h:142
#define TTS_SHOULDFREE(slot)
Definition tuptable.h:96

References Assert, BufferIsValid(), fb(), heap_freetuple(), InvalidBuffer, ItemPointerSetInvalid(), ReleaseBuffer(), TTS_FLAG_EMPTY, TupleTableSlot::tts_flags, TupleTableSlot::tts_nvalid, TTS_SHOULDFREE, and TupleTableSlot::tts_tid.

◆ tts_buffer_heap_copy_heap_tuple()

static HeapTuple tts_buffer_heap_copy_heap_tuple ( TupleTableSlot slot)
static

Definition at line 918 of file execTuples.c.

919{
921
922 Assert(!TTS_EMPTY(slot));
923
924 if (!bslot->base.tuple)
926
927 return heap_copytuple(bslot->base.tuple);
928}
static void tts_buffer_heap_materialize(TupleTableSlot *slot)
Definition execTuples.c:804

References Assert, fb(), heap_copytuple(), tts_buffer_heap_materialize(), and TTS_EMPTY.

◆ tts_buffer_heap_copy_minimal_tuple()

static MinimalTuple tts_buffer_heap_copy_minimal_tuple ( TupleTableSlot slot,
Size  extra 
)
static

Definition at line 931 of file execTuples.c.

932{
934
935 Assert(!TTS_EMPTY(slot));
936
937 if (!bslot->base.tuple)
939
940 return minimal_tuple_from_heap_tuple(bslot->base.tuple, extra);
941}
MinimalTuple minimal_tuple_from_heap_tuple(HeapTuple htup, Size extra)
Definition heaptuple.c:1535

References Assert, fb(), minimal_tuple_from_heap_tuple(), tts_buffer_heap_materialize(), and TTS_EMPTY.

◆ tts_buffer_heap_copyslot()

static void tts_buffer_heap_copyslot ( TupleTableSlot dstslot,
TupleTableSlot srcslot 
)
static

Definition at line 863 of file execTuples.c.

864{
867
868 /*
869 * If the source slot is of a different kind, or is a buffer slot that has
870 * been materialized / is virtual, make a new copy of the tuple. Otherwise
871 * make a new reference to the in-buffer tuple.
872 */
873 if (dstslot->tts_ops != srcslot->tts_ops ||
875 !bsrcslot->base.tuple)
876 {
878
879 ExecClearTuple(dstslot);
880 dstslot->tts_flags &= ~TTS_FLAG_EMPTY;
883 dstslot->tts_flags |= TTS_FLAG_SHOULDFREE;
885 }
886 else
887 {
888 Assert(BufferIsValid(bsrcslot->buffer));
889
890 tts_buffer_heap_store_tuple(dstslot, bsrcslot->base.tuple,
891 bsrcslot->buffer, false);
892
893 /*
894 * The HeapTupleData portion of the source tuple might be shorter
895 * lived than the destination slot. Therefore copy the HeapTuple into
896 * our slot's tupdata, which is guaranteed to live long enough (but
897 * will still point into the buffer).
898 */
899 memcpy(&bdstslot->base.tupdata, bdstslot->base.tuple, sizeof(HeapTupleData));
900 bdstslot->base.tuple = &bdstslot->base.tupdata;
901 }
902}
static HeapTuple ExecCopySlotHeapTuple(TupleTableSlot *slot)
Definition tuptable.h:503

References Assert, BufferIsValid(), ExecClearTuple(), ExecCopySlotHeapTuple(), fb(), MemoryContextSwitchTo(), tts_buffer_heap_store_tuple(), TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, TupleTableSlot::tts_mcxt, TupleTableSlot::tts_ops, and TTS_SHOULDFREE.

◆ tts_buffer_heap_get_heap_tuple()

static HeapTuple tts_buffer_heap_get_heap_tuple ( TupleTableSlot slot)
static

Definition at line 905 of file execTuples.c.

906{
908
909 Assert(!TTS_EMPTY(slot));
910
911 if (!bslot->base.tuple)
913
914 return bslot->base.tuple;
915}

References Assert, fb(), tts_buffer_heap_materialize(), and TTS_EMPTY.

◆ tts_buffer_heap_getsomeattrs()

static void tts_buffer_heap_getsomeattrs ( TupleTableSlot slot,
int  natts 
)
static

Definition at line 751 of file execTuples.c.

752{
754
755 Assert(!TTS_EMPTY(slot));
756
757 slot_deform_heap_tuple(slot, bslot->base.tuple, &bslot->base.off, natts, false);
758}
static pg_attribute_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp, int reqnatts, bool support_cstring)

References Assert, fb(), slot_deform_heap_tuple(), and TTS_EMPTY.

◆ tts_buffer_heap_getsysattr()

static Datum tts_buffer_heap_getsysattr ( TupleTableSlot slot,
int  attnum,
bool isnull 
)
static

Definition at line 761 of file execTuples.c.

762{
764
765 Assert(!TTS_EMPTY(slot));
766
767 /*
768 * In some code paths it's possible to get here with a non-materialized
769 * slot, in which case we can't retrieve system columns.
770 */
771 if (!bslot->base.tuple)
774 errmsg("cannot retrieve a system column in this context")));
775
776 return heap_getsysattr(bslot->base.tuple, attnum,
777 slot->tts_tupleDescriptor, isnull);
778}
int errcode(int sqlerrcode)
Definition elog.c:874
#define ereport(elevel,...)
Definition elog.h:150
Datum heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
Definition heaptuple.c:645
static char * errmsg

References Assert, attnum, ereport, errcode(), errmsg, ERROR, fb(), heap_getsysattr(), TTS_EMPTY, and TupleTableSlot::tts_tupleDescriptor.

◆ tts_buffer_heap_init()

static void tts_buffer_heap_init ( TupleTableSlot slot)
static

Definition at line 711 of file execTuples.c.

712{
713}

◆ tts_buffer_heap_materialize()

static void tts_buffer_heap_materialize ( TupleTableSlot slot)
static

Definition at line 804 of file execTuples.c.

805{
808
809 Assert(!TTS_EMPTY(slot));
810
811 /* If slot has its tuple already materialized, nothing to do. */
812 if (TTS_SHOULDFREE(slot))
813 return;
814
816
817 /*
818 * Have to deform from scratch, otherwise tts_values[] entries could point
819 * into the non-materialized tuple (which might be gone when accessed).
820 */
821 bslot->base.off = 0;
822 slot->tts_nvalid = 0;
823
824 if (!bslot->base.tuple)
825 {
826 /*
827 * Normally BufferHeapTupleTableSlot should have a tuple + buffer
828 * associated with it, unless it's materialized (which would've
829 * returned above). But when it's useful to allow storing virtual
830 * tuples in a buffer slot, which then also needs to be
831 * materializable.
832 */
833 bslot->base.tuple = heap_form_tuple(slot->tts_tupleDescriptor,
834 slot->tts_values,
835 slot->tts_isnull);
836 }
837 else
838 {
839 bslot->base.tuple = heap_copytuple(bslot->base.tuple);
840
841 /*
842 * A heap tuple stored in a BufferHeapTupleTableSlot should have a
843 * buffer associated with it, unless it's materialized or virtual.
844 */
845 if (likely(BufferIsValid(bslot->buffer)))
846 ReleaseBuffer(bslot->buffer);
847 bslot->buffer = InvalidBuffer;
848 }
849
850 /*
851 * We don't set TTS_FLAG_SHOULDFREE until after releasing the buffer, if
852 * any. This avoids having a transient state that would fall foul of our
853 * assertions that a slot with TTS_FLAG_SHOULDFREE doesn't own a buffer.
854 * In the unlikely event that ReleaseBuffer() above errors out, we'd
855 * effectively leak the copied tuple, but that seems fairly harmless.
856 */
858
860}
#define likely(x)
Definition c.h:431

References Assert, BufferIsValid(), fb(), heap_copytuple(), heap_form_tuple(), InvalidBuffer, likely, MemoryContextSwitchTo(), ReleaseBuffer(), TTS_EMPTY, TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, TupleTableSlot::tts_isnull, TupleTableSlot::tts_mcxt, TupleTableSlot::tts_nvalid, TTS_SHOULDFREE, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by tts_buffer_heap_copy_heap_tuple(), tts_buffer_heap_copy_minimal_tuple(), and tts_buffer_heap_get_heap_tuple().

◆ tts_buffer_heap_release()

static void tts_buffer_heap_release ( TupleTableSlot slot)
static

Definition at line 716 of file execTuples.c.

717{
718}

◆ tts_buffer_heap_store_tuple()

static void tts_buffer_heap_store_tuple ( TupleTableSlot slot,
HeapTuple  tuple,
Buffer  buffer,
bool  transfer_pin 
)
inlinestatic

Definition at line 944 of file execTuples.c.

946{
948
949 if (TTS_SHOULDFREE(slot))
950 {
951 /* materialized slot shouldn't have a buffer to release */
952 Assert(!BufferIsValid(bslot->buffer));
953
954 heap_freetuple(bslot->base.tuple);
956 }
957
958 slot->tts_flags &= ~TTS_FLAG_EMPTY;
959 slot->tts_nvalid = 0;
960 bslot->base.tuple = tuple;
961 bslot->base.off = 0;
962 slot->tts_tid = tuple->t_self;
963
964 /*
965 * If tuple is on a disk page, keep the page pinned as long as we hold a
966 * pointer into it. We assume the caller already has such a pin. If
967 * transfer_pin is true, we'll transfer that pin to this slot, if not
968 * we'll pin it again ourselves.
969 *
970 * This is coded to optimize the case where the slot previously held a
971 * tuple on the same disk page: in that case releasing and re-acquiring
972 * the pin is a waste of cycles. This is a common situation during
973 * seqscans, so it's worth troubling over.
974 */
975 if (bslot->buffer != buffer)
976 {
977 if (BufferIsValid(bslot->buffer))
978 ReleaseBuffer(bslot->buffer);
979
980 bslot->buffer = buffer;
981
982 if (!transfer_pin && BufferIsValid(buffer))
983 IncrBufferRefCount(buffer);
984 }
985 else if (transfer_pin && BufferIsValid(buffer))
986 {
987 /*
988 * In transfer_pin mode the caller won't know about the same-page
989 * optimization, so we gotta release its pin.
990 */
991 ReleaseBuffer(buffer);
992 }
993}
void IncrBufferRefCount(Buffer buffer)
Definition bufmgr.c:5537

References Assert, BufferIsValid(), fb(), heap_freetuple(), IncrBufferRefCount(), ReleaseBuffer(), HeapTupleData::t_self, TupleTableSlot::tts_flags, TupleTableSlot::tts_nvalid, TTS_SHOULDFREE, and TupleTableSlot::tts_tid.

Referenced by ExecStoreBufferHeapTuple(), ExecStorePinnedBufferHeapTuple(), and tts_buffer_heap_copyslot().

◆ tts_buffer_is_current_xact_tuple()

static bool tts_buffer_is_current_xact_tuple ( TupleTableSlot slot)
static

Definition at line 781 of file execTuples.c.

782{
784 TransactionId xmin;
785
786 Assert(!TTS_EMPTY(slot));
787
788 /*
789 * In some code paths it's possible to get here with a non-materialized
790 * slot, in which case we can't check if tuple is created by the current
791 * transaction.
792 */
793 if (!bslot->base.tuple)
796 errmsg("don't have a storage tuple in this context")));
797
798 xmin = HeapTupleHeaderGetRawXmin(bslot->base.tuple->t_data);
799
801}
uint32 TransactionId
Definition c.h:738
static TransactionId HeapTupleHeaderGetRawXmin(const HeapTupleHeaderData *tup)
bool TransactionIdIsCurrentTransactionId(TransactionId xid)
Definition xact.c:943

References Assert, ereport, errcode(), errmsg, ERROR, fb(), HeapTupleHeaderGetRawXmin(), TransactionIdIsCurrentTransactionId(), and TTS_EMPTY.

◆ tts_heap_clear()

static void tts_heap_clear ( TupleTableSlot slot)
static

Definition at line 327 of file execTuples.c.

328{
330
331 /* Free the memory for the heap tuple if it's allowed. */
332 if (TTS_SHOULDFREE(slot))
333 {
334 heap_freetuple(hslot->tuple);
336 }
337
338 slot->tts_nvalid = 0;
339 slot->tts_flags |= TTS_FLAG_EMPTY;
341 hslot->off = 0;
342 hslot->tuple = NULL;
343}

References fb(), heap_freetuple(), ItemPointerSetInvalid(), TTS_FLAG_EMPTY, TupleTableSlot::tts_flags, TupleTableSlot::tts_nvalid, TTS_SHOULDFREE, and TupleTableSlot::tts_tid.

Referenced by tts_heap_store_tuple().

◆ tts_heap_copy_heap_tuple()

static HeapTuple tts_heap_copy_heap_tuple ( TupleTableSlot slot)
static

Definition at line 464 of file execTuples.c.

465{
467
468 Assert(!TTS_EMPTY(slot));
469 if (!hslot->tuple)
471
472 return heap_copytuple(hslot->tuple);
473}
static void tts_heap_materialize(TupleTableSlot *slot)
Definition execTuples.c:399

References Assert, fb(), heap_copytuple(), TTS_EMPTY, and tts_heap_materialize().

◆ tts_heap_copy_minimal_tuple()

static MinimalTuple tts_heap_copy_minimal_tuple ( TupleTableSlot slot,
Size  extra 
)
static

Definition at line 476 of file execTuples.c.

477{
479
480 if (!hslot->tuple)
482
483 return minimal_tuple_from_heap_tuple(hslot->tuple, extra);
484}

References fb(), minimal_tuple_from_heap_tuple(), and tts_heap_materialize().

◆ tts_heap_copyslot()

static void tts_heap_copyslot ( TupleTableSlot dstslot,
TupleTableSlot srcslot 
)
static

Definition at line 439 of file execTuples.c.

440{
441 HeapTuple tuple;
442 MemoryContext oldcontext;
443
444 oldcontext = MemoryContextSwitchTo(dstslot->tts_mcxt);
446 MemoryContextSwitchTo(oldcontext);
447
448 ExecStoreHeapTuple(tuple, dstslot, true);
449}

References ExecCopySlotHeapTuple(), ExecStoreHeapTuple(), fb(), MemoryContextSwitchTo(), and TupleTableSlot::tts_mcxt.

◆ tts_heap_get_heap_tuple()

static HeapTuple tts_heap_get_heap_tuple ( TupleTableSlot slot)
static

Definition at line 452 of file execTuples.c.

453{
455
456 Assert(!TTS_EMPTY(slot));
457 if (!hslot->tuple)
459
460 return hslot->tuple;
461}

References Assert, fb(), TTS_EMPTY, and tts_heap_materialize().

◆ tts_heap_getsomeattrs()

static void tts_heap_getsomeattrs ( TupleTableSlot slot,
int  natts 
)
static

Definition at line 346 of file execTuples.c.

347{
349
350 Assert(!TTS_EMPTY(slot));
351
352 slot_deform_heap_tuple(slot, hslot->tuple, &hslot->off, natts, false);
353}

References Assert, fb(), slot_deform_heap_tuple(), and TTS_EMPTY.

◆ tts_heap_getsysattr()

static Datum tts_heap_getsysattr ( TupleTableSlot slot,
int  attnum,
bool isnull 
)
static

Definition at line 356 of file execTuples.c.

357{
359
360 Assert(!TTS_EMPTY(slot));
361
362 /*
363 * In some code paths it's possible to get here with a non-materialized
364 * slot, in which case we can't retrieve system columns.
365 */
366 if (!hslot->tuple)
369 errmsg("cannot retrieve a system column in this context")));
370
371 return heap_getsysattr(hslot->tuple, attnum,
372 slot->tts_tupleDescriptor, isnull);
373}

References Assert, attnum, ereport, errcode(), errmsg, ERROR, fb(), heap_getsysattr(), TTS_EMPTY, and TupleTableSlot::tts_tupleDescriptor.

◆ tts_heap_init()

static void tts_heap_init ( TupleTableSlot slot)
static

Definition at line 317 of file execTuples.c.

318{
319}

◆ tts_heap_is_current_xact_tuple()

static bool tts_heap_is_current_xact_tuple ( TupleTableSlot slot)
static

Definition at line 376 of file execTuples.c.

377{
379 TransactionId xmin;
380
381 Assert(!TTS_EMPTY(slot));
382
383 /*
384 * In some code paths it's possible to get here with a non-materialized
385 * slot, in which case we can't check if tuple is created by the current
386 * transaction.
387 */
388 if (!hslot->tuple)
391 errmsg("don't have a storage tuple in this context")));
392
393 xmin = HeapTupleHeaderGetRawXmin(hslot->tuple->t_data);
394
396}

References Assert, ereport, errcode(), errmsg, ERROR, fb(), HeapTupleHeaderGetRawXmin(), TransactionIdIsCurrentTransactionId(), and TTS_EMPTY.

◆ tts_heap_materialize()

static void tts_heap_materialize ( TupleTableSlot slot)
static

Definition at line 399 of file execTuples.c.

400{
403
404 Assert(!TTS_EMPTY(slot));
405
406 /* If slot has its tuple already materialized, nothing to do. */
407 if (TTS_SHOULDFREE(slot))
408 return;
409
411
412 /*
413 * Have to deform from scratch, otherwise tts_values[] entries could point
414 * into the non-materialized tuple (which might be gone when accessed).
415 */
416 slot->tts_nvalid = 0;
417 hslot->off = 0;
418
419 if (!hslot->tuple)
421 slot->tts_values,
422 slot->tts_isnull);
423 else
424 {
425 /*
426 * The tuple contained in this slot is not allocated in the memory
427 * context of the given slot (else it would have TTS_FLAG_SHOULDFREE
428 * set). Copy the tuple into the given slot's memory context.
429 */
430 hslot->tuple = heap_copytuple(hslot->tuple);
431 }
432
434
436}

References Assert, fb(), heap_copytuple(), heap_form_tuple(), MemoryContextSwitchTo(), TTS_EMPTY, TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, TupleTableSlot::tts_isnull, TupleTableSlot::tts_mcxt, TupleTableSlot::tts_nvalid, TTS_SHOULDFREE, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by tts_heap_copy_heap_tuple(), tts_heap_copy_minimal_tuple(), and tts_heap_get_heap_tuple().

◆ tts_heap_release()

static void tts_heap_release ( TupleTableSlot slot)
static

Definition at line 322 of file execTuples.c.

323{
324}

◆ tts_heap_store_tuple()

static void tts_heap_store_tuple ( TupleTableSlot slot,
HeapTuple  tuple,
bool  shouldFree 
)
static

Definition at line 487 of file execTuples.c.

488{
490
491 tts_heap_clear(slot);
492
493 slot->tts_nvalid = 0;
494 hslot->tuple = tuple;
495 hslot->off = 0;
497 slot->tts_tid = tuple->t_self;
498
499 if (shouldFree)
501}
static void tts_heap_clear(TupleTableSlot *slot)
Definition execTuples.c:327

References fb(), HeapTupleData::t_self, TTS_FLAG_EMPTY, TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, tts_heap_clear(), TupleTableSlot::tts_nvalid, and TupleTableSlot::tts_tid.

Referenced by ExecStoreHeapTuple().

◆ tts_minimal_clear()

static void tts_minimal_clear ( TupleTableSlot slot)
static

Definition at line 526 of file execTuples.c.

527{
529
530 if (TTS_SHOULDFREE(slot))
531 {
534 }
535
536 slot->tts_nvalid = 0;
537 slot->tts_flags |= TTS_FLAG_EMPTY;
539 mslot->off = 0;
540 mslot->mintuple = NULL;
541}
void heap_free_minimal_tuple(MinimalTuple mtup)
Definition heaptuple.c:1478

References fb(), heap_free_minimal_tuple(), ItemPointerSetInvalid(), TTS_FLAG_EMPTY, TupleTableSlot::tts_flags, TupleTableSlot::tts_nvalid, TTS_SHOULDFREE, and TupleTableSlot::tts_tid.

Referenced by tts_minimal_store_tuple().

◆ tts_minimal_copy_heap_tuple()

static HeapTuple tts_minimal_copy_heap_tuple ( TupleTableSlot slot)
static

Definition at line 660 of file execTuples.c.

661{
663
664 if (!mslot->mintuple)
666
667 return heap_tuple_from_minimal_tuple(mslot->mintuple);
668}
static void tts_minimal_materialize(TupleTableSlot *slot)
Definition execTuples.c:587
HeapTuple heap_tuple_from_minimal_tuple(MinimalTuple mtup)
Definition heaptuple.c:1513

References fb(), heap_tuple_from_minimal_tuple(), and tts_minimal_materialize().

◆ tts_minimal_copy_minimal_tuple()

static MinimalTuple tts_minimal_copy_minimal_tuple ( TupleTableSlot slot,
Size  extra 
)
static

Definition at line 671 of file execTuples.c.

672{
674
675 if (!mslot->mintuple)
677
678 return heap_copy_minimal_tuple(mslot->mintuple, extra);
679}
MinimalTuple heap_copy_minimal_tuple(MinimalTuple mtup, Size extra)
Definition heaptuple.c:1490

References fb(), heap_copy_minimal_tuple(), and tts_minimal_materialize().

◆ tts_minimal_copyslot()

static void tts_minimal_copyslot ( TupleTableSlot dstslot,
TupleTableSlot srcslot 
)
static

Definition at line 636 of file execTuples.c.

637{
638 MemoryContext oldcontext;
639 MinimalTuple mintuple;
640
641 oldcontext = MemoryContextSwitchTo(dstslot->tts_mcxt);
643 MemoryContextSwitchTo(oldcontext);
644
645 ExecStoreMinimalTuple(mintuple, dstslot, true);
646}
TupleTableSlot * ExecStoreMinimalTuple(MinimalTuple mtup, TupleTableSlot *slot, bool shouldFree)
static MinimalTuple ExecCopySlotMinimalTuple(TupleTableSlot *slot)
Definition tuptable.h:514

References ExecCopySlotMinimalTuple(), ExecStoreMinimalTuple(), fb(), MemoryContextSwitchTo(), and TupleTableSlot::tts_mcxt.

◆ tts_minimal_get_minimal_tuple()

static MinimalTuple tts_minimal_get_minimal_tuple ( TupleTableSlot slot)
static

Definition at line 649 of file execTuples.c.

650{
652
653 if (!mslot->mintuple)
655
656 return mslot->mintuple;
657}

References fb(), and tts_minimal_materialize().

◆ tts_minimal_getsomeattrs()

static void tts_minimal_getsomeattrs ( TupleTableSlot slot,
int  natts 
)
static

Definition at line 544 of file execTuples.c.

545{
547
548 Assert(!TTS_EMPTY(slot));
549
550 slot_deform_heap_tuple(slot, mslot->tuple, &mslot->off, natts, true);
551}

References Assert, fb(), slot_deform_heap_tuple(), and TTS_EMPTY.

◆ tts_minimal_getsysattr()

static Datum tts_minimal_getsysattr ( TupleTableSlot slot,
int  attnum,
bool isnull 
)
static

Definition at line 558 of file execTuples.c.

559{
560 Assert(!TTS_EMPTY(slot));
561
564 errmsg("cannot retrieve a system column in this context")));
565
566 return 0; /* silence compiler warnings */
567}

References Assert, ereport, errcode(), errmsg, ERROR, fb(), and TTS_EMPTY.

◆ tts_minimal_init()

static void tts_minimal_init ( TupleTableSlot slot)
static

Definition at line 509 of file execTuples.c.

510{
512
513 /*
514 * Initialize the heap tuple pointer to access attributes of the minimal
515 * tuple contained in the slot as if its a heap tuple.
516 */
517 mslot->tuple = &mslot->minhdr;
518}

References fb().

◆ tts_minimal_is_current_xact_tuple()

static bool tts_minimal_is_current_xact_tuple ( TupleTableSlot slot)
static

Definition at line 575 of file execTuples.c.

576{
577 Assert(!TTS_EMPTY(slot));
578
581 errmsg("don't have transaction information for this type of tuple")));
582
583 return false; /* silence compiler warnings */
584}

References Assert, ereport, errcode(), errmsg, ERROR, fb(), and TTS_EMPTY.

◆ tts_minimal_materialize()

static void tts_minimal_materialize ( TupleTableSlot slot)
static

Definition at line 587 of file execTuples.c.

588{
591
592 Assert(!TTS_EMPTY(slot));
593
594 /* If slot has its tuple already materialized, nothing to do. */
595 if (TTS_SHOULDFREE(slot))
596 return;
597
599
600 /*
601 * Have to deform from scratch, otherwise tts_values[] entries could point
602 * into the non-materialized tuple (which might be gone when accessed).
603 */
604 slot->tts_nvalid = 0;
605 mslot->off = 0;
606
607 if (!mslot->mintuple)
608 {
610 slot->tts_values,
611 slot->tts_isnull,
612 0);
613 }
614 else
615 {
616 /*
617 * The minimal tuple contained in this slot is not allocated in the
618 * memory context of the given slot (else it would have
619 * TTS_FLAG_SHOULDFREE set). Copy the minimal tuple into the given
620 * slot's memory context.
621 */
622 mslot->mintuple = heap_copy_minimal_tuple(mslot->mintuple, 0);
623 }
624
626
627 Assert(mslot->tuple == &mslot->minhdr);
628
629 mslot->minhdr.t_len = mslot->mintuple->t_len + MINIMAL_TUPLE_OFFSET;
630 mslot->minhdr.t_data = (HeapTupleHeader) ((char *) mslot->mintuple - MINIMAL_TUPLE_OFFSET);
631
633}
MinimalTuple heap_form_minimal_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull, Size extra)
Definition heaptuple.c:1402

References Assert, fb(), heap_copy_minimal_tuple(), heap_form_minimal_tuple(), MemoryContextSwitchTo(), MINIMAL_TUPLE_OFFSET, TTS_EMPTY, TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, TupleTableSlot::tts_isnull, TupleTableSlot::tts_mcxt, TupleTableSlot::tts_nvalid, TTS_SHOULDFREE, TupleTableSlot::tts_tupleDescriptor, and TupleTableSlot::tts_values.

Referenced by tts_minimal_copy_heap_tuple(), tts_minimal_copy_minimal_tuple(), and tts_minimal_get_minimal_tuple().

◆ tts_minimal_release()

static void tts_minimal_release ( TupleTableSlot slot)
static

Definition at line 521 of file execTuples.c.

522{
523}

◆ tts_minimal_store_tuple()

static void tts_minimal_store_tuple ( TupleTableSlot slot,
MinimalTuple  mtup,
bool  shouldFree 
)
static

Definition at line 682 of file execTuples.c.

683{
685
686 tts_minimal_clear(slot);
687
688 Assert(!TTS_SHOULDFREE(slot));
689 Assert(TTS_EMPTY(slot));
690
691 slot->tts_flags &= ~TTS_FLAG_EMPTY;
692 slot->tts_nvalid = 0;
693 mslot->off = 0;
694
695 mslot->mintuple = mtup;
696 Assert(mslot->tuple == &mslot->minhdr);
697 mslot->minhdr.t_len = mtup->t_len + MINIMAL_TUPLE_OFFSET;
698 mslot->minhdr.t_data = (HeapTupleHeader) ((char *) mtup - MINIMAL_TUPLE_OFFSET);
699 /* no need to set t_self or t_tableOid since we won't allow access */
700
701 if (shouldFree)
703}
static void tts_minimal_clear(TupleTableSlot *slot)
Definition execTuples.c:526

References Assert, fb(), MINIMAL_TUPLE_OFFSET, TTS_EMPTY, TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, tts_minimal_clear(), TupleTableSlot::tts_nvalid, and TTS_SHOULDFREE.

Referenced by ExecForceStoreMinimalTuple(), and ExecStoreMinimalTuple().

◆ tts_virtual_clear()

static void tts_virtual_clear ( TupleTableSlot slot)
static

◆ tts_virtual_copy_heap_tuple()

static HeapTuple tts_virtual_copy_heap_tuple ( TupleTableSlot slot)
static

◆ tts_virtual_copy_minimal_tuple()

static MinimalTuple tts_virtual_copy_minimal_tuple ( TupleTableSlot slot,
Size  extra 
)
static

◆ tts_virtual_copyslot()

static void tts_virtual_copyslot ( TupleTableSlot dstslot,
TupleTableSlot srcslot 
)
static

Definition at line 269 of file execTuples.c.

270{
271 TupleDesc srcdesc = srcslot->tts_tupleDescriptor;
272
273 tts_virtual_clear(dstslot);
274
276
277 for (int natt = 0; natt < srcdesc->natts; natt++)
278 {
279 dstslot->tts_values[natt] = srcslot->tts_values[natt];
280 dstslot->tts_isnull[natt] = srcslot->tts_isnull[natt];
281 }
282
283 dstslot->tts_nvalid = srcdesc->natts;
284 dstslot->tts_flags &= ~TTS_FLAG_EMPTY;
285
286 /* make sure storage doesn't depend on external memory */
288}
static void tts_virtual_clear(TupleTableSlot *slot)
Definition execTuples.c:108
static void tts_virtual_materialize(TupleTableSlot *slot)
Definition execTuples.c:176
static void slot_getallattrs(TupleTableSlot *slot)
Definition tuptable.h:390

References fb(), slot_getallattrs(), TupleTableSlot::tts_flags, TupleTableSlot::tts_isnull, TupleTableSlot::tts_nvalid, TupleTableSlot::tts_values, tts_virtual_clear(), and tts_virtual_materialize().

◆ tts_virtual_getsomeattrs()

static void tts_virtual_getsomeattrs ( TupleTableSlot slot,
int  natts 
)
static

Definition at line 130 of file execTuples.c.

131{
132 elog(ERROR, "getsomeattrs is not required to be called on a virtual tuple table slot");
133}

References elog, and ERROR.

◆ tts_virtual_getsysattr()

static Datum tts_virtual_getsysattr ( TupleTableSlot slot,
int  attnum,
bool isnull 
)
static

Definition at line 141 of file execTuples.c.

142{
143 Assert(!TTS_EMPTY(slot));
144
147 errmsg("cannot retrieve a system column in this context")));
148
149 return 0; /* silence compiler warnings */
150}

References Assert, ereport, errcode(), errmsg, ERROR, fb(), and TTS_EMPTY.

◆ tts_virtual_init()

static void tts_virtual_init ( TupleTableSlot slot)
static

Definition at line 98 of file execTuples.c.

99{
100}

◆ tts_virtual_is_current_xact_tuple()

static bool tts_virtual_is_current_xact_tuple ( TupleTableSlot slot)
static

Definition at line 157 of file execTuples.c.

158{
159 Assert(!TTS_EMPTY(slot));
160
163 errmsg("don't have transaction information for this type of tuple")));
164
165 return false; /* silence compiler warnings */
166}

References Assert, ereport, errcode(), errmsg, ERROR, fb(), and TTS_EMPTY.

◆ tts_virtual_materialize()

static void tts_virtual_materialize ( TupleTableSlot slot)
static

Definition at line 176 of file execTuples.c.

177{
179 TupleDesc desc = slot->tts_tupleDescriptor;
180 Size sz = 0;
181 char *data;
182
183 /* already materialized */
184 if (TTS_SHOULDFREE(slot))
185 return;
186
187 /* compute size of memory required */
188 for (int natt = 0; natt < desc->natts; natt++)
189 {
191 Datum val;
192
193 if (att->attbyval || slot->tts_isnull[natt])
194 continue;
195
196 val = slot->tts_values[natt];
197
198 if (att->attlen == -1 &&
200 {
201 /*
202 * We want to flatten the expanded value so that the materialized
203 * slot doesn't depend on it.
204 */
205 sz = att_nominal_alignby(sz, att->attalignby);
207 }
208 else
209 {
210 sz = att_nominal_alignby(sz, att->attalignby);
211 sz = att_addlength_datum(sz, att->attlen, val);
212 }
213 }
214
215 /* all data is byval */
216 if (sz == 0)
217 return;
218
219 /* allocate memory */
220 vslot->data = data = MemoryContextAlloc(slot->tts_mcxt, sz);
222
223 /* and copy all attributes into the pre-allocated space */
224 for (int natt = 0; natt < desc->natts; natt++)
225 {
227 Datum val;
228
229 if (att->attbyval || slot->tts_isnull[natt])
230 continue;
231
232 val = slot->tts_values[natt];
233
234 if (att->attlen == -1 &&
236 {
237 Size data_length;
238
239 /*
240 * We want to flatten the expanded value so that the materialized
241 * slot doesn't depend on it.
242 */
244
245 data = (char *) att_nominal_alignby(data,
246 att->attalignby);
247 data_length = EOH_get_flat_size(eoh);
248 EOH_flatten_into(eoh, data, data_length);
249
251 data += data_length;
252 }
253 else
254 {
255 Size data_length = 0;
256
257 data = (char *) att_nominal_alignby(data, att->attalignby);
258 data_length = att_addlength_datum(data_length, att->attlen, val);
259
260 memcpy(data, DatumGetPointer(val), data_length);
261
263 data += data_length;
264 }
265 }
266}
ExpandedObjectHeader * DatumGetEOHP(Datum d)
void EOH_flatten_into(ExpandedObjectHeader *eohptr, void *result, Size allocated_size)
Size EOH_get_flat_size(ExpandedObjectHeader *eohptr)
long val
Definition informix.c:689
#define att_nominal_alignby(cur_offset, attalignby)
Definition tupmacs.h:411
#define att_addlength_datum(cur_offset, attlen, attdatum)
Definition tupmacs.h:419
static bool VARATT_IS_EXTERNAL_EXPANDED(const void *PTR)
Definition varatt.h:389

References att_addlength_datum, att_nominal_alignby, data, DatumGetEOHP(), DatumGetPointer(), EOH_flatten_into(), EOH_get_flat_size(), fb(), MemoryContextAlloc(), TupleDescData::natts, PointerGetDatum(), TTS_FLAG_SHOULDFREE, TupleTableSlot::tts_flags, TupleTableSlot::tts_isnull, TupleTableSlot::tts_mcxt, TTS_SHOULDFREE, TupleTableSlot::tts_tupleDescriptor, TupleTableSlot::tts_values, TupleDescCompactAttr(), val, and VARATT_IS_EXTERNAL_EXPANDED().

Referenced by tts_virtual_copyslot().

◆ tts_virtual_release()

static void tts_virtual_release ( TupleTableSlot slot)
static

Definition at line 103 of file execTuples.c.

104{
105}

◆ TupleDescGetAttInMetadata()

AttInMetadata * TupleDescGetAttInMetadata ( TupleDesc  tupdesc)

Definition at line 2356 of file execTuples.c.

2357{
2358 int natts = tupdesc->natts;
2359 int i;
2360 Oid atttypeid;
2363 Oid *attioparams;
2364 int32 *atttypmods;
2365 AttInMetadata *attinmeta;
2366
2367 attinmeta = palloc_object(AttInMetadata);
2368
2369 /* "Bless" the tupledesc so that we can make rowtype datums with it */
2370 attinmeta->tupdesc = BlessTupleDesc(tupdesc);
2371
2372 /*
2373 * Gather info needed later to call the "in" function for each attribute
2374 */
2375 attinfuncinfo = (FmgrInfo *) palloc0(natts * sizeof(FmgrInfo));
2376 attioparams = (Oid *) palloc0(natts * sizeof(Oid));
2377 atttypmods = (int32 *) palloc0(natts * sizeof(int32));
2378
2379 for (i = 0; i < natts; i++)
2380 {
2382
2383 /* Ignore dropped attributes */
2384 if (!att->attisdropped)
2385 {
2386 atttypeid = att->atttypid;
2387 getTypeInputInfo(atttypeid, &attinfuncid, &attioparams[i]);
2389 atttypmods[i] = att->atttypmod;
2390 }
2391 }
2392 attinmeta->attinfuncs = attinfuncinfo;
2393 attinmeta->attioparams = attioparams;
2394 attinmeta->atttypmods = atttypmods;
2395
2396 return attinmeta;
2397}
int32_t int32
Definition c.h:614
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
void fmgr_info(Oid functionId, FmgrInfo *finfo)
Definition fmgr.c:129
void getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam)
Definition lsyscache.c:3096
unsigned int Oid

References AttInMetadata::attinfuncs, AttInMetadata::attioparams, AttInMetadata::atttypmods, BlessTupleDesc(), fb(), fmgr_info(), getTypeInputInfo(), i, TupleDescData::natts, palloc0(), palloc_object, AttInMetadata::tupdesc, and TupleDescAttr().

Referenced by bt_metap(), bt_multi_page_stats(), bt_page_stats_internal(), build_pgstattuple_type(), connectby_text(), connectby_text_serial(), create_foreign_modify(), crosstab(), dblink_get_pkey(), get_crosstab_tuplestore(), hash_page_items(), libpqrcv_processTuples(), materializeQueryResult(), materializeResult(), pg_get_keywords(), pg_get_multixact_members(), pg_stats_ext_mcvlist_items(), pgp_armor_headers(), pgrowlocks(), pgstatindex_impl(), pltcl_build_tuple_result(), pltcl_func_handler(), pltcl_init_tuple_store(), postgresAcquireSampleRowsFunc(), postgresBeginDirectModify(), postgresBeginForeignScan(), prs_setup_firstcall(), show_all_settings(), storeRow(), ts_setup_firstcall(), tt_setup_firstcall(), and xpath_table().

Variable Documentation

◆ TTSOpsBufferHeapTuple

const TupleTableSlotOps TTSOpsBufferHeapTuple
Initial value:
= {
.base_slot_size = sizeof(BufferHeapTupleTableSlot),
.is_current_xact_tuple = tts_buffer_is_current_xact_tuple,
.get_heap_tuple = tts_buffer_heap_get_heap_tuple,
.get_minimal_tuple = NULL,
.copy_heap_tuple = tts_buffer_heap_copy_heap_tuple,
.copy_minimal_tuple = tts_buffer_heap_copy_minimal_tuple
}
static void tts_buffer_heap_copyslot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
Definition execTuples.c:863
static HeapTuple tts_buffer_heap_copy_heap_tuple(TupleTableSlot *slot)
Definition execTuples.c:918
static void tts_buffer_heap_clear(TupleTableSlot *slot)
Definition execTuples.c:721
static Datum tts_buffer_heap_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
Definition execTuples.c:761
static bool tts_buffer_is_current_xact_tuple(TupleTableSlot *slot)
Definition execTuples.c:781
static HeapTuple tts_buffer_heap_get_heap_tuple(TupleTableSlot *slot)
Definition execTuples.c:905
static void tts_buffer_heap_release(TupleTableSlot *slot)
Definition execTuples.c:716
static MinimalTuple tts_buffer_heap_copy_minimal_tuple(TupleTableSlot *slot, Size extra)
Definition execTuples.c:931
static void tts_buffer_heap_getsomeattrs(TupleTableSlot *slot, int natts)
Definition execTuples.c:751
static void tts_buffer_heap_init(TupleTableSlot *slot)
Definition execTuples.c:711
#define init()

Definition at line 87 of file execTuples.c.

Referenced by CheckOpSlotCompatibility(), heapam_slot_callbacks(), and slot_compile_deform().

◆ TTSOpsHeapTuple

const TupleTableSlotOps TTSOpsHeapTuple
Initial value:
= {
.base_slot_size = sizeof(HeapTupleTableSlot),
.release = tts_heap_release,
.clear = tts_heap_clear,
.getsomeattrs = tts_heap_getsomeattrs,
.getsysattr = tts_heap_getsysattr,
.is_current_xact_tuple = tts_heap_is_current_xact_tuple,
.materialize = tts_heap_materialize,
.copyslot = tts_heap_copyslot,
.get_heap_tuple = tts_heap_get_heap_tuple,
.get_minimal_tuple = NULL,
.copy_heap_tuple = tts_heap_copy_heap_tuple,
.copy_minimal_tuple = tts_heap_copy_minimal_tuple
}
static Datum tts_heap_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
Definition execTuples.c:356
static void tts_heap_init(TupleTableSlot *slot)
Definition execTuples.c:317
static HeapTuple tts_heap_copy_heap_tuple(TupleTableSlot *slot)
Definition execTuples.c:464
static MinimalTuple tts_heap_copy_minimal_tuple(TupleTableSlot *slot, Size extra)
Definition execTuples.c:476
static HeapTuple tts_heap_get_heap_tuple(TupleTableSlot *slot)
Definition execTuples.c:452
static void tts_heap_copyslot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
Definition execTuples.c:439
static void tts_heap_getsomeattrs(TupleTableSlot *slot, int natts)
Definition execTuples.c:346
static void tts_heap_release(TupleTableSlot *slot)
Definition execTuples.c:322
static bool tts_heap_is_current_xact_tuple(TupleTableSlot *slot)
Definition execTuples.c:376

Definition at line 85 of file execTuples.c.

Referenced by CatalogIndexInsert(), CheckOpSlotCompatibility(), compute_expr_stats(), compute_index_stats(), copyTemplateDependencies(), DefineTSConfiguration(), EnumValuesCreate(), ExecInitForeignScan(), ExecuteCallStmt(), heapam_index_validate_scan(), init_tuple_slot(), InsertPgAttributeTuples(), make_build_data(), MakeConfigurationMapping(), recordMultipleDependencies(), slot_compile_deform(), table_slot_callbacks(), and tuplesort_begin_cluster().

◆ TTSOpsMinimalTuple

const TupleTableSlotOps TTSOpsMinimalTuple
Initial value:
= {
.base_slot_size = sizeof(MinimalTupleTableSlot),
.release = tts_minimal_release,
.getsomeattrs = tts_minimal_getsomeattrs,
.getsysattr = tts_minimal_getsysattr,
.is_current_xact_tuple = tts_minimal_is_current_xact_tuple,
.materialize = tts_minimal_materialize,
.copyslot = tts_minimal_copyslot,
.get_heap_tuple = NULL,
.get_minimal_tuple = tts_minimal_get_minimal_tuple,
.copy_heap_tuple = tts_minimal_copy_heap_tuple,
.copy_minimal_tuple = tts_minimal_copy_minimal_tuple
}
static HeapTuple tts_minimal_copy_heap_tuple(TupleTableSlot *slot)
Definition execTuples.c:660
static void tts_minimal_init(TupleTableSlot *slot)
Definition execTuples.c:509
static MinimalTuple tts_minimal_get_minimal_tuple(TupleTableSlot *slot)
Definition execTuples.c:649
static void tts_minimal_copyslot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
Definition execTuples.c:636
static void tts_minimal_release(TupleTableSlot *slot)
Definition execTuples.c:521
static Datum tts_minimal_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
Definition execTuples.c:558
static bool tts_minimal_is_current_xact_tuple(TupleTableSlot *slot)
Definition execTuples.c:575
static MinimalTuple tts_minimal_copy_minimal_tuple(TupleTableSlot *slot, Size extra)
Definition execTuples.c:671
static void tts_minimal_getsomeattrs(TupleTableSlot *slot, int natts)
Definition execTuples.c:544

Definition at line 86 of file execTuples.c.

Referenced by afterTriggerInvokeEvents(), build_pertrans_for_aggref(), BuildTupleHashTable(), check_pub_dead_tuple_retention(), check_publications(), check_publications_origin_sequences(), check_publications_origin_tables(), copy_sequences(), ExecInitAgg(), ExecInitCteScan(), ExecInitFunctionScan(), ExecInitGather(), ExecInitHash(), ExecInitIncrementalSort(), ExecInitMaterial(), ExecInitMemoize(), ExecInitNamedTuplestoreScan(), ExecInitSetOp(), ExecInitSort(), ExecInitSubPlan(), ExecInitTableFuncScan(), ExecInitUnique(), ExecInitWindowAgg(), ExecInitWorkTableScan(), ExecPrepareTuplestoreResult(), fetch_relation_list(), fetch_remote_slots(), fetch_remote_table_info(), find_hash_columns(), gather_merge_setup(), hashagg_recompile_expressions(), hypothetical_dense_rank_final(), init_execution_state(), ordered_set_startup(), RunFromStore(), slot_compile_deform(), and validate_remote_info().

◆ TTSOpsVirtual

const TupleTableSlotOps TTSOpsVirtual
Initial value:
= {
.base_slot_size = sizeof(VirtualTupleTableSlot),
.release = tts_virtual_release,
.getsomeattrs = tts_virtual_getsomeattrs,
.getsysattr = tts_virtual_getsysattr,
.materialize = tts_virtual_materialize,
.is_current_xact_tuple = tts_virtual_is_current_xact_tuple,
.copyslot = tts_virtual_copyslot,
.get_heap_tuple = NULL,
.get_minimal_tuple = NULL,
.copy_heap_tuple = tts_virtual_copy_heap_tuple,
.copy_minimal_tuple = tts_virtual_copy_minimal_tuple
}
static MinimalTuple tts_virtual_copy_minimal_tuple(TupleTableSlot *slot, Size extra)
Definition execTuples.c:301
static HeapTuple tts_virtual_copy_heap_tuple(TupleTableSlot *slot)
Definition execTuples.c:291
static void tts_virtual_release(TupleTableSlot *slot)
Definition execTuples.c:103
static void tts_virtual_init(TupleTableSlot *slot)
Definition execTuples.c:98
static void tts_virtual_copyslot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
Definition execTuples.c:269
static bool tts_virtual_is_current_xact_tuple(TupleTableSlot *slot)
Definition execTuples.c:157
static void tts_virtual_getsomeattrs(TupleTableSlot *slot, int natts)
Definition execTuples.c:130
static Datum tts_virtual_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
Definition execTuples.c:141

Definition at line 84 of file execTuples.c.

Referenced by apply_handle_delete(), apply_handle_insert(), apply_handle_update(), buildSubPlanHash(), CheckOpSlotCompatibility(), CreateReplicationSlot(), ExecComputeSlotInfo(), ExecConditionalAssignProjectionInfo(), ExecConstraints(), ExecGetResultSlotOps(), ExecInitAgg(), ExecInitAppend(), ExecInitCustomScan(), ExecInitGroup(), ExecInitHashJoin(), ExecInitIndexOnlyScan(), ExecInitJunkFilter(), ExecInitJunkFilterConversion(), ExecInitMemoize(), ExecInitMergeAppend(), ExecInitMergeJoin(), ExecInitModifyTable(), ExecInitNestLoop(), ExecInitPartitionDispatchInfo(), ExecInitProjectSet(), ExecInitResult(), ExecInitSort(), ExecInitSubPlan(), ExecInitValuesScan(), ExecInitWholeRowVar(), ExecInitWindowAgg(), ExecPartitionCheckEmitError(), ExecWaitStmt(), ExecWithCheckOptions(), ExplainQuery(), GetAfterTriggersStoreSlot(), IdentifySystem(), InitPlan(), llvm_compile_expr(), pgoutput_change(), pgoutput_row_filter(), ReadReplicationSlot(), ReportNotNullViolationError(), RI_Initial_Check(), RI_PartitionRemove_Check(), SendTablespaceList(), SendXlogRecPtrResult(), ShowAllGUCConfig(), ShowGUCConfigOption(), slot_compile_deform(), StartReplication(), table_slot_callbacks(), and tstoreStartupReceiver().