mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Allow parallel aggregate on string_agg and array_agg
This adds combine, serial and deserial functions for the array_agg() and string_agg() aggregate functions, thus allowing these aggregates to partake in partial aggregations. This allows both parallel aggregation to take place when these aggregates are present and also allows additional partition-wise aggregation plan shapes to include plans that require additional aggregation once the partially aggregated results from the partitions have been combined. Author: David Rowley Reviewed-by: Andres Freund, Tomas Vondra, Stephen Frost, Tom Lane Discussion: https://postgr.es/m/CAKJS1f9sx_6GTcvd6TMuZnNtCh0VhBzhX6FZqw17TgVFH-ga_A@mail.gmail.com
This commit is contained in:
@ -5262,6 +5262,24 @@ array_insert_slice(ArrayType *destArray,
|
||||
*/
|
||||
ArrayBuildState *
|
||||
initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
|
||||
{
|
||||
/*
|
||||
* When using a subcontext, we can afford to start with a somewhat larger
|
||||
* initial array size. Without subcontexts, we'd better hope that most of
|
||||
* the states stay small ...
|
||||
*/
|
||||
return initArrayResultWithSize(element_type, rcontext, subcontext,
|
||||
subcontext ? 64 : 8);
|
||||
}
|
||||
|
||||
/*
|
||||
* initArrayResultWithSize
|
||||
* As initArrayResult, but allow the initial size of the allocated arrays
|
||||
* to be specified.
|
||||
*/
|
||||
ArrayBuildState *
|
||||
initArrayResultWithSize(Oid element_type, MemoryContext rcontext,
|
||||
bool subcontext, int initsize)
|
||||
{
|
||||
ArrayBuildState *astate;
|
||||
MemoryContext arr_context = rcontext;
|
||||
@ -5276,7 +5294,7 @@ initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
|
||||
MemoryContextAlloc(arr_context, sizeof(ArrayBuildState));
|
||||
astate->mcontext = arr_context;
|
||||
astate->private_cxt = subcontext;
|
||||
astate->alen = (subcontext ? 64 : 8); /* arbitrary starting array size */
|
||||
astate->alen = initsize;
|
||||
astate->dvalues = (Datum *)
|
||||
MemoryContextAlloc(arr_context, astate->alen * sizeof(Datum));
|
||||
astate->dnulls = (bool *)
|
||||
|
Reference in New Issue
Block a user