From d7744d50a5394db8d973d1cfa034ed6640aec13c Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 8 Nov 2022 10:50:09 +0900 Subject: Fix initialization of pg_stat_get_lastscan() A NULL result should be reported when a stats timestamp is set to 0, but c037471 missed that, leading to a confusing timestamp value after for example a DML on a freshly-created relation with no scans done on it yet. This impacted the following attributes for two system views: - pg_stat_all_tables.last_idx_scan - pg_stat_all_tables.last_seq_scan - pg_stat_all_indexes.last_idx_scan Reported-by: Robert Treat Analyzed-by: Peter Eisentraut Author: Dave Page Discussion: https://postgr.es/m/CABV9wwPzMfSaz3EfKXXDxKmMprbxwF5r6WPuxqA=5mzRUqfTGg@mail.gmail.com --- src/backend/utils/adt/pgstatfuncs.c | 8 +++++++- src/test/regress/expected/stats.out | 6 ++++++ src/test/regress/sql/stats.sql | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 96bffc0f2ac..ae3365d9171 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -56,12 +56,18 @@ Datum pg_stat_get_lastscan(PG_FUNCTION_ARGS) { Oid relid = PG_GETARG_OID(0); + TimestampTz result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) + result = 0; + else + result = tabentry->lastscan; + + if (result == 0) PG_RETURN_NULL(); else - PG_RETURN_TIMESTAMPTZ(tabentry->lastscan); + PG_RETURN_TIMESTAMPTZ(result); } diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 257a6a9da9a..1d84407a039 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -573,6 +573,12 @@ SELECT pg_stat_force_next_flush(); (1 row) +SELECT last_seq_scan, last_idx_scan FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; + last_seq_scan | last_idx_scan +---------------+--------------- + | +(1 row) + COMMIT; SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass); pg_stat_reset_single_table_counters diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index f6270f7badb..b4d6753c710 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -303,6 +303,7 @@ BEGIN; CREATE TEMPORARY TABLE test_last_scan(idx_col int primary key, noidx_col int); INSERT INTO test_last_scan(idx_col, noidx_col) VALUES(1, 1); SELECT pg_stat_force_next_flush(); +SELECT last_seq_scan, last_idx_scan FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; COMMIT; SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass); -- cgit v1.2.3