From 419b91c058b4c81b2c3e41b0f81226ed3990cf07 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 21 Mar 1999 19:59:13 +0000 Subject: [PATCH] Correct some comments, fix a small memory wastage when datatype is pass-by-value. --- src/backend/executor/nodeAgg.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index d379077af5..82d7ffd8ce 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -67,10 +67,14 @@ static Datum aggGetAttr(TupleTableSlot *tuple, Aggref *aggref, bool *isNull); * value1[i] = initcond1 * value2[i] = initcond2 * forall tuples do - * value1[i] = sfunc1(aggregate_attribute, value1[i]) + * value1[i] = sfunc1(value1[i], aggregated_value) * value2[i] = sfunc2(value2[i]) * value1[i] = finalfunc(value1[i], value2[i]) * + * If initcond1 is NULL then the first non-NULL aggregated_value is + * assigned directly to value1[i]. sfunc1 isn't applied until value1[i] + * is non-NULL. + * * If the outer subplan is a Group node, ExecAgg returns as many tuples * as there are groups. * @@ -272,7 +276,6 @@ ExecAgg(Agg *node) { Aggref *aggref = lfirst(alist); AttrNumber attnum; - int2 attlen = 0; Datum newVal = (Datum) NULL; AggFuncInfo *aggfns = &aggFuncInfo[++aggno]; Datum args[2]; @@ -309,6 +312,7 @@ ExecAgg(Agg *node) { if (noInitValue[aggno]) { + int attlen = 0; int byVal = 0; /* @@ -352,16 +356,16 @@ ExecAgg(Agg *node) default: elog(ERROR, "ExecAgg: Bad Agg->Target for Agg %d", aggno); } - if (attlen == -1) - { - /* variable length */ - attlen = VARSIZE((struct varlena *) newVal); - } - value1[aggno] = (Datum) palloc(attlen); if (byVal) value1[aggno] = newVal; else - memmove((char *) (value1[aggno]), (char *) newVal, attlen); + { + if (attlen == -1) /* variable length */ + attlen = VARSIZE((struct varlena *) newVal); + value1[aggno] = (Datum) palloc(attlen); + memcpy((char *) (value1[aggno]), (char *) newVal, + attlen); + } noInitValue[aggno] = 0; nulls[aggno] = 0; } @@ -380,10 +384,9 @@ ExecAgg(Agg *node) if (aggfns->xfn2.fn_addr != NULL) { - Datum xfn2_val = value2[aggno]; - + args[0] = value2[aggno]; value2[aggno] = (Datum) fmgr_c(&aggfns->xfn2, - (FmgrValues *) &xfn2_val, &isNull2); + (FmgrValues *) args, &isNull2); Assert(!isNull2); } } -- GitLab