aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeAgg.c
diff options
context:
space:
mode:
authorPostgreSQL Daemon <webmaster@postgresql.org>1998-01-15 19:46:37 +0000
committerPostgreSQL Daemon <webmaster@postgresql.org>1998-01-15 19:46:37 +0000
commitbaef78d96b799b6264a54f8cfce4fda2b2da9701 (patch)
treea842ceff78d7eba3de43ba866976d828cf6d2d34 /src/backend/executor/nodeAgg.c
parent763ff8aef848d71da079049890786edffc3302d6 (diff)
downloadpostgresql-baef78d96b799b6264a54f8cfce4fda2b2da9701.tar.gz
postgresql-baef78d96b799b6264a54f8cfce4fda2b2da9701.zip
Thank god for searchable mail archives.
Patch by: wieck@sapserv.debis.de (Jan Wieck) One of the design rules of PostgreSQL is extensibility. And to follow this rule means (at least for me) that there should not only be a builtin PL. Instead I would prefer a defined interface for PL implemetations.
Diffstat (limited to 'src/backend/executor/nodeAgg.c')
-rw-r--r--src/backend/executor/nodeAgg.c58
1 files changed, 20 insertions, 38 deletions
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index 62970db8c7b..feda58bcd67 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -39,12 +39,9 @@ typedef struct AggFuncInfo
Oid xfn1_oid;
Oid xfn2_oid;
Oid finalfn_oid;
- func_ptr xfn1;
- func_ptr xfn2;
- func_ptr finalfn;
- int xfn1_nargs;
- int xfn2_nargs;
- int finalfn_nargs;
+ FmgrInfo xfn1;
+ FmgrInfo xfn2;
+ FmgrInfo finalfn;
} AggFuncInfo;
static Datum aggGetAttr(TupleTableSlot *tuple, Aggreg *agg, bool *isNull);
@@ -160,12 +157,6 @@ ExecAgg(Agg *node)
Oid xfn1_oid,
xfn2_oid,
finalfn_oid;
- func_ptr xfn1_ptr,
- xfn2_ptr,
- finalfn_ptr;
- int xfn1_nargs,
- xfn2_nargs,
- finalfn_nargs;
agg = aggregates[i];
@@ -191,18 +182,14 @@ ExecAgg(Agg *node)
if (OidIsValid(finalfn_oid))
{
- fmgr_info(finalfn_oid, &finalfn_ptr, &finalfn_nargs);
+ fmgr_info(finalfn_oid, &aggFuncInfo[i].finalfn);
aggFuncInfo[i].finalfn_oid = finalfn_oid;
- aggFuncInfo[i].finalfn = finalfn_ptr;
- aggFuncInfo[i].finalfn_nargs = finalfn_nargs;
}
if (OidIsValid(xfn2_oid))
{
- fmgr_info(xfn2_oid, &xfn2_ptr, &xfn2_nargs);
+ fmgr_info(xfn2_oid, &aggFuncInfo[i].xfn2);
aggFuncInfo[i].xfn2_oid = xfn2_oid;
- aggFuncInfo[i].xfn2 = xfn2_ptr;
- aggFuncInfo[i].xfn2_nargs = xfn2_nargs;
value2[i] = (Datum) AggNameGetInitVal((char *) aggname,
aggp->aggbasetype,
2,
@@ -219,10 +206,8 @@ ExecAgg(Agg *node)
if (OidIsValid(xfn1_oid))
{
- fmgr_info(xfn1_oid, &xfn1_ptr, &xfn1_nargs);
+ fmgr_info(xfn1_oid, &aggFuncInfo[i].xfn1);
aggFuncInfo[i].xfn1_oid = xfn1_oid;
- aggFuncInfo[i].xfn1 = xfn1_ptr;
- aggFuncInfo[i].xfn1_nargs = xfn1_nargs;
value1[i] = (Datum) AggNameGetInitVal((char *) aggname,
aggp->aggbasetype,
1,
@@ -321,7 +306,7 @@ ExecAgg(Agg *node)
if (isNull && !aggregates[i]->usenulls)
continue; /* ignore this tuple for this agg */
- if (aggfns->xfn1)
+ if (aggfns->xfn1.fn_addr != NULL)
{
if (noInitValue[i])
{
@@ -389,20 +374,19 @@ ExecAgg(Agg *node)
args[0] = value1[i];
args[1] = newVal;
value1[i] =
- (Datum) fmgr_c(aggfns->xfn1, aggfns->xfn1_oid,
- aggfns->xfn1_nargs, (FmgrValues *) args,
+ (Datum) fmgr_c(&aggfns->xfn1,
+ (FmgrValues *) args,
&isNull1);
Assert(!isNull1);
}
}
- if (aggfns->xfn2)
+ if (aggfns->xfn2.fn_addr != NULL)
{
Datum xfn2_val = value2[i];
value2[i] =
- (Datum) fmgr_c(aggfns->xfn2, aggfns->xfn2_oid,
- aggfns->xfn2_nargs,
+ (Datum) fmgr_c(&aggfns->xfn2,
(FmgrValues *) &xfn2_val, &isNull2);
Assert(!isNull2);
}
@@ -437,29 +421,27 @@ ExecAgg(Agg *node)
* seems to fix behavior for avg() aggregate. -tgl 12/96
*/
}
- else if (aggfns->finalfn && nTuplesAgged > 0)
+ else if (aggfns->finalfn.fn_addr != NULL && nTuplesAgged > 0)
{
- if (aggfns->finalfn_nargs > 1)
+ if (aggfns->finalfn.fn_nargs > 1)
{
args[0] = (char *) value1[i];
args[1] = (char *) value2[i];
}
- else if (aggfns->xfn1)
+ else if (aggfns->xfn1.fn_addr != NULL)
{
args[0] = (char *) value1[i];
}
- else if (aggfns->xfn2)
+ else if (aggfns->xfn2.fn_addr != NULL)
{
args[0] = (char *) value2[i];
}
else
- elog(ERROR, "ExecAgg: no valid transition functions??");
- value1[i] =
- (Datum) fmgr_c(aggfns->finalfn, aggfns->finalfn_oid,
- aggfns->finalfn_nargs, (FmgrValues *) args,
- &(nulls[i]));
+ elog(WARN, "ExecAgg: no valid transition functions??");
+ value1[i] = (Datum) fmgr_c(&aggfns->finalfn,
+ (FmgrValues *) args, &(nulls[i]));
}
- else if (aggfns->xfn1)
+ else if (aggfns->xfn1.fn_addr != NULL)
{
/*
@@ -467,7 +449,7 @@ ExecAgg(Agg *node)
* fix the else part. -ay 2/95)
*/
}
- else if (aggfns->xfn2)
+ else if (aggfns->xfn2.fn_addr != NULL)
{
value1[i] = value2[i];
}