Hi,

On 11/21/22 12:19 AM, Andres Freund wrote:
Hi,

On 2022-11-18 12:18:38 +0100, Drouvot, Bertrand wrote:
On 11/16/22 9:12 PM, Andres Freund wrote:
This still leaves a fair bit of boilerplate. ISTM that the function body
really should just be a single line.

Might even be worth defining the whole function via a macro. Perhaps something 
like

PGSTAT_DEFINE_REL_FIELD_ACCESSOR(PGSTAT_KIND_INDEX, pg_stat_get_index, 
numscans);

Thanks for the feedback!

Right, what about something like the following?

"
#define PGSTAT_FETCH_STAT_ENTRY(pgstat_entry_kind, pgstat_fetch_stat_function, 
relid, stat_name) \
        do { \
                pgstat_entry_kind *entry = pgstat_fetch_stat_function(relid); \
                PG_RETURN_INT64(entry == NULL ? 0 : (int64) 
(entry->stat_name)); \
        } while (0)

Datum
pg_stat_get_index_numscans(PG_FUNCTION_ARGS)
{
        PGSTAT_FETCH_STAT_ENTRY(PgStat_StatIndEntry, 
pgstat_fetch_stat_indentry, PG_GETARG_OID(0), numscans);
}
"

That's better, but still seems like quite a bit of repetition, given the
number of accessors. I think I like my idea of a macro defining the whole
function a bit better.


Got it, what about creating another preparatory commit to first introduce 
something like:

"
#define PGSTAT_DEFINE_REL_FIELD_ACCESSOR(function_name_prefix, stat_name) \
Datum \
function_name_prefix##_##stat_name(PG_FUNCTION_ARGS) \
{ \
Oid                     relid = PG_GETARG_OID(0); \
int64           result; \
PgStat_StatTabEntry *tabentry; \
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) \
        result = 0; \
else \
        result = (int64) (tabentry->stat_name); \
PG_RETURN_INT64(result); \
} \

PGSTAT_DEFINE_REL_FIELD_ACCESSOR(pg_stat_get, numscans);

PGSTAT_DEFINE_REL_FIELD_ACCESSOR(pg_stat_get, tuples_returned);
.
.
.
"

If that makes sense to you, I'll submit this preparatory patch.

Now merged.

Thanks!

Regards,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com


Reply via email to