​Actually, I just did one more code review of myself, and somehow missed
that I submitted the version with the wrong oid.  The oid used in the first
version is wrong (10000) and was from before I read the docs on properly
picking one.

Attached is the fixed version. (hopefully with the right mime-type and
wrong extension.  Alas, gmail doesn't let you set mime-types; time to find
a new email client...)

- Matt K.
*** a/doc/src/sgml/monitoring.sgml
--- b/doc/src/sgml/monitoring.sgml
***************
*** 1710,1715 **** postgres   27093  0.0  0.0  30096  2752 ?        Ss   11:34  
 0:00 postgres: ser
--- 1710,1723 ----
       </row>
  
       <row>
+       
<entry><literal><function>pg_stat_snapshot_timestamp()</function></literal><indexterm><primary>pg_stat_snapshot_timestamp</primary></indexterm></entry>
+       <entry><type>timestamp with time zone</type></entry>
+       <entry>
+        Returns the timestamp of the current statistics snapshot
+       </entry>
+      </row>
+ 
+      <row>
        
<entry><literal><function>pg_stat_clear_snapshot()</function></literal><indexterm><primary>pg_stat_clear_snapshot</primary></indexterm></entry>
        <entry><type>void</type></entry>
        <entry>
*** a/src/backend/utils/adt/pgstatfuncs.c
--- b/src/backend/utils/adt/pgstatfuncs.c
***************
*** 115,120 **** extern Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS);
--- 115,122 ----
  extern Datum pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS);
  extern Datum pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS);
  
+ extern Datum pg_stat_snapshot_timestamp(PG_FUNCTION_ARGS);
+ 
  extern Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS);
  extern Datum pg_stat_reset(PG_FUNCTION_ARGS);
  extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS);
***************
*** 1681,1686 **** pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS)
--- 1683,1694 ----
        
PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_self_time));
  }
  
+ /* Get the timestamp of the current statistics snapshot */
+ Datum
+ pg_stat_snapshot_timestamp(PG_FUNCTION_ARGS)
+ {
+       PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stats_timestamp);
+ }
  
  /* Discard the active statistics snapshot */
  Datum
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
***************
*** 2852,2857 **** DESCR("statistics: total execution time of function in 
current transaction, in m
--- 2852,2860 ----
  DATA(insert OID = 3048 (  pg_stat_get_xact_function_self_time PGNSP PGUID 12 
1 0 0 0 f f f f t f v 1 0 701 "26" _null_ _null_ _null_ _null_ 
pg_stat_get_xact_function_self_time _null_ _null_ _null_ ));
  DESCR("statistics: self execution time of function in current transaction, in 
msec");
  
+ DATA(insert OID = 3788 (  pg_stat_snapshot_timestamp  PGNSP PGUID 12 1 0 0 0 
f f f f t f v 0 0 1184 "" _null_ _null_ _null_ _null_    
pg_stat_snapshot_timestamp _null_ _null_ _null_ ));
+ DESCR("statistics: timestamp of the current statistics snapshot");
+ 
  DATA(insert OID = 2230 (  pg_stat_clear_snapshot              PGNSP PGUID 12 
1 0 0 0 f f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_    
pg_stat_clear_snapshot _null_ _null_ _null_ ));
  DESCR("statistics: discard current transaction's statistics snapshot");
  DATA(insert OID = 2274 (  pg_stat_reset                                       
PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_    
pg_stat_reset _null_ _null_ _null_ ));
*** a/src/test/regress/expected/stats.out
--- b/src/test/regress/expected/stats.out
***************
*** 28,34 **** SELECT pg_sleep_for('2 seconds');
  CREATE TEMP TABLE prevstats AS
  SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
         (b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
!        (b.idx_blks_read + b.idx_blks_hit) AS idx_blks
    FROM pg_catalog.pg_stat_user_tables AS t,
         pg_catalog.pg_statio_user_tables AS b
   WHERE t.relname='tenk2' AND b.relname='tenk2';
--- 28,35 ----
  CREATE TEMP TABLE prevstats AS
  SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
         (b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
!        (b.idx_blks_read + b.idx_blks_hit) AS idx_blks,
!        pg_stat_snapshot_timestamp() as snap_ts
    FROM pg_catalog.pg_stat_user_tables AS t,
         pg_catalog.pg_statio_user_tables AS b
   WHERE t.relname='tenk2' AND b.relname='tenk2';
***************
*** 111,114 **** SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + 
cl.relpages,
--- 112,122 ----
   t        | t
  (1 row)
  
+ SELECT pr.snap_ts < pg_stat_snapshot_timestamp() as snapshot_newer
+ FROM prevstats AS pr;
+  snapshot_newer 
+ ----------------
+  t
+ (1 row)
+ 
  -- End of Stats Test
*** a/src/test/regress/sql/stats.sql
--- b/src/test/regress/sql/stats.sql
***************
*** 22,28 **** SELECT pg_sleep_for('2 seconds');
  CREATE TEMP TABLE prevstats AS
  SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
         (b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
!        (b.idx_blks_read + b.idx_blks_hit) AS idx_blks
    FROM pg_catalog.pg_stat_user_tables AS t,
         pg_catalog.pg_statio_user_tables AS b
   WHERE t.relname='tenk2' AND b.relname='tenk2';
--- 22,29 ----
  CREATE TEMP TABLE prevstats AS
  SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
         (b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
!        (b.idx_blks_read + b.idx_blks_hit) AS idx_blks,
!        pg_stat_snapshot_timestamp() as snap_ts
    FROM pg_catalog.pg_stat_user_tables AS t,
         pg_catalog.pg_statio_user_tables AS b
   WHERE t.relname='tenk2' AND b.relname='tenk2';
***************
*** 81,84 **** SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + 
cl.relpages,
--- 82,88 ----
    FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
   WHERE st.relname='tenk2' AND cl.relname='tenk2';
  
+ SELECT pr.snap_ts < pg_stat_snapshot_timestamp() as snapshot_newer
+ FROM prevstats AS pr;
+ 
  -- End of Stats Test
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to