aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_agg.c
diff options
context:
space:
mode:
authorDavid Rowley <drowley@postgresql.org>2021-07-04 18:47:31 +1200
committerDavid Rowley <drowley@postgresql.org>2021-07-04 18:47:31 +1200
commit63b1af94375cc2be06a5d6a932db24cd8e9f45e9 (patch)
treeeb3a09111a707b132221674895b9190ee06bab4c /src/backend/parser/parse_agg.c
parent792259591c0fc19c42247fc7668b1064d1e850d4 (diff)
downloadpostgresql-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.c34
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