Hello all,
While examining the executor, I was wondering what the *args part of
AggrefExprState nodes contain. I found that the Aggref (Expr)'s args list
is a list of TargetEntry nodes. But the state node's args is initialized in
ExecInitExpr as:
astate->args = (List *) ExecInitExpr((Expr *) aggref->args,
parent);
This would mean that the args is actually a ExprState node list with one
single item (the ExprState node / tree). I believe it potentially contains
the execution tree to determine the state / value of the aggref
(sub)expression. But then in the ExecEvalAggref function I do not see the
args coming into picture at all! I am also unable to find a call to some
function for executing the state node created in the args list. Also, no
value is being extracted from that node! Why is it so?
For quick reference I am adding the function (may be you don't need it but
still... its a small one):
/* ----------------------------------------------------------------
* ExecEvalAggref
*
* Returns a Datum whose value is the value of the precomputed
* aggregate found in the given expression context.
* ----------------------------------------------------------------
*/
static Datum
ExecEvalAggref(AggrefExprState *aggref, ExprContext *econtext,
bool *isNull, ExprDoneCond *isDone)
{
if (isDone)
*isDone = ExprSingleResult;
if (econtext->ecxt_aggvalues == NULL) /* safety check */
elog(ERROR, "no aggregates in this expression context");
*isNull = econtext->ecxt_aggnulls[aggref->aggno];
return econtext->ecxt_aggvalues[aggref->aggno];
}
What is the use of args in AggrefExprState node here? Is it there just for
some historical reason?
Regards,
Vaibhav