From: Andres Freund Date: Mon, 10 Jul 2017 22:07:32 +0000 (-0700) Subject: Avoid dereferencing tts_values/nulls repeatedly. X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=87d95e24295df49fd9b64da275385bc1c775ae2d;p=users%2Fandresfreund%2Fpostgres.git Avoid dereferencing tts_values/nulls repeatedly. Author: Reviewed-By: Discussion: https://postgr.es/m/ Backpatch: --- 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)