Thread

  1. Re: Add pg_stat_kind_info system view

    Tristan Partin <tristan@partin.io> — 2026-05-28T17:11:42Z

    On Thu May 14, 2026 at 5:30 AM UTC, Michael Paquier wrote:
    > On Thu, Apr 30, 2026 at 07:38:57PM +0000, Tristan Partin wrote:
    >> Of course I forgot to attach the patch :D.
    >
    > Thanks for the patch.  That sounds like a good idea particularly for
    > track_entry_count, because we have no real way to provide this
    > information, which would be more valuable if an in-core stats kind has
    > the idea to switch this flag to true in the future, and I don't really
    > want all extensions to re-implement the same thing to access this
    > information.
    >
    > +            if (info->track_entry_count)
    > +            {
    > +                values[2] = Int64GetDatum(pgstat_get_entry_count(kind));
    > +            }
    > +            else
    > +            {
    > +                nulls[2] = true;
    > +            }
    >
    > Returning NULL if the flag is not set sounds sensible.  For
    > fixed-numbered, fine by me for 1, so as it is possible to aggregate
    > the full size counting with the fixed shmem size of each stats kind.
    
    Awesome.
    
    > +SELECT name, builtin FROM pg_stat_kind_info
    > +  ORDER BY name COLLATE "C";
    >
    > This is not going to be stable if running installcheck on an instance
    > where a custom kind is loaded, so let's restrict the query to check
    > for built-in kinds.
    
    I'll fix this in v2, which I will send after resolving more discussion. 
    I had not considered this as a potential problem. I'll remove the 
    builtin column from the SELECT and filter on builtin as suggested.
    
    > I'd suggest to expand the data published to more fields and not only
    > what's presented here, so as it becomes possible to do more SQL sanity
    > checks with the stats kind info (same attribute name as the fields):
    > - fixed_amount, where shared_size > 0 does not make sense.
    > - snapshot_ctl_off and shared_ctl_off, that only makes sense under
    > fixed_amount.  These should not be set for !fixed_amount.
    > - pending_size, that should not be set for fixed_amount.
    > - existence of flush_pending_cb, delete_pending_cb,
    > reset_timestamp_cb, to_serialized_name, from_serialized_name,
    > to_serialized_data, from_serialized_data (should be booleans), fine
    > for !fixed_amount, never for fixed_amount.
    > - existence of init_shmem_cb, reset_all_cb, snapshot_cb (should be
    > booleans), fine for fixed_amount, never for !fixed_amount.
    
    Can you share how someone might use this additional information? I can 
    see some inherent value for additionally exposing:
    
    - fixed_amount
    - accessed_across_databases
    - write_to_file
    - snapshot_ctl_off
    - shared_ctl_off
    - shared_data_off
    - shared_data_len
    - pending_size
    
    > I may be missing one or two things.  pgstat_internal.h documents all
    > these requirements, the idea is to translate these requirements at SQL
    > level.  We should definitely apply these checks for both custom and
    > built-in stats kinds, which should save time for developers of pgstats
    > in core and outside of core by detecting inconsistent patterns
    > beforehand.
    
    Not sure I understand why we would want to expose the existence of the 
    callbacks to make assertions at the SQL level. I see that in 
    pgstat_register_kind(), we have the following code:
    
    	/*
    	 * Check some data for fixed-numbered stats.
    	 */
    	if (kind_info->fixed_amount)
    	{
    		if (kind_info->shared_size == 0)
    			ereport(ERROR,
    					(errmsg("custom cumulative statistics property is invalid"),
    					 errhint("Custom cumulative statistics require a shared memory size for fixed-numbered objects.")));
    		if (kind_info->track_entry_count)
    			ereport(ERROR,
    					(errmsg("custom cumulative statistics property is invalid"),
    					 errhint("Custom cumulative statistics cannot use entry count tracking for fixed-numbered objects.")));
    	}
    
    We could extend these invariant checks to make sure that the callbacks 
    are only set when fixed_amount is true for instance. I am very much open 
    to having my mind changed.
    
    -- 
    Tristan Partin
    PostgreSQL Contributors Team
    AWS (https://aws.amazon.com)