pg_stat_transaction-9.0beta.patch
application/octet-stream
Filename: pg_stat_transaction-9.0beta.patch
Type: application/octet-stream
Part: 0
Message:
Re: pg_stat_transaction patch
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: unified
| File | + | − |
|---|---|---|
| doc/src/sgml/monitoring.sgml | 0 | 0 |
| src/backend/catalog/system_views.sql | 0 | 0 |
| src/backend/postmaster/pgstat.c | 0 | 0 |
| src/backend/utils/adt/pgstatfuncs.c | 0 | 0 |
| src/include/catalog/pg_proc.h | 0 | 0 |
| src/include/pgstat.h | 0 | 0 |
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index d197731..d234080 100644
*** a/doc/src/sgml/monitoring.sgml
--- b/doc/src/sgml/monitoring.sgml
*************** postgres: <replaceable>user</> <replacea
*** 648,653 ****
--- 648,745 ----
</row>
<row>
+ <entry><literal><function>pg_stat_get_transaction_numscans</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of sequential scans done when argument is a table,
+ or number of index scans done when argument is an index, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_tuples_returned</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of rows read by sequential scans when argument is a table,
+ or number of index entries returned when argument is an index, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_tuples_fetched</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of table rows fetched by bitmap scans when argument is a table,
+ or table rows fetched by simple index scans using the index
+ when argument is an index, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_tuples_inserted</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of rows inserted into table, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_tuples_updated</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of rows updated in table (includes HOT updates), in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_tuples_deleted</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of rows deleted from table, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_tuples_hot_updated</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of rows HOT-updated in table, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_live_tuples</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of live rows in table, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_dead_tuples</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of dead rows in table, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_blocks_fetched</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of disk block fetch requests for table or index, in the current transaction
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_blocks_hit</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of disk block requests found in cache for table or index, in the current transaction
+ </entry>
+ </row>
+
+ <row>
<entry><literal><function>pg_stat_get_last_vacuum_time</function>(<type>oid</type>)</literal></entry>
<entry><type>timestamptz</type></entry>
<entry>
*************** postgres: <replaceable>user</> <replacea
*** 727,732 ****
--- 819,850 ----
</row>
<row>
+ <entry><literal><function>pg_stat_get_transaction_function_calls</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Number of times the function has been called, in the current transaction.
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_function_time</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Total wall clock time spent in the function, in microseconds. Includes
+ the time spent in functions called by this one, in the current transaction.
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal><function>pg_stat_get_transaction_function_self_time</function>(<type>oid</type>)</literal></entry>
+ <entry><type>bigint</type></entry>
+ <entry>
+ Time spent in only this function. Time spent in called functions
+ is excluded, in the current transaction.
+ </entry>
+ </row>
+
+ <row>
<entry><literal><function>pg_stat_get_backend_idset</function>()</literal></entry>
<entry><type>setof integer</type></entry>
<entry>
*************** postgres: <replaceable>user</> <replacea
*** 950,955 ****
--- 1068,1085 ----
</tgroup>
</table>
+ <row>
+ <entry><literal><function>pg_stat_report_stat</function>()</literal></entry>
+ <entry><type>void</type></entry>
+ <entry>
+ Report and reset so far collected statistics for the current transaction
+ (requires superuser privileges)
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
<note>
<para>
<function>pg_stat_get_blocks_fetched</function> minus
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 8852326..f5f5d42 100644
*** a/src/backend/catalog/system_views.sql
--- b/src/backend/catalog/system_views.sql
*************** CREATE VIEW pg_stat_all_tables AS
*** 208,213 ****
--- 208,236 ----
WHERE C.relkind IN ('r', 't')
GROUP BY C.oid, N.nspname, C.relname;
+ CREATE OR REPLACE VIEW pg_stat_transaction_tables AS
+ SELECT
+ C.oid AS relid,
+ N.nspname AS schemaname,
+ C.relname AS relname,
+ pg_stat_get_transaction_numscans(C.oid) AS seq_scan,
+ pg_stat_get_transaction_tuples_returned(C.oid) AS seq_tup_read,
+ sum(pg_stat_get_transaction_numscans(I.indexrelid))::bigint AS idx_scan,
+ sum(pg_stat_get_transaction_tuples_fetched(I.indexrelid))::bigint +
+ pg_stat_get_transaction_tuples_fetched(C.oid) AS idx_tup_fetch,
+ pg_stat_get_transaction_tuples_inserted(C.oid) AS n_tup_ins,
+ pg_stat_get_transaction_tuples_updated(C.oid) AS n_tup_upd,
+ pg_stat_get_transaction_tuples_deleted(C.oid) AS n_tup_del,
+ pg_stat_get_transaction_tuples_hot_updated(C.oid) AS n_tup_hot_upd,
+ pg_stat_get_transaction_live_tuples(C.oid) AS n_live_tup,
+ pg_stat_get_transaction_dead_tuples(C.oid) AS n_dead_tup
+ FROM pg_class C LEFT JOIN
+ pg_index I ON C.oid = I.indrelid
+ LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
+ WHERE C.relkind IN ('r', 't') AND N.nspname NOT IN ('pg_catalog', 'information_schema') AND
+ N.nspname !~ '^pg_toast'
+ GROUP BY C.oid, N.nspname, C.relname;
+
CREATE VIEW pg_stat_sys_tables AS
SELECT * FROM pg_stat_all_tables
WHERE schemaname IN ('pg_catalog', 'information_schema') OR
*************** CREATE VIEW pg_stat_user_functions AS
*** 375,380 ****
--- 398,415 ----
WHERE P.prolang != 12 -- fast check to eliminate built-in functions
AND pg_stat_get_function_calls(P.oid) IS NOT NULL;
+ CREATE VIEW pg_stat_transaction_functions AS
+ SELECT
+ P.oid AS funcid,
+ N.nspname AS schemaname,
+ P.proname AS funcname,
+ pg_stat_get_transaction_function_calls(P.oid) AS calls,
+ pg_stat_get_transaction_function_time(P.oid) / 1000 AS total_time,
+ pg_stat_get_transaction_function_self_time(P.oid) / 1000 AS self_time
+ FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace)
+ WHERE P.prolang != 12 -- fast check to eliminate built-in functions
+ AND pg_stat_get_transaction_function_calls(P.oid) IS NOT NULL;
+
CREATE VIEW pg_stat_bgwriter AS
SELECT
pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed,
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index edb5c80..daa4fbd 100644
*** a/src/backend/postmaster/pgstat.c
--- b/src/backend/postmaster/pgstat.c
*************** static void pgstat_send_tabstat(PgStat_M
*** 258,265 ****
static void pgstat_send_funcstats(void);
static HTAB *pgstat_collect_oids(Oid catalogid);
- static PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared);
-
static void pgstat_setup_memcxt(void);
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype);
--- 258,263 ----
*************** pgstat_initstats(Relation rel)
*** 1506,1512 ****
/*
* get_tabstat_entry - find or create a PgStat_TableStatus entry for rel
*/
! static PgStat_TableStatus *
get_tabstat_entry(Oid rel_id, bool isshared)
{
PgStat_TableStatus *entry;
--- 1504,1510 ----
/*
* get_tabstat_entry - find or create a PgStat_TableStatus entry for rel
*/
! PgStat_TableStatus *
get_tabstat_entry(Oid rel_id, bool isshared)
{
PgStat_TableStatus *entry;
*************** get_tabstat_entry(Oid rel_id, bool issha
*** 1561,1566 ****
--- 1559,1586 ----
}
/*
+ * get_funcstat_entry - find or create a PgStat_BackendFunctionEntry entry for rel
+ */
+ PgStat_BackendFunctionEntry *
+ get_funcstat_entry(Oid func_id)
+ {
+ PgStat_BackendFunctionEntry *entry;
+ bool found;
+
+ if (pgStatFunctions == NULL)
+ return NULL;
+
+ entry = (PgStat_BackendFunctionEntry *) hash_search(pgStatFunctions,
+ (void *) &func_id,
+ HASH_FIND, &found);
+ if (!found)
+ return NULL;
+
+ return entry;
+ }
+
+
+ /*
* get_tabstat_stack_level - add a new (sub)transaction stack entry if needed
*/
static PgStat_SubXactStatus *
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 8379407..010773d 100644
*** a/src/backend/utils/adt/pgstatfuncs.c
--- b/src/backend/utils/adt/pgstatfuncs.c
*************** extern Datum pg_stat_reset(PG_FUNCTION_A
*** 81,86 ****
--- 81,103 ----
extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS);
extern Datum pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS);
extern Datum pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_report_stat(PG_FUNCTION_ARGS);
+
+ extern Datum pg_stat_get_transaction_numscans(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_tuples_returned(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_tuples_fetched(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_tuples_inserted(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_tuples_updated(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_tuples_deleted(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_tuples_hot_updated(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_live_tuples(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_dead_tuples(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_blocks_fetched(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_blocks_hit(PG_FUNCTION_ARGS);
+
+ extern Datum pg_stat_get_transaction_function_calls(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_function_time(PG_FUNCTION_ARGS);
+ extern Datum pg_stat_get_transaction_function_self_time(PG_FUNCTION_ARGS);
/* Global bgwriter statistics, from bgwriter.c */
extern PgStat_MsgBgWriter bgwriterStats;
*************** pg_stat_reset_single_function_counters(P
*** 1143,1145 ****
--- 1160,1380 ----
PG_RETURN_VOID();
}
+
+
+ /* Report so far collected per-table and function usage statistics to the collector */
+ Datum
+ pg_stat_report_stat(PG_FUNCTION_ARGS)
+ {
+ pgstat_report_stat(true);
+
+ PG_RETURN_VOID();
+ }
+
+
+ Datum
+ pg_stat_get_transaction_numscans(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_numscans);
+
+ PG_RETURN_INT64(result);
+ }
+
+ Datum
+ pg_stat_get_transaction_tuples_returned(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_returned);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_tuples_fetched(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_fetched);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_tuples_inserted(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_inserted);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_tuples_updated(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_updated);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_tuples_deleted(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_deleted);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_tuples_hot_updated(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_hot_updated);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_live_tuples(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_delta_live_tuples);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_dead_tuples(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_delta_dead_tuples);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_blocks_fetched(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_blocks_fetched);
+
+ PG_RETURN_INT64(result);
+ }
+
+
+ Datum
+ pg_stat_get_transaction_blocks_hit(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = get_tabstat_entry(relid,false)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_blocks_hit);
+
+ PG_RETURN_INT64(result);
+ }
+
+ Datum
+ pg_stat_get_transaction_function_calls(PG_FUNCTION_ARGS)
+ {
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_BackendFunctionEntry *funcentry;
+
+ if ((funcentry = get_funcstat_entry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_INT64(funcentry->f_counts.f_numcalls);
+ }
+
+ Datum
+ pg_stat_get_transaction_function_time(PG_FUNCTION_ARGS)
+ {
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_BackendFunctionEntry *funcentry;
+
+ if ((funcentry = get_funcstat_entry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_INT64(INSTR_TIME_GET_MICROSEC(funcentry->f_counts.f_time));
+ }
+
+ Datum
+ pg_stat_get_transaction_function_self_time(PG_FUNCTION_ARGS)
+ {
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_BackendFunctionEntry *funcentry;
+
+ if ((funcentry = get_funcstat_entry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_INT64(INSTR_TIME_GET_MICROSEC(funcentry->f_counts.f_time_self));
+ }
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index f2751a4..5ed8470 100644
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
*************** DESCR("statistics: execution time of fun
*** 3091,3096 ****
--- 3091,3125 ----
DATA(insert OID = 2980 ( pg_stat_get_function_self_time PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_function_self_time _null_ _null_ _null_ ));
DESCR("statistics: self execution time of function");
+ DATA(insert OID = 3045 ( pg_stat_get_transaction_numscans PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_numscans _null_ _null_ _null_ ));
+ DESCR("statistics: number of scans done for table/index in current transaction");
+ DATA(insert OID = 3046 ( pg_stat_get_transaction_tuples_returned PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_tuples_returned _null_ _null_ _null_ ));
+ DESCR("statistics: number of tuples read by seqscan in current transaction");
+ DATA(insert OID = 3047 ( pg_stat_get_transaction_tuples_fetched PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_tuples_fetched _null_ _null_ _null_ ));
+ DESCR("statistics: number of tuples fetched by idxscan in current transaction");
+ DATA(insert OID = 3048 ( pg_stat_get_transaction_tuples_inserted PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_tuples_inserted _null_ _null_ _null_ ));
+ DESCR("statistics: number of tuples inserted in current transaction");
+ DATA(insert OID = 3049 ( pg_stat_get_transaction_tuples_updated PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_tuples_updated _null_ _null_ _null_ ));
+ DESCR("statistics: number of tuples updated in current transaction");
+ DATA(insert OID = 3050 ( pg_stat_get_transaction_tuples_deleted PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_tuples_deleted _null_ _null_ _null_ ));
+ DESCR("statistics: number of tuples deleted in current transaction");
+ DATA(insert OID = 3051 ( pg_stat_get_transaction_tuples_hot_updated PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_tuples_hot_updated _null_ _null_ _null_ ));
+ DESCR("statistics: number of tuples hot updated in current transaction");
+ DATA(insert OID = 3052 ( pg_stat_get_transaction_live_tuples PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_live_tuples _null_ _null_ _null_ ));
+ DESCR("statistics: number of live tuples in current transaction");
+ DATA(insert OID = 3053 ( pg_stat_get_transaction_dead_tuples PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_dead_tuples _null_ _null_ _null_ ));
+ DESCR("statistics: number of dead tuples in current transaction");
+ DATA(insert OID = 3054 ( pg_stat_get_transaction_blocks_fetched PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_blocks_fetched _null_ _null_ _null_ ));
+ DESCR("statistics: number of blocks fetched in current transaction");
+ DATA(insert OID = 3055 ( pg_stat_get_transaction_blocks_hit PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_blocks_hit _null_ _null_ _null_ ));
+ DESCR("statistics: number of blocks found in cache in current transaction");
+ DATA(insert OID = 3056 ( pg_stat_get_transaction_function_calls PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_function_calls _null_ _null_ _null_ ));
+ DESCR("statistics: number of function calls in current transaction");
+ DATA(insert OID = 3057 ( pg_stat_get_transaction_function_time PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_function_time _null_ _null_ _null_ ));
+ DESCR("statistics: execution time of function in current transaction");
+ DATA(insert OID = 3058 ( pg_stat_get_transaction_function_self_time PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_transaction_function_self_time _null_ _null_ _null_ ));
+ DESCR("statistics: self execution time of function in current transaction");
+
DATA(insert OID = 2230 ( pg_stat_clear_snapshot PGNSP PGUID 12 1 0 0 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 f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_ pg_stat_reset _null_ _null_ _null_ ));
*************** DATA(insert OID = 3776 ( pg_stat_reset_
*** 3101,3106 ****
--- 3130,3137 ----
DESCR("statistics: reset collected statistics for a single table or index in the current database");
DATA(insert OID = 3777 ( pg_stat_reset_single_function_counters PGNSP PGUID 12 1 0 0 f f f f f v 1 0 2278 "26" _null_ _null_ _null_ _null_ pg_stat_reset_single_function_counters _null_ _null_ _null_ ));
DESCR("statistics: reset collected statistics for a single function in the current database");
+ DATA(insert OID = 3059 ( pg_stat_report_stat PGNSP PGUID 12 1 0 0 f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_ pg_stat_report_stat _null_ _null_ _null_ ));
+ DESCR("statistics: report and reset so far collected statistics for current transaction");
DATA(insert OID = 1946 ( encode PGNSP PGUID 12 1 0 0 f f f t f i 2 0 25 "17 25" _null_ _null_ _null_ _null_ binary_encode _null_ _null_ _null_ ));
DESCR("convert bytea value into some ascii-only text string");
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 3dd5f45..5b2f51e 100644
*** a/src/include/pgstat.h
--- b/src/include/pgstat.h
*************** extern const char *pgstat_get_backend_cu
*** 694,699 ****
--- 694,702 ----
extern void pgstat_initstats(Relation rel);
+ extern PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared);
+ extern PgStat_BackendFunctionEntry *get_funcstat_entry(Oid func_id);
+
/* nontransactional event counts are simple enough to inline */
#define pgstat_count_heap_scan(rel) \