[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