v2-0001-Fix-pgstat_database.c-to-honor-passed-database-OI.patch
application/octet-stream
Filename: v2-0001-Fix-pgstat_database.c-to-honor-passed-database-OI.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v2-0001
Subject: Fix pgstat_database.c to honor passed database OIDs
| File | + | − |
|---|---|---|
| src/backend/utils/activity/pgstat_database.c | 3 | 3 |
| src/test/regress/expected/stats.out | 18 | 0 |
| src/test/regress/sql/stats.sql | 8 | 0 |
From 39e558a01d6cea521fb76172fbda7fefb3bd5f09 Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <lic@highgo.com>
Date: Fri, 10 Apr 2026 11:21:20 +0800
Subject: [PATCH v2] Fix pgstat_database.c to honor passed database OIDs
Several functions in pgstat_database.c take a database OID argument
but then ignore it and use MyDatabaseId instead. That is confusing,
and in pgstat_reset_database_timestamp() it is plainly wrong, because
the function's contract is to reset the timestamp for the specified
database.
Use the passed dboid in pgstat_report_connect(),
pgstat_report_disconnect(), and pgstat_reset_database_timestamp().
Author: Chao Li <lic@highgo.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/ABBD5026-506F-4006-A569-28F72C188693@gmail.com
---
src/backend/utils/activity/pgstat_database.c | 6 +++---
src/test/regress/expected/stats.out | 18 ++++++++++++++++++
src/test/regress/sql/stats.sql | 8 ++++++++
3 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c
index f1846d3236c..7f3bc016593 100644
--- a/src/backend/utils/activity/pgstat_database.c
+++ b/src/backend/utils/activity/pgstat_database.c
@@ -243,7 +243,7 @@ pgstat_report_connect(Oid dboid)
pgLastSessionReportTime = MyStartTimestamp;
- dbentry = pgstat_prep_database_pending(MyDatabaseId);
+ dbentry = pgstat_prep_database_pending(dboid);
dbentry->sessions++;
}
@@ -258,7 +258,7 @@ pgstat_report_disconnect(Oid dboid)
if (!pgstat_should_report_connstat())
return;
- dbentry = pgstat_prep_database_pending(MyDatabaseId);
+ dbentry = pgstat_prep_database_pending(dboid);
switch (pgStatSessionEndCause)
{
@@ -419,7 +419,7 @@ pgstat_reset_database_timestamp(Oid dboid, TimestampTz ts)
PgStat_EntryRef *dbref;
PgStatShared_Database *dbentry;
- dbref = pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, MyDatabaseId, InvalidOid,
+ dbref = pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, dboid, InvalidOid,
false);
dbentry = (PgStatShared_Database *) dbref->shared_stats;
diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out
index 55009cfcc7d..be2ee02bfa0 100644
--- a/src/test/regress/expected/stats.out
+++ b/src/test/regress/expected/stats.out
@@ -924,6 +924,10 @@ SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables
t
(1 row)
+SELECT coalesce(stats_reset::text, 'NULL') AS shared_db_reset_before
+ FROM pg_stat_database WHERE datid = 0 \gset
+SELECT coalesce(stats_reset::text, 'NULL') AS current_db_reset_before
+ FROM pg_stat_database WHERE datname = current_database() \gset
SELECT pg_stat_reset_single_table_counters('pg_shdescription'::regclass);
pg_stat_reset_single_table_counters
-------------------------------------
@@ -937,6 +941,20 @@ SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables
f
(1 row)
+SELECT coalesce(stats_reset::text, 'NULL') <> :'shared_db_reset_before' AS shared_db_reset_changed
+ FROM pg_stat_database WHERE datid = 0;
+ shared_db_reset_changed
+-------------------------
+ t
+(1 row)
+
+SELECT coalesce(stats_reset::text, 'NULL') = :'current_db_reset_before' AS current_db_reset_not_changed
+ FROM pg_stat_database WHERE datname = current_database();
+ current_db_reset_not_changed
+------------------------------
+ t
+(1 row)
+
-- set back comment
\if :{?description_before}
COMMENT ON DATABASE :"datname" IS :'description_before';
diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql
index 158f3ca6ebe..d4d371f6efa 100644
--- a/src/test/regress/sql/stats.sql
+++ b/src/test/regress/sql/stats.sql
@@ -416,9 +416,17 @@ COMMIT;
-- check that the stats are reset.
SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables
WHERE relid = 'pg_shdescription'::regclass;
+SELECT coalesce(stats_reset::text, 'NULL') AS shared_db_reset_before
+ FROM pg_stat_database WHERE datid = 0 \gset
+SELECT coalesce(stats_reset::text, 'NULL') AS current_db_reset_before
+ FROM pg_stat_database WHERE datname = current_database() \gset
SELECT pg_stat_reset_single_table_counters('pg_shdescription'::regclass);
SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables
WHERE relid = 'pg_shdescription'::regclass;
+SELECT coalesce(stats_reset::text, 'NULL') <> :'shared_db_reset_before' AS shared_db_reset_changed
+ FROM pg_stat_database WHERE datid = 0;
+SELECT coalesce(stats_reset::text, 'NULL') = :'current_db_reset_before' AS current_db_reset_not_changed
+ FROM pg_stat_database WHERE datname = current_database();
-- set back comment
\if :{?description_before}
--
2.50.1 (Apple Git-155)