Thread

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

    Renan Alves Fonseca <renanfonseca@gmail.com> — 2025-05-22T08:34:35Z

    ---
     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