I tried all aggregates - min,max,sum,count and avg. all are working. What do you suggest now?
On Fri, Apr 29, 2011 at 11:30 AM, Ashutosh Bapat < ashutosh.ba...@enterprisedb.com> wrote: > > > On Thu, Apr 28, 2011 at 4:21 PM, Vaibhav Kaushal < > vaibhavkaushal...@gmail.com> wrote: > >> 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. >> >> > Did you check the same thing with avg, or any statistical aggregates. Sum > does not need all the aggregate infrastructure in place, for example > finalisation function. May be after removing initialization part you want to > run regression (or at least aggregates.sql) to see what it breaks. > > >> Regards, >> Vaibhav >> >> >> On Thu, Apr 28, 2011 at 2:38 PM, Ashutosh Bapat < >> ashutosh.ba...@enterprisedb.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 < >>> vaibhavkaushal...@gmail.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 >>> >>> >> > > > -- > Best Wishes, > Ashutosh Bapat > EntepriseDB Corporation > The Enterprise Postgres Company > >