Re: What would AggrefExprState nodes' args contain?

From: Vaibhav Kaushal <vaibhavkaushal123(at)gmail(dot)com>
To: Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: What would AggrefExprState nodes' args contain?
Date: 2011-04-28 10:51:52
Message-ID: BANLkTin+jGJX=SebUXZOMgp_q-wM+_bPzw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Thanks a lot. I was browsing the code and was thinking this would be the
most probable scenario.

But, the point is that even after removing the args initialization part in
the ExecInitExpr for AggrefState, the sum() function is working. I believe
that is also a aggregate function! If yes, then how is it working if I dd
not allow the args to be initialized. The debugger says that ExecEvalAggref
was called and the results returned are true.

Regards,
Vaibhav

On Thu, Apr 28, 2011 at 2:38 PM, Ashutosh Bapat <
ashutosh(dot)bapat(at)enterprisedb(dot)com> wrote:

> The args in AggrefExprState, are used in the functions ExecAgg, ExecInitAgg
> and their minions to evaluate the aggregates. The ExecEvalAggref() merely
> retrieves the results of aggregation calculated during ExecAgg.
>
>
> On Tue, Apr 26, 2011 at 12:04 PM, Vaibhav Kaushal <
> vaibhavkaushal123(at)gmail(dot)com> wrote:
>
>> 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
>>
>
>
>
> --
> Best Wishes,
> Ashutosh Bapat
> EntepriseDB Corporation
> The Enterprise Postgres Company
>
>

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Yves Weißig 2011-04-28 12:03:45 new AM, best way to obtain new block at end of index?
Previous Message Ashutosh Bapat 2011-04-28 09:08:25 Re: What would AggrefExprState nodes' args contain?