wal_stats->stat_reset_timestamp));
}
-Datum
-pg_stat_get_lock(PG_FUNCTION_ARGS)
+/*
+ * pg_stat_lock_build_tuples
+ *
+ * Helper routine for pg_stat_get_lock(), filling a result tuplestore with one
+ * tuple for each lock type.
+ */
+static void
+pg_stat_lock_build_tuples(ReturnSetInfo *rsinfo,
+ PgStat_LockEntry *lock_stats,
+ TimestampTz stat_reset_timestamp)
{
#define PG_STAT_LOCK_COLS 5
- ReturnSetInfo *rsinfo;
- PgStat_Lock *lock_stats;
-
- InitMaterializedSRF(fcinfo, 0);
- rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
-
- lock_stats = pgstat_fetch_stat_lock();
-
for (int lcktype = 0; lcktype <= LOCKTAG_LAST_TYPE; lcktype++)
{
- const char *locktypename;
Datum values[PG_STAT_LOCK_COLS] = {0};
bool nulls[PG_STAT_LOCK_COLS] = {0};
- PgStat_LockEntry *lck_stats = &lock_stats->stats[lcktype];
+ PgStat_LockEntry *lck_stats = &lock_stats[lcktype];
int i = 0;
- locktypename = LockTagTypeNames[lcktype];
-
- values[i++] = CStringGetTextDatum(locktypename);
+ values[i++] = CStringGetTextDatum(LockTagTypeNames[lcktype]);
values[i++] = Int64GetDatum(lck_stats->waits);
values[i++] = Float8GetDatum(pg_stat_us_to_ms(lck_stats->wait_time));
values[i++] = Int64GetDatum(lck_stats->fastpath_exceeded);
- values[i] = TimestampTzGetDatum(lock_stats->stat_reset_timestamp);
+ if (stat_reset_timestamp != 0)
+ values[i] = TimestampTzGetDatum(stat_reset_timestamp);
+ else
+ nulls[i] = true;
Assert(i + 1 == PG_STAT_LOCK_COLS);
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
}
+}
+
+Datum
+pg_stat_get_lock(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsinfo;
+ PgStat_Lock *lock_stats;
+
+ InitMaterializedSRF(fcinfo, 0);
+ rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ lock_stats = pgstat_fetch_stat_lock();
+
+ pg_stat_lock_build_tuples(rsinfo, lock_stats->stats,
+ lock_stats->stat_reset_timestamp);
return (Datum) 0;
}