v1-0001-Support-MIN-MAX-record-aggregates-WIP.patch
application/octet-stream
Filename: v1-0001-Support-MIN-MAX-record-aggregates-WIP.patch
Type: application/octet-stream
Part: 0
Message:
Re: MIN/MAX functions for a record
Patch
Format: format-patch
Series: patch v1-0001
Subject: Support MIN/MAX(record) aggregates (WIP)
| File | + | − |
|---|---|---|
| src/backend/utils/adt/rowtypes.c | 12 | 0 |
| src/include/catalog/pg_aggregate.dat | 3 | 0 |
| src/include/catalog/pg_proc.dat | 6 | 0 |
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