From d611ccb874b908b38a709f1e21e9fdb6c69019ff Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 27 Jan 1999 16:15:01 +0000 Subject: [PATCH] fix for aggregates --- src/backend/executor/nodeAgg.c | 36 ++++++++++++++-------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 567b3a3c18a..23fc1560d01 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -129,7 +129,7 @@ ExecAgg(Agg *node) econtext = aggstate->csstate.cstate.cs_ExprContext; nagg = length(node->aggs); - + value1 = node->aggstate->csstate.cstate.cs_ExprContext->ecxt_values; nulls = node->aggstate->csstate.cstate.cs_ExprContext->ecxt_nulls; @@ -158,7 +158,7 @@ ExecAgg(Agg *node) xfn2_oid, finalfn_oid; - aggno++; + aggref->aggno = ++aggno; /* --------------------- * find transfer functions of all the aggregates and initialize @@ -252,14 +252,15 @@ ExecAgg(Agg *node) TupleDesc tupType; Datum *tupValue; char *null_array; + AttrNumber attnum; tupType = aggstate->csstate.css_ScanTupleSlot->ttc_tupleDescriptor; tupValue = projInfo->pi_tupValue; /* initially, set all the values to NULL */ null_array = palloc(sizeof(char) * tupType->natts); - for (aggno = 0; aggno < tupType->natts; aggno++) - null_array[aggno] = 'n'; + for (attnum = 0; attnum < tupType->natts; attnum++) + null_array[attnum] = 'n'; oneTuple = heap_formtuple(tupType, tupValue, null_array); pfree(null_array); } @@ -328,8 +329,8 @@ ExecAgg(Agg *node) attnum = ((Var *) aggref->target)->varattno; attlen = outerslot->ttc_tupleDescriptor->attrs[attnum - 1]->attlen; byVal = outerslot->ttc_tupleDescriptor->attrs[attnum - 1]->attbyval; - break; + case T_Expr: { FunctionCachePtr fcache_ptr; @@ -340,8 +341,8 @@ ExecAgg(Agg *node) fcache_ptr = ((Oper *) tagnode)->op_fcache; attlen = fcache_ptr->typlen; byVal = fcache_ptr->typbyval; - break; + } case T_Const: attlen = ((Const *) aggref->target)->constlen; @@ -371,10 +372,8 @@ ExecAgg(Agg *node) */ args[0] = value1[aggno]; args[1] = newVal; - value1[aggno] = - (Datum) fmgr_c(&aggfns->xfn1, - (FmgrValues *) args, - &isNull1); + value1[aggno] = (Datum) fmgr_c(&aggfns->xfn1, + (FmgrValues *) args, &isNull1); Assert(!isNull1); } } @@ -383,8 +382,7 @@ ExecAgg(Agg *node) { Datum xfn2_val = value2[aggno]; - value2[aggno] = - (Datum) fmgr_c(&aggfns->xfn2, + value2[aggno] = (Datum) fmgr_c(&aggfns->xfn2, (FmgrValues *) &xfn2_val, &isNull2); Assert(!isNull2); } @@ -481,9 +479,8 @@ ExecAgg(Agg *node) * As long as the retrieved group does not match the * qualifications it is ignored and the next group is fetched */ - if(node->plan.qual != NULL){ - qual_result = ExecQual(fix_opids(node->plan.qual), econtext); - } + if(node->plan.qual != NULL) + qual_result = ExecQual(fix_opids(node->plan.qual), econtext); else qual_result = false; if (oneTuple) @@ -523,8 +520,7 @@ ExecInitAgg(Agg *node, EState *estate, Plan *parent) /* * assign node's base id and create expression context */ - ExecAssignNodeBaseInfo(estate, &aggstate->csstate.cstate, - (Plan *) parent); + ExecAssignNodeBaseInfo(estate, &aggstate->csstate.cstate, (Plan *) parent); ExecAssignExprContext(estate, &aggstate->csstate.cstate); #define AGG_NSLOTS 2 @@ -536,8 +532,7 @@ ExecInitAgg(Agg *node, EState *estate, Plan *parent) ExecInitResultTupleSlot(estate, &aggstate->csstate.cstate); econtext = aggstate->csstate.cstate.cs_ExprContext; - econtext->ecxt_values = - (Datum *) palloc(sizeof(Datum) * length(node->aggs)); + econtext->ecxt_values = (Datum *) palloc(sizeof(Datum) * length(node->aggs)); MemSet(econtext->ecxt_values, 0, sizeof(Datum) * length(node->aggs)); econtext->ecxt_nulls = (char *) palloc(sizeof(char) * length(node->aggs)); MemSet(econtext->ecxt_nulls, 0, sizeof(char) * length(node->aggs)); @@ -665,8 +660,7 @@ aggGetAttr(TupleTableSlot *slot, return (Datum) tempSlot; } - result = - heap_getattr(heapTuple, /* tuple containing attribute */ + result = heap_getattr(heapTuple, /* tuple containing attribute */ attnum, /* attribute number of desired attribute */ tuple_type,/* tuple descriptor of tuple */ isNull); /* return: is attribute null? */