0004-Allow-table-AM-tuple_insert-method-to-return-the--v2.patch

application/octet-stream

Filename: 0004-Allow-table-AM-tuple_insert-method-to-return-the--v2.patch
Type: application/octet-stream
Part: 10
Message: Re: Table AM Interface Enhancements

Patch

Format: format-patch
Series: patch v2-0004
Subject: Allow table AM tuple_insert() method to return the different slot
File+
src/backend/access/heap/heapam_handler.c 3 1
src/backend/executor/nodeModifyTable.c 3 3
src/include/access/tableam.h 11 9
From a85fd10f8b50db832993c9f7531eec834525acc8 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Fri, 9 Jun 2023 00:28:27 +0300
Subject: [PATCH 04/13] Allow table AM tuple_insert() method to return the
 different slot

This allows table AM to return native tuple slot even if VirtualTupleTableSlot
is given as an input.  Native tuple slot have its knowledge about system
attributes, which could be accessed in future.
---
 src/backend/access/heap/heapam_handler.c |  4 +++-
 src/backend/executor/nodeModifyTable.c   |  6 +++---
 src/include/access/tableam.h             | 20 +++++++++++---------
 3 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index da86ca5c31a..6abfe36dec7 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -243,7 +243,7 @@ heapam_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot,
  * ----------------------------------------------------------------------------
  */
 
-static void
+static TupleTableSlot *
 heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
 					int options, BulkInsertState bistate)
 {
@@ -260,6 +260,8 @@ heapam_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid,
 
 	if (shouldFree)
 		pfree(tuple);
+
+	return slot;
 }
 
 static void
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 9deeaceb35c..34962033be7 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -1129,9 +1129,9 @@ ExecInsert(ModifyTableContext *context,
 		else
 		{
 			/* insert the tuple normally */
-			table_tuple_insert(resultRelationDesc, slot,
-							   estate->es_output_cid,
-							   0, NULL);
+			slot = table_tuple_insert(resultRelationDesc, slot,
+									  estate->es_output_cid,
+									  0, NULL);
 
 			/* insert index entries for tuple */
 			if (resultRelInfo->ri_NumIndices > 0)
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h
index be092e8bedb..2c43ef3f60e 100644
--- a/src/include/access/tableam.h
+++ b/src/include/access/tableam.h
@@ -505,9 +505,9 @@ typedef struct TableAmRoutine
 	 */
 
 	/* see table_tuple_insert() for reference about parameters */
-	void		(*tuple_insert) (Relation rel, TupleTableSlot *slot,
-								 CommandId cid, int options,
-								 struct BulkInsertStateData *bistate);
+	TupleTableSlot *(*tuple_insert) (Relation rel, TupleTableSlot *slot,
+									 CommandId cid, int options,
+									 struct BulkInsertStateData *bistate);
 
 	/* see table_tuple_insert_speculative() for reference about parameters */
 	void		(*tuple_insert_speculative) (Relation rel,
@@ -1398,16 +1398,18 @@ table_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate)
  * behavior) is also just passed through to RelationGetBufferForTuple. If
  * `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
- * insertion. But note that any toasting of fields within the slot is NOT
- * reflected in the slots contents.
+ * Returns the slot containing the inserted tuple, which may differ from the
+ * given slot. For instance, source slot may by VirtualTupleTableSlot, but
+ * the result is corresponding to 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,
 				   int options, struct BulkInsertStateData *bistate)
 {
-	rel->rd_tableam->tuple_insert(rel, slot, cid, options,
-								  bistate);
+	return rel->rd_tableam->tuple_insert(rel, slot, cid, options,
+										 bistate);
 }
 
 /*
-- 
2.39.3 (Apple Git-145)