[PATCH v1 04/12] prune_xid-hist: add catalog functions

Renan Alves Fonseca <renanfonseca@gmail.com>

From: "Renan A. Fonseca" <renanfonseca@gmail.com>
To:
Date: 2025-05-22T08:34:35Z
Lists: pgsql-hackers
---
 src/backend/utils/adt/pgstatfuncs.c | 48 +++++++++++++++++++++++++++++
 src/include/catalog/pg_proc.dat     |  8 +++++
 2 files changed, 56 insertions(+)

diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 97af7c6554f..1df9bda3354 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -29,6 +29,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/acl.h"
+#include "utils/array.h"
 #include "utils/builtins.h"
 #include "utils/timestamp.h"
 
@@ -70,6 +71,53 @@ PG_STAT_GET_RELENTRY_INT64(blocks_hit)
 /* pg_stat_get_dead_tuples */
 PG_STAT_GET_RELENTRY_INT64(dead_tuples)
 
+/* pg_stat_get_prune_xid_freqs */
+Datum
+pg_stat_get_prune_xid_freqs(FunctionCallInfo fcinfo)
+{
+	Oid			relid = DatumGetObjectId((fcinfo->args[0].value));
+	Datum	   *result;
+	PgStat_StatTabEntry *tabentry;
+	int			i;
+	const PgStat_Counter *freqs;
+
+	tabentry = pgstat_fetch_stat_tabentry(relid);
+	if (tabentry == ((void *) 0))
+		/* OID not found */
+		PG_RETURN_ARRAYTYPE_P(construct_empty_array(XIDOID));
+
+	freqs = pgstat_get_prune_xid_histogram_freqs(tabentry);
+	result = palloc((PRUNE_XID_HIST_NBINS) * sizeof(Datum));
+	for (i = 0; i < PRUNE_XID_HIST_NBINS; i++)
+		result[i] = Int64GetDatum(freqs[i]);
+
+	PG_RETURN_ARRAYTYPE_P(construct_array_builtin(result, PRUNE_XID_HIST_NBINS, XIDOID));
+}
+
+/* pg_stat_get_prune_xid_bounds */
+Datum
+pg_stat_get_prune_xid_bounds(FunctionCallInfo fcinfo)
+{
+	Oid			relid = DatumGetObjectId((fcinfo->args[0].value));
+	Datum	   *result;
+	PgStat_StatTabEntry *tabentry;
+	int			i;
+	const TransactionId *bounds;
+
+	tabentry = pgstat_fetch_stat_tabentry(relid);
+	if (tabentry == ((void *) 0))
+		/* OID not found */
+		PG_RETURN_ARRAYTYPE_P(construct_empty_array(INT8OID));
+
+	bounds = pgstat_get_prune_xid_histogram_bounds(tabentry);
+	result = palloc(PRUNE_XID_HIST_NBINS * sizeof(Datum));
+	for (i = 0; i < PRUNE_XID_HIST_NBINS; i++)
+		result[i] = TransactionIdGetDatum(bounds[i]);
+
+	PG_RETURN_ARRAYTYPE_P(construct_array_builtin(result, PRUNE_XID_HIST_NBINS, INT8OID));
+}
+
+
 /* pg_stat_get_ins_since_vacuum */
 PG_STAT_GET_RELENTRY_INT64(ins_since_vacuum)
 
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 62beb71da28..9628f4c72f6 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -5561,6 +5561,14 @@
   proname => 'pg_stat_get_dead_tuples', provolatile => 's', proparallel => 'r',
   prorettype => 'int8', proargtypes => 'oid',
   prosrc => 'pg_stat_get_dead_tuples' },
+{ oid => '8410', descr => 'statistics: histogram of prune_xid',
+  proname => 'pg_stat_get_prune_xid_freqs', provolatile => 's', proparallel => 'r',
+  prorettype => 'anyarray', proargtypes => 'oid',
+  prosrc => 'pg_stat_get_prune_xid_freqs' },
+{ oid => '8411', descr => 'statistics: histogram of prune_xid',
+  proname => 'pg_stat_get_prune_xid_bounds', provolatile => 's', proparallel => 'r',
+  prorettype => 'anyarray', proargtypes => 'oid',
+  prosrc => 'pg_stat_get_prune_xid_bounds' },
 { oid => '3177',
   descr => 'statistics: number of tuples changed since last analyze',
   proname => 'pg_stat_get_mod_since_analyze', provolatile => 's',
-- 
2.47.0


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=v1-0005-prune_xid-hist-core-functions.patch