From 87d95e24295df49fd9b64da275385bc1c775ae2d Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 10 Jul 2017 15:07:32 -0700
Subject: [PATCH 11/16] Avoid dereferencing tts_values/nulls repeatedly.

Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/backend/executor/nodeAgg.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index 291f15fd94..a63c05cb68 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -960,6 +960,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 	int			numHashes = aggstate->num_hashes;
 	int			numTrans = aggstate->numtrans;
 	TupleTableSlot *slot = aggstate->evalslot;
+	Datum	   *values = slot->tts_values;
+	bool	   *nulls = slot->tts_isnull;
 	AggStatePerTrans pertrans;
 
 	/* compute input for all aggregates */
@@ -1015,8 +1017,7 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 				/* OK, put the tuple into the tuplesort object */
 				if (pertrans->numInputs == 1)
 					tuplesort_putdatum(pertrans->sortstates[setno],
-									   slot->tts_values[inputoff],
-									   slot->tts_isnull[inputoff]);
+									   values[inputoff], nulls[inputoff]);
 				else
 				{
 					/*
@@ -1025,10 +1026,10 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 					 */
 					ExecClearTuple(pertrans->sortslot);
 					memcpy(pertrans->sortslot->tts_values,
-						   &slot->tts_values[inputoff],
+						   &values[inputoff],
 						   pertrans->numInputs * sizeof(Datum));
 					memcpy(pertrans->sortslot->tts_isnull,
-						   &slot->tts_isnull[inputoff],
+						   &nulls[inputoff],
 						   pertrans->numInputs * sizeof(bool));
 					pertrans->sortslot->tts_nvalid = pertrans->numInputs;
 					ExecStoreVirtualTuple(pertrans->sortslot);
@@ -1047,8 +1048,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 
 			for (i = 0; i < numTransInputs; i++)
 			{
-				fcinfo->arg[i + 1] = slot->tts_values[i + inputoff];
-				fcinfo->argnull[i + 1] = slot->tts_isnull[i + inputoff];
+				fcinfo->arg[i + 1] = values[i + inputoff];
+				fcinfo->argnull[i + 1] = nulls[i + inputoff];
 			}
 
 			if (sort_pergroups)
-- 
2.14.1.2.g4274c698f4.dirty

