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:
@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user