diff options
author | David Rowley <drowley@postgresql.org> | 2021-07-04 18:47:31 +1200 |
---|---|---|
committer | David Rowley <drowley@postgresql.org> | 2021-07-04 18:47:31 +1200 |
commit | 63b1af94375cc2be06a5d6a932db24cd8e9f45e9 (patch) | |
tree | eb3a09111a707b132221674895b9190ee06bab4c /src/backend/parser/parse_agg.c | |
parent | 792259591c0fc19c42247fc7668b1064d1e850d4 (diff) | |
download | postgresql-63b1af94375cc2be06a5d6a932db24cd8e9f45e9.tar.gz postgresql-63b1af94375cc2be06a5d6a932db24cd8e9f45e9.zip |
Cleanup some aggregate code in the executor
Here we alter the code that calls build_pertrans_for_aggref() so that the
function no longer needs to special-case whether it's dealing with an
aggtransfn or an aggcombinefn. This allows us to reuse the
build_aggregate_transfn_expr() function and just get rid of the
build_aggregate_combinefn_expr() completely.
All of the special case code that was in build_pertrans_for_aggref() has
been moved up to the calling functions.
This saves about a dozen lines of code in nodeAgg.c and a few dozen more
in parse_agg.c
Also, rename a few variables in nodeAgg.c to try to make it more clear
that we're working with either a aggtransfn or an aggcombinefn. Some of
the old names would have you believe that we were always working with an
aggtransfn.
Discussion: https://postgr.es/m/CAApHDvptMQ9FmF0D67zC_w88yVnoNVR2+kkOQGUrCmdxWxLULQ@mail.gmail.com
Diffstat (limited to 'src/backend/parser/parse_agg.c')
-rw-r--r-- | src/backend/parser/parse_agg.c | 34 |
1 files changed, 5 insertions, 29 deletions
diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index a25f8d5b989..24268eb5024 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -1959,6 +1959,11 @@ resolve_aggregate_transtype(Oid aggfuncid, * latter may be InvalidOid, however if invtransfn_oid is set then * transfn_oid must also be set. * + * transfn_oid may also be passed as the aggcombinefn when the *transfnexpr is + * to be used for a combine aggregate phase. We expect invtransfn_oid to be + * InvalidOid in this case since there is no such thing as an inverse + * combinefn. + * * Pointers to the constructed trees are returned into *transfnexpr, * *invtransfnexpr. If there is no invtransfn, the respective pointer is set * to NULL. Since use of the invtransfn is optional, NULL may be passed for @@ -2023,35 +2028,6 @@ build_aggregate_transfn_expr(Oid *agg_input_types, /* * Like build_aggregate_transfn_expr, but creates an expression tree for the - * combine function of an aggregate, rather than the transition function. - */ -void -build_aggregate_combinefn_expr(Oid agg_state_type, - Oid agg_input_collation, - Oid combinefn_oid, - Expr **combinefnexpr) -{ - Node *argp; - List *args; - FuncExpr *fexpr; - - /* combinefn takes two arguments of the aggregate state type */ - argp = make_agg_arg(agg_state_type, agg_input_collation); - - args = list_make2(argp, argp); - - fexpr = makeFuncExpr(combinefn_oid, - agg_state_type, - args, - InvalidOid, - agg_input_collation, - COERCE_EXPLICIT_CALL); - /* combinefn is currently never treated as variadic */ - *combinefnexpr = (Expr *) fexpr; -} - -/* - * Like build_aggregate_transfn_expr, but creates an expression tree for the * serialization function of an aggregate. */ void |