From 5c1fe914303a970a812579da41aca9286abe442b Mon Sep 17 00:00:00 2001
From: Bharath Rupireddy <bharath.rupireddy@enterprisedb.com>
Date: Sat, 13 Feb 2021 09:37:53 +0530
Subject: [PATCH v1] Remove unnecessary wrapping of MakeTupleTableSlot in
 MakeSingleTupleTableSlot

Currently, MakeSingleTupleTableSlot function just calls another
function MakeTupleTableSlot to return the final slot without doing
anything on the slot returned by the MakeTupleTableSlot.

We can avoid some unnecessary function call costs, for instance
when called 1000 times inside table_slot_create from copyfrom.c or
in some other places where MakeSingleTupleTableSlot is called in a
loop.

This patch just renames MakeTupleTableSlot to MakeSingleTupleTableSlot
and removes existing MakeSingleTupleTableSlot function and also
replaces MakeTupleTableSlot with MakeSingleTupleTableSlot.
---
 src/backend/executor/execMain.c   |  8 ++++----
 src/backend/executor/execTuples.c | 24 +++---------------------
 src/include/executor/tuptable.h   |  2 --
 3 files changed, 7 insertions(+), 27 deletions(-)

diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index c74ce36ffb..36d01dfcd4 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -1749,7 +1749,7 @@ ExecPartitionCheckEmitError(ResultRelInfo *resultRelInfo,
 		 */
 		if (map != NULL)
 			slot = execute_attr_map_slot(map, slot,
-										 MakeTupleTableSlot(tupdesc, &TTSOpsVirtual));
+										 MakeSingleTupleTableSlot(tupdesc, &TTSOpsVirtual));
 		modifiedCols = bms_union(ExecGetInsertedCols(rootrel, estate),
 								 ExecGetUpdatedCols(rootrel, estate));
 	}
@@ -1834,7 +1834,7 @@ ExecConstraints(ResultRelInfo *resultRelInfo,
 					 */
 					if (map != NULL)
 						slot = execute_attr_map_slot(map, slot,
-													 MakeTupleTableSlot(tupdesc, &TTSOpsVirtual));
+													 MakeSingleTupleTableSlot(tupdesc, &TTSOpsVirtual));
 					modifiedCols = bms_union(ExecGetInsertedCols(rootrel, estate),
 											 ExecGetUpdatedCols(rootrel, estate));
 					rel = rootrel->ri_RelationDesc;
@@ -1886,7 +1886,7 @@ ExecConstraints(ResultRelInfo *resultRelInfo,
 				 */
 				if (map != NULL)
 					slot = execute_attr_map_slot(map, slot,
-												 MakeTupleTableSlot(tupdesc, &TTSOpsVirtual));
+												 MakeSingleTupleTableSlot(tupdesc, &TTSOpsVirtual));
 				modifiedCols = bms_union(ExecGetInsertedCols(rootrel, estate),
 										 ExecGetUpdatedCols(rootrel, estate));
 				rel = rootrel->ri_RelationDesc;
@@ -1993,7 +1993,7 @@ ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo,
 						 */
 						if (map != NULL)
 							slot = execute_attr_map_slot(map, slot,
-														 MakeTupleTableSlot(tupdesc, &TTSOpsVirtual));
+														 MakeSingleTupleTableSlot(tupdesc, &TTSOpsVirtual));
 
 						modifiedCols = bms_union(ExecGetInsertedCols(rootrel, estate),
 												 ExecGetUpdatedCols(rootrel, estate));
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 73c35df9c9..f0aafc2198 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -1070,7 +1070,7 @@ const TupleTableSlotOps TTSOpsBufferHeapTuple = {
  */
 
 /* --------------------------------
- *		MakeTupleTableSlot
+ *		MakeSingleTupleTableSlot
  *
  *		Basic routine to make an empty TupleTableSlot of given
  *		TupleTableSlotType. If tupleDesc is specified the slot's descriptor is
@@ -1079,7 +1079,7 @@ const TupleTableSlotOps TTSOpsBufferHeapTuple = {
  * --------------------------------
  */
 TupleTableSlot *
-MakeTupleTableSlot(TupleDesc tupleDesc,
+MakeSingleTupleTableSlot(TupleDesc tupleDesc,
 				   const TupleTableSlotOps *tts_ops)
 {
 	Size		basesz,
@@ -1141,7 +1141,7 @@ TupleTableSlot *
 ExecAllocTableSlot(List **tupleTable, TupleDesc desc,
 				   const TupleTableSlotOps *tts_ops)
 {
-	TupleTableSlot *slot = MakeTupleTableSlot(desc, tts_ops);
+	TupleTableSlot *slot = MakeSingleTupleTableSlot(desc, tts_ops);
 
 	*tupleTable = lappend(*tupleTable, slot);
 
@@ -1195,24 +1195,6 @@ ExecResetTupleTable(List *tupleTable,	/* tuple table */
 		list_free(tupleTable);
 }
 
-/* --------------------------------
- *		MakeSingleTupleTableSlot
- *
- *		This is a convenience routine for operations that need a standalone
- *		TupleTableSlot not gotten from the main executor tuple table.  It makes
- *		a single slot of given TupleTableSlotType and initializes it to use the
- *		given tuple descriptor.
- * --------------------------------
- */
-TupleTableSlot *
-MakeSingleTupleTableSlot(TupleDesc tupdesc,
-						 const TupleTableSlotOps *tts_ops)
-{
-	TupleTableSlot *slot = MakeTupleTableSlot(tupdesc, tts_ops);
-
-	return slot;
-}
-
 /* --------------------------------
  *		ExecDropSingleTupleTableSlot
  *
diff --git a/src/include/executor/tuptable.h b/src/include/executor/tuptable.h
index 679e57fbdd..54ec4514b5 100644
--- a/src/include/executor/tuptable.h
+++ b/src/include/executor/tuptable.h
@@ -293,8 +293,6 @@ typedef struct MinimalTupleTableSlot
 	((slot) == NULL || TTS_EMPTY(slot))
 
 /* in executor/execTuples.c */
-extern TupleTableSlot *MakeTupleTableSlot(TupleDesc tupleDesc,
-										  const TupleTableSlotOps *tts_ops);
 extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable, TupleDesc desc,
 										  const TupleTableSlotOps *tts_ops);
 extern void ExecResetTupleTable(List *tupleTable, bool shouldFree);
-- 
2.25.1

