diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-07-27 19:52:07 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-07-27 19:52:07 +0000 |
commit | 108fe4730152058f9b576969d08898b39bf7fc38 (patch) | |
tree | 15a7d14be8267612cdfed4de8af86993b37f9997 /src/backend/utils/adt/ruleutils.c | |
parent | c2d1138351f89d0705f71cf935a56b9a2e28ed24 (diff) | |
download | postgresql-108fe4730152058f9b576969d08898b39bf7fc38.tar.gz postgresql-108fe4730152058f9b576969d08898b39bf7fc38.zip |
Aggregate functions now support multiple input arguments. I also took
the opportunity to treat COUNT(*) as a zero-argument aggregate instead
of the old hack that equated it to COUNT(1); this is materially cleaner
(no more weird ANYOID cases) and ought to be at least a tiny bit faster.
Original patch by Sergey Koposov; review, documentation, simple regression
tests, pg_dump and psql support by moi.
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 605efc60403..a2254b6e481 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -2,7 +2,7 @@ * ruleutils.c - Functions to convert stored expressions/querytrees * back to source text * - * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.228 2006/07/14 14:52:24 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.229 2006/07/27 19:52:06 tgl Exp $ **********************************************************************/ #include "postgres.h" @@ -3880,15 +3880,29 @@ static void get_agg_expr(Aggref *aggref, deparse_context *context) { StringInfo buf = context->buf; - Oid argtype = exprType((Node *) aggref->target); + Oid argtypes[FUNC_MAX_ARGS]; + int nargs; + ListCell *l; + + nargs = 0; + foreach(l, aggref->args) + { + if (nargs >= FUNC_MAX_ARGS) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_ARGUMENTS), + errmsg("too many arguments"))); + argtypes[nargs] = exprType((Node *) lfirst(l)); + nargs++; + } appendStringInfo(buf, "%s(%s", - generate_function_name(aggref->aggfnoid, 1, &argtype), + generate_function_name(aggref->aggfnoid, nargs, argtypes), aggref->aggdistinct ? "DISTINCT " : ""); + /* aggstar can be set only in zero-argument aggregates */ if (aggref->aggstar) - appendStringInfo(buf, "*"); + appendStringInfoChar(buf, '*'); else - get_rule_expr((Node *) aggref->target, context, true); + get_rule_expr((Node *) aggref->args, context, true); appendStringInfoChar(buf, ')'); } |