From f374fca9ae806ac22379056f1238b725dea14ca8 Mon Sep 17 00:00:00 2001
From: Aleksander Alekseev <aleksander@timescale.com>
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

