diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2015-08-04 17:53:10 +0300 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2015-08-04 17:53:10 +0300 |
commit | 804163bc25e979fcd91b02e58fa2d1c6b587cc65 (patch) | |
tree | 841c63e6356df2bc42b3729cb05ba2f9834bdd78 /src/include/parser | |
parent | dee0200f0276c0f9da930a2c926f90f5615f2d64 (diff) | |
download | postgresql-804163bc25e979fcd91b02e58fa2d1c6b587cc65.tar.gz postgresql-804163bc25e979fcd91b02e58fa2d1c6b587cc65.zip |
Share transition state between different aggregates when possible.
If there are two different aggregates in the query with same inputs, and
the aggregates have the same initial condition and transition function,
only calculate the state value once, and only call the final functions
separately. For example, AVG(x) and SUM(x) aggregates have the same
transition function, which accumulates the sum and number of input tuples.
For a query like "SELECT AVG(x), SUM(x) FROM x", we can therefore
accumulate the state function only once, which gives a nice speedup.
David Rowley, reviewed and edited by me.
Diffstat (limited to 'src/include/parser')
-rw-r--r-- | src/include/parser/parse_agg.h | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/include/parser/parse_agg.h b/src/include/parser/parse_agg.h index 6a5f9bbdf15..e2b3894c282 100644 --- a/src/include/parser/parse_agg.h +++ b/src/include/parser/parse_agg.h @@ -35,19 +35,23 @@ extern Oid resolve_aggregate_transtype(Oid aggfuncid, Oid *inputTypes, int numArguments); -extern void build_aggregate_fnexprs(Oid *agg_input_types, +extern void build_aggregate_transfn_expr(Oid *agg_input_types, int agg_num_inputs, int agg_num_direct_inputs, - int num_finalfn_inputs, bool agg_variadic, Oid agg_state_type, - Oid agg_result_type, Oid agg_input_collation, Oid transfn_oid, Oid invtransfn_oid, - Oid finalfn_oid, Expr **transfnexpr, - Expr **invtransfnexpr, + Expr **invtransfnexpr); + +extern void build_aggregate_finalfn_expr(Oid *agg_input_types, + int num_finalfn_inputs, + Oid agg_state_type, + Oid agg_result_type, + Oid agg_input_collation, + Oid finalfn_oid, Expr **finalfnexpr); #endif /* PARSE_AGG_H */ |