Allow table AM tuple_insert() method to return the different slot
This allows table AM to return a native tuple slot even if VirtualTupleTableSlot is given as an input. Native tuple slots have knowledge about system attributes, which could be accessed in the future. table_multi_insert() method already can modify the input 'slots' array. Discussion: https://postgr.es/m/CAPpHfdurb9ycV8udYqM%3Do0sPS66PJ4RCBM1g-bBpvzUfogY0EA%40mail.gmail.com Reviewed-by: Matthias van de Meent, Mark Dilger, Pavel Borisov Reviewed-by: Nikita Malakhov, Japin Li
This commit is contained in:
parent
02eb07ea89
commit
c35a3fb5e0
@ -237,7 +237,7 @@ heapam_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot,
|
|||||||
* ----------------------------------------------------------------------------
|
* ----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static TupleTableSlot *
|
||||||
heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
|
heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
|
||||||
int options, BulkInsertState bistate)
|
int options, BulkInsertState bistate)
|
||||||
{
|
{
|
||||||
@ -254,6 +254,8 @@ heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
|
|||||||
|
|
||||||
if (shouldFree)
|
if (shouldFree)
|
||||||
pfree(tuple);
|
pfree(tuple);
|
||||||
|
|
||||||
|
return slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1125,9 +1125,9 @@ ExecInsert(ModifyTableContext *context,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* insert the tuple normally */
|
/* insert the tuple normally */
|
||||||
table_tuple_insert(resultRelationDesc, slot,
|
slot = table_tuple_insert(resultRelationDesc, slot,
|
||||||
estate->es_output_cid,
|
estate->es_output_cid,
|
||||||
0, NULL);
|
0, NULL);
|
||||||
|
|
||||||
/* insert index entries for tuple */
|
/* insert index entries for tuple */
|
||||||
if (resultRelInfo->ri_NumIndices > 0)
|
if (resultRelInfo->ri_NumIndices > 0)
|
||||||
|
@ -500,9 +500,9 @@ typedef struct TableAmRoutine
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* see table_tuple_insert() for reference about parameters */
|
/* see table_tuple_insert() for reference about parameters */
|
||||||
void (*tuple_insert) (Relation rel, TupleTableSlot *slot,
|
TupleTableSlot *(*tuple_insert) (Relation rel, TupleTableSlot *slot,
|
||||||
CommandId cid, int options,
|
CommandId cid, int options,
|
||||||
struct BulkInsertStateData *bistate);
|
struct BulkInsertStateData *bistate);
|
||||||
|
|
||||||
/* see table_tuple_insert_speculative() for reference about parameters */
|
/* see table_tuple_insert_speculative() for reference about parameters */
|
||||||
void (*tuple_insert_speculative) (Relation rel,
|
void (*tuple_insert_speculative) (Relation rel,
|
||||||
@ -1392,16 +1392,19 @@ table_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate)
|
|||||||
* behavior) is also just passed through to RelationGetBufferForTuple. If
|
* behavior) is also just passed through to RelationGetBufferForTuple. If
|
||||||
* `bistate` is provided, table_finish_bulk_insert() needs to be called.
|
* `bistate` is provided, table_finish_bulk_insert() needs to be called.
|
||||||
*
|
*
|
||||||
* On return the slot's tts_tid and tts_tableOid are updated to reflect the
|
* Returns the slot containing the inserted tuple, which may differ from the
|
||||||
* insertion. But note that any toasting of fields within the slot is NOT
|
* given slot. For instance, the source slot may be VirtualTupleTableSlot, but
|
||||||
* reflected in the slots contents.
|
* the result slot may correspond to the table AM. On return the slot's
|
||||||
|
* tts_tid and tts_tableOid are updated to reflect the insertion. But note
|
||||||
|
* that any toasting of fields within the slot is NOT reflected in the slots
|
||||||
|
* contents.
|
||||||
*/
|
*/
|
||||||
static inline void
|
static inline TupleTableSlot *
|
||||||
table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid,
|
table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid,
|
||||||
int options, struct BulkInsertStateData *bistate)
|
int options, struct BulkInsertStateData *bistate)
|
||||||
{
|
{
|
||||||
rel->rd_tableam->tuple_insert(rel, slot, cid, options,
|
return rel->rd_tableam->tuple_insert(rel, slot, cid, options,
|
||||||
bistate);
|
bistate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user