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
This commit is contained in:
Michael Paquier 2022-11-08 10:50:09 +09:00
parent 1613de8bc3
commit d7744d50a5
3 changed files with 14 additions and 1 deletions

View File

@ -56,12 +56,18 @@ Datum
pg_stat_get_lastscan(PG_FUNCTION_ARGS) pg_stat_get_lastscan(PG_FUNCTION_ARGS)
{ {
Oid relid = PG_GETARG_OID(0); Oid relid = PG_GETARG_OID(0);
TimestampTz result;
PgStat_StatTabEntry *tabentry; PgStat_StatTabEntry *tabentry;
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
result = 0;
else
result = tabentry->lastscan;
if (result == 0)
PG_RETURN_NULL(); PG_RETURN_NULL();
else else
PG_RETURN_TIMESTAMPTZ(tabentry->lastscan); PG_RETURN_TIMESTAMPTZ(result);
} }

View File

@ -573,6 +573,12 @@ SELECT pg_stat_force_next_flush();
(1 row) (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; COMMIT;
SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass); SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass);
pg_stat_reset_single_table_counters pg_stat_reset_single_table_counters

View File

@ -303,6 +303,7 @@ BEGIN;
CREATE TEMPORARY TABLE test_last_scan(idx_col int primary key, noidx_col int); 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); INSERT INTO test_last_scan(idx_col, noidx_col) VALUES(1, 1);
SELECT pg_stat_force_next_flush(); 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; COMMIT;
SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass); SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass);