1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-14 18:42:34 +03:00

Add parallel query support functions for assorted aggregates.

This lets us use parallel aggregate for a variety of useful cases
that didn't work before, like sum(int8), sum(numeric), several
versions of avg(), and various other functions.

Add some regression tests, as well, testing the general sanity of
these and future catalog entries.

David Rowley, reviewed by Tomas Vondra, with a few further changes
by me.
This commit is contained in:
Robert Haas
2016-04-05 14:24:59 -04:00
parent 7117685461
commit 11c8669c0c
11 changed files with 1318 additions and 80 deletions

View File

@ -3524,6 +3524,55 @@ interval_accum(PG_FUNCTION_ARGS)
PG_RETURN_ARRAYTYPE_P(result);
}
Datum
interval_combine(PG_FUNCTION_ARGS)
{
ArrayType *transarray1 = PG_GETARG_ARRAYTYPE_P(0);
ArrayType *transarray2 = PG_GETARG_ARRAYTYPE_P(1);
Datum *transdatums1;
Datum *transdatums2;
int ndatums1;
int ndatums2;
Interval sum1,
N1;
Interval sum2,
N2;
Interval *newsum;
ArrayType *result;
deconstruct_array(transarray1,
INTERVALOID, sizeof(Interval), false, 'd',
&transdatums1, NULL, &ndatums1);
if (ndatums1 != 2)
elog(ERROR, "expected 2-element interval array");
sum1 = *(DatumGetIntervalP(transdatums1[0]));
N1 = *(DatumGetIntervalP(transdatums1[1]));
deconstruct_array(transarray2,
INTERVALOID, sizeof(Interval), false, 'd',
&transdatums2, NULL, &ndatums2);
if (ndatums2 != 2)
elog(ERROR, "expected 2-element interval array");
sum2 = *(DatumGetIntervalP(transdatums2[0]));
N2 = *(DatumGetIntervalP(transdatums2[1]));
newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl,
IntervalPGetDatum(&sum1),
IntervalPGetDatum(&sum2)));
N1.time += N2.time;
transdatums1[0] = IntervalPGetDatum(newsum);
transdatums1[1] = IntervalPGetDatum(&N1);
result = construct_array(transdatums1, 2,
INTERVALOID, sizeof(Interval), false, 'd');
PG_RETURN_ARRAYTYPE_P(result);
}
Datum
interval_accum_inv(PG_FUNCTION_ARGS)
{