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

Reply via email to