From f374fca9ae806ac22379056f1238b725dea14ca8 Mon Sep 17 00:00:00 2001 From: Aleksander Alekseev Date: Sat, 23 Mar 2024 13:16:08 +0300 Subject: [PATCH v1] Support MIN/MAX(record) aggregates (WIP) --- src/backend/utils/adt/rowtypes.c | 12 ++++++++++++ src/include/catalog/pg_aggregate.dat | 3 +++ src/include/catalog/pg_proc.dat | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c index 0214c23a1d..128927652b 100644 --- a/src/backend/utils/adt/rowtypes.c +++ b/src/backend/utils/adt/rowtypes.c @@ -1315,6 +1315,18 @@ btrecordcmp(PG_FUNCTION_ARGS) PG_RETURN_INT32(record_cmp(fcinfo)); } +Datum +record_larger(PG_FUNCTION_ARGS) +{ + HeapTupleHeader record1 = PG_GETARG_HEAPTUPLEHEADER(0); + HeapTupleHeader record2 = PG_GETARG_HEAPTUPLEHEADER(1); + + /* XXX should we make a copy? */ + if (DatumGetBool(record_gt(fcinfo))) + PG_RETURN_HEAPTUPLEHEADER(record1); + else + PG_RETURN_HEAPTUPLEHEADER(record2); +} /* * record_image_cmp : diff --git a/src/include/catalog/pg_aggregate.dat b/src/include/catalog/pg_aggregate.dat index 08764cbc70..12c070527d 100644 --- a/src/include/catalog/pg_aggregate.dat +++ b/src/include/catalog/pg_aggregate.dat @@ -156,6 +156,9 @@ { aggfnoid => 'max(xid8)', aggtransfn => 'xid8_larger', aggcombinefn => 'xid8_larger', aggsortop => '>(xid8,xid8)', aggtranstype => 'xid8' }, +{ aggfnoid => 'max(record)', aggtransfn => 'record_larger', + aggcombinefn => 'record_larger', aggsortop => '>(record,record)', + aggtranstype => 'record' }, # min { aggfnoid => 'min(int8)', aggtransfn => 'int8smaller', diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 71c74350a0..ee9d096f59 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6748,6 +6748,9 @@ { oid => '5099', descr => 'maximum value of all xid8 input values', proname => 'max', prokind => 'a', proisstrict => 'f', prorettype => 'xid8', proargtypes => 'xid8', prosrc => 'aggregate_dummy' }, +{ oid => '8597', descr => 'maximum value of all record input values', + proname => 'max', prokind => 'a', proisstrict => 'f', prorettype => 'record', + proargtypes => 'record', prosrc => 'aggregate_dummy' }, { oid => '2131', descr => 'minimum value of all bigint input values', proname => 'min', prokind => 'a', proisstrict => 'f', prorettype => 'int8', @@ -10330,6 +10333,9 @@ { oid => '2987', descr => 'less-equal-greater', proname => 'btrecordcmp', prorettype => 'int4', proargtypes => 'record record', prosrc => 'btrecordcmp' }, +{ oid => '8287', descr => 'larger of two', + proname => 'record_larger', prorettype => 'record', proargtypes => 'record record', + prosrc => 'record_larger' }, { oid => '6192', descr => 'hash', proname => 'hash_record', prorettype => 'int4', proargtypes => 'record', -- 2.44.0