diff options
author | Jeff Davis <jdavis@postgresql.org> | 2025-03-24 22:05:53 -0700 |
---|---|---|
committer | Jeff Davis <jdavis@postgresql.org> | 2025-03-24 22:05:53 -0700 |
commit | a0942f441ed651f6345d969b7a8f4774eda1fceb (patch) | |
tree | c40b5889e11c5794963f90096e5f4ba5390059b0 /src/backend/executor | |
parent | 4d143509cbfae0207c35abffae7b0e3b4d078349 (diff) | |
download | postgresql-a0942f441ed651f6345d969b7a8f4774eda1fceb.tar.gz postgresql-a0942f441ed651f6345d969b7a8f4774eda1fceb.zip |
Add ExecCopySlotMinimalTupleExtra().
Allows an "extra" argument that allocates extra memory at the end of
the MinimalTuple. This is important for callers that need to store
additional data, but do not want to perform an additional allocation.
Suggested-by: David Rowley <dgrowleyml@gmail.com>
Discussion: https://postgr.es/m/CAApHDvppeqw2pNM-+ahBOJwq2QmC0hOAGsmCpC89QVmEoOvsdg@mail.gmail.com
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execTuples.c | 24 | ||||
-rw-r--r-- | src/backend/executor/nodeGatherMerge.c | 2 |
2 files changed, 14 insertions, 12 deletions
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 7de490462d4..8e02d68824f 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -298,13 +298,14 @@ tts_virtual_copy_heap_tuple(TupleTableSlot *slot) } static MinimalTuple -tts_virtual_copy_minimal_tuple(TupleTableSlot *slot) +tts_virtual_copy_minimal_tuple(TupleTableSlot *slot, Size extra) { Assert(!TTS_EMPTY(slot)); return heap_form_minimal_tuple(slot->tts_tupleDescriptor, slot->tts_values, - slot->tts_isnull); + slot->tts_isnull, + extra); } @@ -472,14 +473,14 @@ tts_heap_copy_heap_tuple(TupleTableSlot *slot) } static MinimalTuple -tts_heap_copy_minimal_tuple(TupleTableSlot *slot) +tts_heap_copy_minimal_tuple(TupleTableSlot *slot, Size extra) { HeapTupleTableSlot *hslot = (HeapTupleTableSlot *) slot; if (!hslot->tuple) tts_heap_materialize(slot); - return minimal_tuple_from_heap_tuple(hslot->tuple); + return minimal_tuple_from_heap_tuple(hslot->tuple, extra); } static void @@ -607,7 +608,8 @@ tts_minimal_materialize(TupleTableSlot *slot) { mslot->mintuple = heap_form_minimal_tuple(slot->tts_tupleDescriptor, slot->tts_values, - slot->tts_isnull); + slot->tts_isnull, + 0); } else { @@ -617,7 +619,7 @@ tts_minimal_materialize(TupleTableSlot *slot) * TTS_FLAG_SHOULDFREE set). Copy the minimal tuple into the given * slot's memory context. */ - mslot->mintuple = heap_copy_minimal_tuple(mslot->mintuple); + mslot->mintuple = heap_copy_minimal_tuple(mslot->mintuple, 0); } slot->tts_flags |= TTS_FLAG_SHOULDFREE; @@ -666,14 +668,14 @@ tts_minimal_copy_heap_tuple(TupleTableSlot *slot) } static MinimalTuple -tts_minimal_copy_minimal_tuple(TupleTableSlot *slot) +tts_minimal_copy_minimal_tuple(TupleTableSlot *slot, Size extra) { MinimalTupleTableSlot *mslot = (MinimalTupleTableSlot *) slot; if (!mslot->mintuple) tts_minimal_materialize(slot); - return heap_copy_minimal_tuple(mslot->mintuple); + return heap_copy_minimal_tuple(mslot->mintuple, extra); } static void @@ -926,7 +928,7 @@ tts_buffer_heap_copy_heap_tuple(TupleTableSlot *slot) } static MinimalTuple -tts_buffer_heap_copy_minimal_tuple(TupleTableSlot *slot) +tts_buffer_heap_copy_minimal_tuple(TupleTableSlot *slot, Size extra) { BufferHeapTupleTableSlot *bslot = (BufferHeapTupleTableSlot *) slot; @@ -935,7 +937,7 @@ tts_buffer_heap_copy_minimal_tuple(TupleTableSlot *slot) if (!bslot->base.tuple) tts_buffer_heap_materialize(slot); - return minimal_tuple_from_heap_tuple(bslot->base.tuple); + return minimal_tuple_from_heap_tuple(bslot->base.tuple, extra); } static inline void @@ -1895,7 +1897,7 @@ ExecFetchSlotMinimalTuple(TupleTableSlot *slot, { if (shouldFree) *shouldFree = true; - return slot->tts_ops->copy_minimal_tuple(slot); + return slot->tts_ops->copy_minimal_tuple(slot, 0); } } diff --git a/src/backend/executor/nodeGatherMerge.c b/src/backend/executor/nodeGatherMerge.c index 01a6e3a8553..15f84597067 100644 --- a/src/backend/executor/nodeGatherMerge.c +++ b/src/backend/executor/nodeGatherMerge.c @@ -735,7 +735,7 @@ gm_readnext_tuple(GatherMergeState *gm_state, int nreader, bool nowait, * Since we'll be buffering these across multiple calls, we need to make a * copy. */ - return tup ? heap_copy_minimal_tuple(tup) : NULL; + return tup ? heap_copy_minimal_tuple(tup, 0) : NULL; } /* |