From 723619eaa3a85f32ce8c2d32c063da26f89ca8d2 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Fri, 13 Mar 2026 22:17:14 +0900 Subject: [PATCH] Add stats_reset column to pg_stat_database_conflicts. This commit adds a stats_reset column to pg_stat_database_conflicts, allowing users to see when the statistics in this view were last reset. This makes the view consistent with pg_stat_database and other statistics views. Catalog version bumped. Author: Shihao Zhong Reviewed-by: Sami Imseih Reviewed-by: Kirill Reshke Reviewed-by: Chao Li Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/CAGRkXqS98OebEWjax99_LVAECsxCB8i=BfsdAL34i-5QHfwyOQ@mail.gmail.com --- doc/src/sgml/monitoring.sgml | 9 +++++++++ src/backend/catalog/system_views.sql | 3 ++- src/include/catalog/catversion.h | 2 +- src/test/regress/expected/rules.out | 3 ++- src/test/regress/expected/stats.out | 19 +++++++++++++++++-- src/test/regress/sql/stats.sql | 9 +++++++-- 6 files changed, 38 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 3bf6d6d54df..9c5c6dc490f 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -4036,6 +4036,15 @@ description | Waiting for a newly initialized WAL file to reach durable storage on the primary + + + + stats_reset timestamp with time zone + + + Time at which these statistics were last reset + + diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 339c016e510..90d48bc9c80 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1163,7 +1163,8 @@ CREATE VIEW pg_stat_database_conflicts AS pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot, pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock, - pg_stat_get_db_conflict_logicalslot(D.oid) AS confl_active_logicalslot + pg_stat_get_db_conflict_logicalslot(D.oid) AS confl_active_logicalslot, + pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset FROM pg_database D; CREATE VIEW pg_stat_user_functions AS diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 90f46b03502..3da6a75ff87 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -57,6 +57,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202603101 +#define CATALOG_VERSION_NO 202603131 #endif diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index f373ad704b6..71d7262049e 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1921,7 +1921,8 @@ pg_stat_database_conflicts| SELECT oid AS datid, pg_stat_get_db_conflict_snapshot(oid) AS confl_snapshot, pg_stat_get_db_conflict_bufferpin(oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(oid) AS confl_deadlock, - pg_stat_get_db_conflict_logicalslot(oid) AS confl_active_logicalslot + pg_stat_get_db_conflict_logicalslot(oid) AS confl_active_logicalslot, + pg_stat_get_db_stat_reset_time(oid) AS stats_reset FROM pg_database d; pg_stat_gssapi| SELECT pid, gss_auth AS gss_authenticated, diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index cd00f35bf7a..981d7c90822 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -1131,8 +1131,10 @@ SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal; SELECT pg_stat_reset_shared('unknown'); ERROR: unrecognized reset target: "unknown" HINT: Target must be "archiver", "bgwriter", "checkpointer", "io", "recovery_prefetch", "slru", or "wal". --- Test that reset works for pg_stat_database --- Since pg_stat_database stats_reset starts out as NULL, reset it once first so we have something to compare it to +-- Test that reset works for pg_stat_database and pg_stat_database_conflicts +-- Since pg_stat_database stats_reset starts out as NULL, reset it once first so that we +-- have a baseline for comparison. The same for pg_stat_database_conflicts as it shares +-- the same stats_reset as pg_stat_database. SELECT pg_stat_reset(); pg_stat_reset --------------- @@ -1140,6 +1142,13 @@ SELECT pg_stat_reset(); (1 row) SELECT stats_reset AS db_reset_ts FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset +SELECT stats_reset AS dbc_reset_ts FROM pg_stat_database_conflicts WHERE datname = (SELECT current_database()) \gset +SELECT :'db_reset_ts'::timestamptz = :'dbc_reset_ts'::timestamptz; + ?column? +---------- + t +(1 row) + SELECT pg_stat_reset(); pg_stat_reset --------------- @@ -1152,6 +1161,12 @@ SELECT stats_reset > :'db_reset_ts'::timestamptz FROM pg_stat_database WHERE dat t (1 row) +SELECT stats_reset > :'dbc_reset_ts'::timestamptz FROM pg_stat_database_conflicts WHERE datname = (SELECT current_database()); + ?column? +---------- + t +(1 row) + ---- -- pg_stat_get_snapshot_timestamp behavior ---- diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 8768e0f27fd..70af96f739f 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -523,13 +523,18 @@ SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal; -- Test error case for reset_shared with unknown stats type SELECT pg_stat_reset_shared('unknown'); --- Test that reset works for pg_stat_database +-- Test that reset works for pg_stat_database and pg_stat_database_conflicts --- Since pg_stat_database stats_reset starts out as NULL, reset it once first so we have something to compare it to +-- Since pg_stat_database stats_reset starts out as NULL, reset it once first so that we +-- have a baseline for comparison. The same for pg_stat_database_conflicts as it shares +-- the same stats_reset as pg_stat_database. SELECT pg_stat_reset(); SELECT stats_reset AS db_reset_ts FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset +SELECT stats_reset AS dbc_reset_ts FROM pg_stat_database_conflicts WHERE datname = (SELECT current_database()) \gset +SELECT :'db_reset_ts'::timestamptz = :'dbc_reset_ts'::timestamptz; SELECT pg_stat_reset(); SELECT stats_reset > :'db_reset_ts'::timestamptz FROM pg_stat_database WHERE datname = (SELECT current_database()); +SELECT stats_reset > :'dbc_reset_ts'::timestamptz FROM pg_stat_database_conflicts WHERE datname = (SELECT current_database()); ----