From f11083f2f6e714f87dfb5adb0621394cb4891c9d Mon Sep 17 00:00:00 2001
From: Shinya Kato <shinya11.kato@gmail.com>
Date: Fri, 2 May 2025 16:57:23 +0900
Subject: [PATCH v1 6/9] Make pg_stat_reset_slru() return the reset time

---
 doc/src/sgml/monitoring.sgml             |  4 ++--
 src/backend/catalog/system_functions.sql |  2 +-
 src/backend/utils/activity/pgstat_slru.c |  4 +++-
 src/backend/utils/adt/pgstatfuncs.c      |  7 ++++---
 src/include/catalog/pg_proc.dat          |  2 +-
 src/include/pgstat.h                     |  2 +-
 src/test/regress/expected/stats.out      | 16 ++++++++--------
 src/test/regress/sql/stats.sql           |  4 ++--
 8 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 2aeb835a7ab..df90f4668c4 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -5151,11 +5151,11 @@ description | Waiting for a newly initialized WAL file to reach durable storage
          <primary>pg_stat_reset_slru</primary>
         </indexterm>
         <function>pg_stat_reset_slru</function> ( [ <parameter>target</parameter> <type>text</type> <literal>DEFAULT</literal> <literal>NULL</literal> ] )
-        <returnvalue>void</returnvalue>
+        <returnvalue>timestamp with time zone</returnvalue>
        </para>
        <para>
         Resets statistics to zero for a single SLRU cache, or for all SLRUs in
-        the cluster. If <parameter>target</parameter> is
+        the cluster, and returns the time of the reset. If <parameter>target</parameter> is
         <literal>NULL</literal> or is not specified, all the counters shown in
         the <structname>pg_stat_slru</structname> view for all SLRU caches are
         reset. The argument can be one of
diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql
index 0f19c2c478b..4aa93250d06 100644
--- a/src/backend/catalog/system_functions.sql
+++ b/src/backend/catalog/system_functions.sql
@@ -645,7 +645,7 @@ AS 'pg_stat_reset_shared';
 
 CREATE OR REPLACE FUNCTION
   pg_stat_reset_slru(target text DEFAULT NULL)
-RETURNS void
+RETURNS timestamp with time zone
 LANGUAGE INTERNAL
 CALLED ON NULL INPUT VOLATILE PARALLEL SAFE
 AS 'pg_stat_reset_slru';
diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c
index 7bd8744accb..b37a0e7391d 100644
--- a/src/backend/utils/activity/pgstat_slru.c
+++ b/src/backend/utils/activity/pgstat_slru.c
@@ -41,7 +41,7 @@ static bool have_slrustats = false;
  * Permission checking for this function is managed through the normal
  * GRANT system.
  */
-void
+TimestampTz
 pgstat_reset_slru(const char *name)
 {
 	TimestampTz ts = GetCurrentTimestamp();
@@ -49,6 +49,8 @@ pgstat_reset_slru(const char *name)
 	Assert(name != NULL);
 
 	pgstat_reset_slru_counter_internal(pgstat_get_slru_index(name), ts);
+
+	return ts;
 }
 
 /*
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index f987d91d040..b28ceab91d9 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -1981,16 +1981,17 @@ Datum
 pg_stat_reset_slru(PG_FUNCTION_ARGS)
 {
 	char	   *target = NULL;
+	TimestampTz ts;
 
 	if (PG_ARGISNULL(0))
-		pgstat_reset_of_kind(PGSTAT_KIND_SLRU);
+		ts = pgstat_reset_of_kind(PGSTAT_KIND_SLRU);
 	else
 	{
 		target = text_to_cstring(PG_GETARG_TEXT_PP(0));
-		pgstat_reset_slru(target);
+		ts = pgstat_reset_slru(target);
 	}
 
-	PG_RETURN_VOID();
+	PG_RETURN_TIMESTAMPTZ(ts);
 }
 
 /* Reset replication slots stats (a specific one or all of them). */
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 0a2079fd842..6edc8ae67e4 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -6163,7 +6163,7 @@
 { oid => '2307',
   descr => 'statistics: reset collected statistics for a single SLRU',
   proname => 'pg_stat_reset_slru', proisstrict => 'f', provolatile => 'v',
-  prorettype => 'void', proargtypes => 'text', proargnames => '{target}',
+  prorettype => 'timestamptz', proargtypes => 'text', proargnames => '{target}',
   prosrc => 'pg_stat_reset_slru' },
 { oid => '6170',
   descr => 'statistics: reset collected statistics for a single replication slot',
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index ead16d7dad2..809c00dec6f 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -746,7 +746,7 @@ extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname);
  * Functions in pgstat_slru.c
  */
 
-extern void pgstat_reset_slru(const char *);
+extern TimestampTz pgstat_reset_slru(const char *);
 extern void pgstat_count_slru_page_zeroed(int slru_idx);
 extern void pgstat_count_slru_page_hit(int slru_idx);
 extern void pgstat_count_slru_page_read(int slru_idx);
diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out
index 91b3be1a8af..4c5612ab1ba 100644
--- a/src/test/regress/expected/stats.out
+++ b/src/test/regress/expected/stats.out
@@ -980,10 +980,10 @@ WHERE pg_stat_get_backend_pid(beid) = pg_backend_pid();
 -- Test that reset_slru with a specified SLRU works.
 SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset
 SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'notify' \gset
-SELECT pg_stat_reset_slru('commit_timestamp');
- pg_stat_reset_slru 
---------------------
- 
+SELECT pg_stat_reset_slru('commit_timestamp') IS NOT NULL AS t;
+ t 
+---
+ t
 (1 row)
 
 SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp';
@@ -994,10 +994,10 @@ SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru W
 
 SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset
 -- Test that multiple SLRUs are reset when no specific SLRU provided to reset function
-SELECT pg_stat_reset_slru();
- pg_stat_reset_slru 
---------------------
- 
+SELECT pg_stat_reset_slru() IS NOT NULL AS t;
+ t 
+---
+ t
 (1 row)
 
 SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp';
diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql
index 77d3e1a845d..62a8424d4c0 100644
--- a/src/test/regress/sql/stats.sql
+++ b/src/test/regress/sql/stats.sql
@@ -467,12 +467,12 @@ WHERE pg_stat_get_backend_pid(beid) = pg_backend_pid();
 -- Test that reset_slru with a specified SLRU works.
 SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset
 SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'notify' \gset
-SELECT pg_stat_reset_slru('commit_timestamp');
+SELECT pg_stat_reset_slru('commit_timestamp') IS NOT NULL AS t;
 SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp';
 SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset
 
 -- Test that multiple SLRUs are reset when no specific SLRU provided to reset function
-SELECT pg_stat_reset_slru();
+SELECT pg_stat_reset_slru() IS NOT NULL AS t;
 SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp';
 SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'notify';
 
-- 
2.47.1

