1 /*-------------------------------------------------------------------------
4 * Functions for accessing the statistics collector data
6 * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * src/backend/utils/adt/pgstatfuncs.c
13 *-------------------------------------------------------------------------
17 #include "access/htup_details.h"
18 #include "catalog/pg_type.h"
21 #include "miscadmin.h"
23 #include "utils/acl.h"
24 #include "utils/builtins.h"
25 #include "utils/inet.h"
26 #include "utils/timestamp.h"
28 /* bogus ... these externs should be in a header file */
29 extern Datum pg_stat_get_numscans(PG_FUNCTION_ARGS);
30 extern Datum pg_stat_get_tuples_returned(PG_FUNCTION_ARGS);
31 extern Datum pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS);
32 extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
33 extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
34 extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
35 extern Datum pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS);
36 extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
37 extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
38 extern Datum pg_stat_get_mod_since_analyze(PG_FUNCTION_ARGS);
39 extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
40 extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
41 extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
42 extern Datum pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS);
43 extern Datum pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS);
44 extern Datum pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS);
45 extern Datum pg_stat_get_vacuum_count(PG_FUNCTION_ARGS);
46 extern Datum pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS);
47 extern Datum pg_stat_get_analyze_count(PG_FUNCTION_ARGS);
48 extern Datum pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS);
50 extern Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS);
51 extern Datum pg_stat_get_function_total_time(PG_FUNCTION_ARGS);
52 extern Datum pg_stat_get_function_self_time(PG_FUNCTION_ARGS);
54 extern Datum pg_stat_get_backend_idset(PG_FUNCTION_ARGS);
55 extern Datum pg_stat_get_activity(PG_FUNCTION_ARGS);
56 extern Datum pg_backend_pid(PG_FUNCTION_ARGS);
57 extern Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS);
58 extern Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS);
59 extern Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS);
60 extern Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS);
61 extern Datum pg_stat_get_backend_waiting(PG_FUNCTION_ARGS);
62 extern Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS);
63 extern Datum pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS);
64 extern Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS);
65 extern Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS);
66 extern Datum pg_stat_get_backend_client_port(PG_FUNCTION_ARGS);
68 extern Datum pg_stat_get_db_numbackends(PG_FUNCTION_ARGS);
69 extern Datum pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS);
70 extern Datum pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS);
71 extern Datum pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS);
72 extern Datum pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS);
73 extern Datum pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS);
74 extern Datum pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS);
75 extern Datum pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS);
76 extern Datum pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS);
77 extern Datum pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS);
78 extern Datum pg_stat_get_db_conflict_tablespace(PG_FUNCTION_ARGS);
79 extern Datum pg_stat_get_db_conflict_lock(PG_FUNCTION_ARGS);
80 extern Datum pg_stat_get_db_conflict_snapshot(PG_FUNCTION_ARGS);
81 extern Datum pg_stat_get_db_conflict_bufferpin(PG_FUNCTION_ARGS);
82 extern Datum pg_stat_get_db_conflict_startup_deadlock(PG_FUNCTION_ARGS);
83 extern Datum pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS);
84 extern Datum pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS);
85 extern Datum pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS);
86 extern Datum pg_stat_get_db_temp_files(PG_FUNCTION_ARGS);
87 extern Datum pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS);
88 extern Datum pg_stat_get_db_blk_read_time(PG_FUNCTION_ARGS);
89 extern Datum pg_stat_get_db_blk_write_time(PG_FUNCTION_ARGS);
91 extern Datum pg_stat_get_archiver(PG_FUNCTION_ARGS);
93 extern Datum pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS);
94 extern Datum pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS);
95 extern Datum pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS);
96 extern Datum pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS);
97 extern Datum pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS);
98 extern Datum pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS);
99 extern Datum pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS);
100 extern Datum pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS);
101 extern Datum pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS);
102 extern Datum pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS);
103 extern Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS);
105 extern Datum pg_stat_get_xact_numscans(PG_FUNCTION_ARGS);
106 extern Datum pg_stat_get_xact_tuples_returned(PG_FUNCTION_ARGS);
107 extern Datum pg_stat_get_xact_tuples_fetched(PG_FUNCTION_ARGS);
108 extern Datum pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS);
109 extern Datum pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS);
110 extern Datum pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS);
111 extern Datum pg_stat_get_xact_tuples_hot_updated(PG_FUNCTION_ARGS);
112 extern Datum pg_stat_get_xact_blocks_fetched(PG_FUNCTION_ARGS);
113 extern Datum pg_stat_get_xact_blocks_hit(PG_FUNCTION_ARGS);
115 extern Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS);
116 extern Datum pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS);
117 extern Datum pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS);
119 extern Datum pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS);
120 extern Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS);
121 extern Datum pg_stat_reset(PG_FUNCTION_ARGS);
122 extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS);
123 extern Datum pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS);
124 extern Datum pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS);
126 /* Global bgwriter statistics, from bgwriter.c */
127 extern PgStat_MsgBgWriter bgwriterStats;
130 pg_stat_get_numscans(PG_FUNCTION_ARGS)
132 Oid relid = PG_GETARG_OID(0);
134 PgStat_StatTabEntry *tabentry;
136 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
139 result = (int64) (tabentry->numscans);
141 PG_RETURN_INT64(result);
146 pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
148 Oid relid = PG_GETARG_OID(0);
150 PgStat_StatTabEntry *tabentry;
152 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
155 result = (int64) (tabentry->tuples_returned);
157 PG_RETURN_INT64(result);
162 pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
164 Oid relid = PG_GETARG_OID(0);
166 PgStat_StatTabEntry *tabentry;
168 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
171 result = (int64) (tabentry->tuples_fetched);
173 PG_RETURN_INT64(result);
178 pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
180 Oid relid = PG_GETARG_OID(0);
182 PgStat_StatTabEntry *tabentry;
184 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
187 result = (int64) (tabentry->tuples_inserted);
189 PG_RETURN_INT64(result);
194 pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
196 Oid relid = PG_GETARG_OID(0);
198 PgStat_StatTabEntry *tabentry;
200 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
203 result = (int64) (tabentry->tuples_updated);
205 PG_RETURN_INT64(result);
210 pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
212 Oid relid = PG_GETARG_OID(0);
214 PgStat_StatTabEntry *tabentry;
216 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
219 result = (int64) (tabentry->tuples_deleted);
221 PG_RETURN_INT64(result);
226 pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS)
228 Oid relid = PG_GETARG_OID(0);
230 PgStat_StatTabEntry *tabentry;
232 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
235 result = (int64) (tabentry->tuples_hot_updated);
237 PG_RETURN_INT64(result);
242 pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
244 Oid relid = PG_GETARG_OID(0);
246 PgStat_StatTabEntry *tabentry;
248 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
251 result = (int64) (tabentry->n_live_tuples);
253 PG_RETURN_INT64(result);
258 pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
260 Oid relid = PG_GETARG_OID(0);
262 PgStat_StatTabEntry *tabentry;
264 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
267 result = (int64) (tabentry->n_dead_tuples);
269 PG_RETURN_INT64(result);
274 pg_stat_get_mod_since_analyze(PG_FUNCTION_ARGS)
276 Oid relid = PG_GETARG_OID(0);
278 PgStat_StatTabEntry *tabentry;
280 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
283 result = (int64) (tabentry->changes_since_analyze);
285 PG_RETURN_INT64(result);
290 pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
292 Oid relid = PG_GETARG_OID(0);
294 PgStat_StatTabEntry *tabentry;
296 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
299 result = (int64) (tabentry->blocks_fetched);
301 PG_RETURN_INT64(result);
306 pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
308 Oid relid = PG_GETARG_OID(0);
310 PgStat_StatTabEntry *tabentry;
312 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
315 result = (int64) (tabentry->blocks_hit);
317 PG_RETURN_INT64(result);
321 pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
323 Oid relid = PG_GETARG_OID(0);
325 PgStat_StatTabEntry *tabentry;
327 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
330 result = tabentry->vacuum_timestamp;
335 PG_RETURN_TIMESTAMPTZ(result);
339 pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
341 Oid relid = PG_GETARG_OID(0);
343 PgStat_StatTabEntry *tabentry;
345 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
348 result = tabentry->autovac_vacuum_timestamp;
353 PG_RETURN_TIMESTAMPTZ(result);
357 pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
359 Oid relid = PG_GETARG_OID(0);
361 PgStat_StatTabEntry *tabentry;
363 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
366 result = tabentry->analyze_timestamp;
371 PG_RETURN_TIMESTAMPTZ(result);
375 pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
377 Oid relid = PG_GETARG_OID(0);
379 PgStat_StatTabEntry *tabentry;
381 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
384 result = tabentry->autovac_analyze_timestamp;
389 PG_RETURN_TIMESTAMPTZ(result);
393 pg_stat_get_vacuum_count(PG_FUNCTION_ARGS)
395 Oid relid = PG_GETARG_OID(0);
397 PgStat_StatTabEntry *tabentry;
399 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
402 result = (int64) (tabentry->vacuum_count);
404 PG_RETURN_INT64(result);
408 pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS)
410 Oid relid = PG_GETARG_OID(0);
412 PgStat_StatTabEntry *tabentry;
414 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
417 result = (int64) (tabentry->autovac_vacuum_count);
419 PG_RETURN_INT64(result);
423 pg_stat_get_analyze_count(PG_FUNCTION_ARGS)
425 Oid relid = PG_GETARG_OID(0);
427 PgStat_StatTabEntry *tabentry;
429 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
432 result = (int64) (tabentry->analyze_count);
434 PG_RETURN_INT64(result);
438 pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS)
440 Oid relid = PG_GETARG_OID(0);
442 PgStat_StatTabEntry *tabentry;
444 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
447 result = (int64) (tabentry->autovac_analyze_count);
449 PG_RETURN_INT64(result);
453 pg_stat_get_function_calls(PG_FUNCTION_ARGS)
455 Oid funcid = PG_GETARG_OID(0);
456 PgStat_StatFuncEntry *funcentry;
458 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
460 PG_RETURN_INT64(funcentry->f_numcalls);
464 pg_stat_get_function_total_time(PG_FUNCTION_ARGS)
466 Oid funcid = PG_GETARG_OID(0);
467 PgStat_StatFuncEntry *funcentry;
469 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
471 /* convert counter from microsec to millisec for display */
472 PG_RETURN_FLOAT8(((double) funcentry->f_total_time) / 1000.0);
476 pg_stat_get_function_self_time(PG_FUNCTION_ARGS)
478 Oid funcid = PG_GETARG_OID(0);
479 PgStat_StatFuncEntry *funcentry;
481 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
483 /* convert counter from microsec to millisec for display */
484 PG_RETURN_FLOAT8(((double) funcentry->f_self_time) / 1000.0);
488 pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
490 FuncCallContext *funcctx;
494 /* stuff done only on the first call of the function */
495 if (SRF_IS_FIRSTCALL())
497 /* create a function context for cross-call persistence */
498 funcctx = SRF_FIRSTCALL_INIT();
500 fctx = MemoryContextAlloc(funcctx->multi_call_memory_ctx,
502 funcctx->user_fctx = fctx;
505 fctx[1] = pgstat_fetch_stat_numbackends();
508 /* stuff done on every call of the function */
509 funcctx = SRF_PERCALL_SETUP();
510 fctx = funcctx->user_fctx;
515 if (result <= fctx[1])
517 /* do when there is more left to send */
518 SRF_RETURN_NEXT(funcctx, Int32GetDatum(result));
522 /* do when there is no more left */
523 SRF_RETURN_DONE(funcctx);
528 pg_stat_get_activity(PG_FUNCTION_ARGS)
530 FuncCallContext *funcctx;
532 if (SRF_IS_FIRSTCALL())
534 MemoryContext oldcontext;
537 funcctx = SRF_FIRSTCALL_INIT();
539 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
541 tupdesc = CreateTemplateTupleDesc(16, false);
542 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "datid",
544 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "pid",
546 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "usesysid",
548 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "application_name",
550 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "state",
552 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "query",
554 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "waiting",
556 TupleDescInitEntry(tupdesc, (AttrNumber) 8, "act_start",
557 TIMESTAMPTZOID, -1, 0);
558 TupleDescInitEntry(tupdesc, (AttrNumber) 9, "query_start",
559 TIMESTAMPTZOID, -1, 0);
560 TupleDescInitEntry(tupdesc, (AttrNumber) 10, "backend_start",
561 TIMESTAMPTZOID, -1, 0);
562 TupleDescInitEntry(tupdesc, (AttrNumber) 11, "state_change",
563 TIMESTAMPTZOID, -1, 0);
564 TupleDescInitEntry(tupdesc, (AttrNumber) 12, "client_addr",
566 TupleDescInitEntry(tupdesc, (AttrNumber) 13, "client_hostname",
568 TupleDescInitEntry(tupdesc, (AttrNumber) 14, "client_port",
570 TupleDescInitEntry(tupdesc, (AttrNumber) 15, "backend_xid",
572 TupleDescInitEntry(tupdesc, (AttrNumber) 16, "backend_xmin",
575 funcctx->tuple_desc = BlessTupleDesc(tupdesc);
577 funcctx->user_fctx = palloc0(sizeof(int));
580 /* Get all backends */
581 funcctx->max_calls = pgstat_fetch_stat_numbackends();
586 * Get one backend - locate by pid.
588 * We lookup the backend early, so we can return zero rows if it
589 * doesn't exist, instead of returning a single row full of NULLs.
591 int pid = PG_GETARG_INT32(0);
593 int n = pgstat_fetch_stat_numbackends();
595 for (i = 1; i <= n; i++)
597 PgBackendStatus *be = pgstat_fetch_stat_beentry(i);
601 if (be->st_procpid == pid)
603 *(int *) (funcctx->user_fctx) = i;
609 if (*(int *) (funcctx->user_fctx) == 0)
610 /* Pid not found, return zero rows */
611 funcctx->max_calls = 0;
613 funcctx->max_calls = 1;
616 MemoryContextSwitchTo(oldcontext);
619 /* stuff done on every call of the function */
620 funcctx = SRF_PERCALL_SETUP();
622 if (funcctx->call_cntr < funcctx->max_calls)
628 LocalPgBackendStatus *local_beentry;
629 PgBackendStatus *beentry;
631 MemSet(values, 0, sizeof(values));
632 MemSet(nulls, 0, sizeof(nulls));
634 if (*(int *) (funcctx->user_fctx) > 0)
636 /* Get specific pid slot */
637 local_beentry = pgstat_fetch_stat_local_beentry(*(int *) (funcctx->user_fctx));
638 beentry = &local_beentry->backendStatus;
642 /* Get the next one in the list */
643 local_beentry = pgstat_fetch_stat_local_beentry(funcctx->call_cntr + 1); /* 1-based index */
644 beentry = &local_beentry->backendStatus;
650 for (i = 0; i < sizeof(nulls) / sizeof(nulls[0]); i++)
654 values[5] = CStringGetTextDatum("<backend information not available>");
656 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
657 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
660 /* Values available to all callers */
661 values[0] = ObjectIdGetDatum(beentry->st_databaseid);
662 values[1] = Int32GetDatum(beentry->st_procpid);
663 values[2] = ObjectIdGetDatum(beentry->st_userid);
664 if (beentry->st_appname)
665 values[3] = CStringGetTextDatum(beentry->st_appname);
669 if (TransactionIdIsValid(local_beentry->backend_xid))
670 values[14] = TransactionIdGetDatum(local_beentry->backend_xid);
674 if (TransactionIdIsValid(local_beentry->backend_xmin))
675 values[15] = TransactionIdGetDatum(local_beentry->backend_xmin);
679 /* Values only available to role member */
680 if (has_privs_of_role(GetUserId(), beentry->st_userid))
682 SockAddr zero_clientaddr;
684 switch (beentry->st_state)
687 values[4] = CStringGetTextDatum("idle");
690 values[4] = CStringGetTextDatum("active");
692 case STATE_IDLEINTRANSACTION:
693 values[4] = CStringGetTextDatum("idle in transaction");
696 values[4] = CStringGetTextDatum("fastpath function call");
698 case STATE_IDLEINTRANSACTION_ABORTED:
699 values[4] = CStringGetTextDatum("idle in transaction (aborted)");
702 values[4] = CStringGetTextDatum("disabled");
704 case STATE_UNDEFINED:
709 values[5] = CStringGetTextDatum(beentry->st_activity);
710 values[6] = BoolGetDatum(beentry->st_waiting);
712 if (beentry->st_xact_start_timestamp != 0)
713 values[7] = TimestampTzGetDatum(beentry->st_xact_start_timestamp);
717 if (beentry->st_activity_start_timestamp != 0)
718 values[8] = TimestampTzGetDatum(beentry->st_activity_start_timestamp);
722 if (beentry->st_proc_start_timestamp != 0)
723 values[9] = TimestampTzGetDatum(beentry->st_proc_start_timestamp);
727 if (beentry->st_state_start_timestamp != 0)
728 values[10] = TimestampTzGetDatum(beentry->st_state_start_timestamp);
732 /* A zeroed client addr means we don't know */
733 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
734 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
735 sizeof(zero_clientaddr)) == 0)
743 if (beentry->st_clientaddr.addr.ss_family == AF_INET
745 || beentry->st_clientaddr.addr.ss_family == AF_INET6
749 char remote_host[NI_MAXHOST];
750 char remote_port[NI_MAXSERV];
753 remote_host[0] = '\0';
754 remote_port[0] = '\0';
755 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
756 beentry->st_clientaddr.salen,
757 remote_host, sizeof(remote_host),
758 remote_port, sizeof(remote_port),
759 NI_NUMERICHOST | NI_NUMERICSERV);
762 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
763 values[11] = DirectFunctionCall1(inet_in,
764 CStringGetDatum(remote_host));
765 if (beentry->st_clienthostname &&
766 beentry->st_clienthostname[0])
767 values[12] = CStringGetTextDatum(beentry->st_clienthostname);
770 values[13] = Int32GetDatum(atoi(remote_port));
779 else if (beentry->st_clientaddr.addr.ss_family == AF_UNIX)
782 * Unix sockets always reports NULL for host and -1 for
783 * port, so it's possible to tell the difference to
784 * connections we have no permissions to view, or with
789 values[13] = DatumGetInt32(-1);
793 /* Unknown address type, should never happen */
802 /* No permissions to view data about this session */
803 values[5] = CStringGetTextDatum("<insufficient privilege>");
815 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
817 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
822 SRF_RETURN_DONE(funcctx);
828 pg_backend_pid(PG_FUNCTION_ARGS)
830 PG_RETURN_INT32(MyProcPid);
835 pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
837 int32 beid = PG_GETARG_INT32(0);
838 PgBackendStatus *beentry;
840 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
843 PG_RETURN_INT32(beentry->st_procpid);
848 pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
850 int32 beid = PG_GETARG_INT32(0);
851 PgBackendStatus *beentry;
853 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
856 PG_RETURN_OID(beentry->st_databaseid);
861 pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
863 int32 beid = PG_GETARG_INT32(0);
864 PgBackendStatus *beentry;
866 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
869 PG_RETURN_OID(beentry->st_userid);
874 pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
876 int32 beid = PG_GETARG_INT32(0);
877 PgBackendStatus *beentry;
878 const char *activity;
880 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
881 activity = "<backend information not available>";
882 else if (!has_privs_of_role(GetUserId(), beentry->st_userid))
883 activity = "<insufficient privilege>";
884 else if (*(beentry->st_activity) == '\0')
885 activity = "<command string not enabled>";
887 activity = beentry->st_activity;
889 PG_RETURN_TEXT_P(cstring_to_text(activity));
894 pg_stat_get_backend_waiting(PG_FUNCTION_ARGS)
896 int32 beid = PG_GETARG_INT32(0);
898 PgBackendStatus *beentry;
900 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
903 if (!has_privs_of_role(GetUserId(), beentry->st_userid))
906 result = beentry->st_waiting;
908 PG_RETURN_BOOL(result);
913 pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
915 int32 beid = PG_GETARG_INT32(0);
917 PgBackendStatus *beentry;
919 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
922 if (!has_privs_of_role(GetUserId(), beentry->st_userid))
925 result = beentry->st_activity_start_timestamp;
928 * No time recorded for start of current query -- this is the case if the
929 * user hasn't enabled query-level stats collection.
934 PG_RETURN_TIMESTAMPTZ(result);
939 pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS)
941 int32 beid = PG_GETARG_INT32(0);
943 PgBackendStatus *beentry;
945 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
948 if (!has_privs_of_role(GetUserId(), beentry->st_userid))
951 result = beentry->st_xact_start_timestamp;
953 if (result == 0) /* not in a transaction */
956 PG_RETURN_TIMESTAMPTZ(result);
961 pg_stat_get_backend_start(PG_FUNCTION_ARGS)
963 int32 beid = PG_GETARG_INT32(0);
965 PgBackendStatus *beentry;
967 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
970 if (!has_privs_of_role(GetUserId(), beentry->st_userid))
973 result = beentry->st_proc_start_timestamp;
975 if (result == 0) /* probably can't happen? */
978 PG_RETURN_TIMESTAMPTZ(result);
983 pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
985 int32 beid = PG_GETARG_INT32(0);
986 PgBackendStatus *beentry;
987 SockAddr zero_clientaddr;
988 char remote_host[NI_MAXHOST];
991 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
994 if (!has_privs_of_role(GetUserId(), beentry->st_userid))
997 /* A zeroed client addr means we don't know */
998 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
999 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
1000 sizeof(zero_clientaddr)) == 0)
1003 switch (beentry->st_clientaddr.addr.ss_family)
1014 remote_host[0] = '\0';
1015 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
1016 beentry->st_clientaddr.salen,
1017 remote_host, sizeof(remote_host),
1019 NI_NUMERICHOST | NI_NUMERICSERV);
1023 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
1025 PG_RETURN_INET_P(DirectFunctionCall1(inet_in,
1026 CStringGetDatum(remote_host)));
1030 pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
1032 int32 beid = PG_GETARG_INT32(0);
1033 PgBackendStatus *beentry;
1034 SockAddr zero_clientaddr;
1035 char remote_port[NI_MAXSERV];
1038 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
1041 if (!has_privs_of_role(GetUserId(), beentry->st_userid))
1044 /* A zeroed client addr means we don't know */
1045 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
1046 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
1047 sizeof(zero_clientaddr)) == 0)
1050 switch (beentry->st_clientaddr.addr.ss_family)
1058 PG_RETURN_INT32(-1);
1063 remote_port[0] = '\0';
1064 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
1065 beentry->st_clientaddr.salen,
1067 remote_port, sizeof(remote_port),
1068 NI_NUMERICHOST | NI_NUMERICSERV);
1072 PG_RETURN_DATUM(DirectFunctionCall1(int4in,
1073 CStringGetDatum(remote_port)));
1078 pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
1080 Oid dbid = PG_GETARG_OID(0);
1082 int tot_backends = pgstat_fetch_stat_numbackends();
1086 for (beid = 1; beid <= tot_backends; beid++)
1088 PgBackendStatus *beentry = pgstat_fetch_stat_beentry(beid);
1090 if (beentry && beentry->st_databaseid == dbid)
1094 PG_RETURN_INT32(result);
1099 pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
1101 Oid dbid = PG_GETARG_OID(0);
1103 PgStat_StatDBEntry *dbentry;
1105 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1108 result = (int64) (dbentry->n_xact_commit);
1110 PG_RETURN_INT64(result);
1115 pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
1117 Oid dbid = PG_GETARG_OID(0);
1119 PgStat_StatDBEntry *dbentry;
1121 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1124 result = (int64) (dbentry->n_xact_rollback);
1126 PG_RETURN_INT64(result);
1131 pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
1133 Oid dbid = PG_GETARG_OID(0);
1135 PgStat_StatDBEntry *dbentry;
1137 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1140 result = (int64) (dbentry->n_blocks_fetched);
1142 PG_RETURN_INT64(result);
1147 pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS)
1149 Oid dbid = PG_GETARG_OID(0);
1151 PgStat_StatDBEntry *dbentry;
1153 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1156 result = (int64) (dbentry->n_blocks_hit);
1158 PG_RETURN_INT64(result);
1163 pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS)
1165 Oid dbid = PG_GETARG_OID(0);
1167 PgStat_StatDBEntry *dbentry;
1169 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1172 result = (int64) (dbentry->n_tuples_returned);
1174 PG_RETURN_INT64(result);
1179 pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS)
1181 Oid dbid = PG_GETARG_OID(0);
1183 PgStat_StatDBEntry *dbentry;
1185 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1188 result = (int64) (dbentry->n_tuples_fetched);
1190 PG_RETURN_INT64(result);
1195 pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS)
1197 Oid dbid = PG_GETARG_OID(0);
1199 PgStat_StatDBEntry *dbentry;
1201 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1204 result = (int64) (dbentry->n_tuples_inserted);
1206 PG_RETURN_INT64(result);
1211 pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS)
1213 Oid dbid = PG_GETARG_OID(0);
1215 PgStat_StatDBEntry *dbentry;
1217 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1220 result = (int64) (dbentry->n_tuples_updated);
1222 PG_RETURN_INT64(result);
1227 pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS)
1229 Oid dbid = PG_GETARG_OID(0);
1231 PgStat_StatDBEntry *dbentry;
1233 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1236 result = (int64) (dbentry->n_tuples_deleted);
1238 PG_RETURN_INT64(result);
1242 pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS)
1244 Oid dbid = PG_GETARG_OID(0);
1246 PgStat_StatDBEntry *dbentry;
1248 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1251 result = dbentry->stat_reset_timestamp;
1256 PG_RETURN_TIMESTAMPTZ(result);
1260 pg_stat_get_db_temp_files(PG_FUNCTION_ARGS)
1262 Oid dbid = PG_GETARG_OID(0);
1264 PgStat_StatDBEntry *dbentry;
1266 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1269 result = dbentry->n_temp_files;
1271 PG_RETURN_INT64(result);
1276 pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS)
1278 Oid dbid = PG_GETARG_OID(0);
1280 PgStat_StatDBEntry *dbentry;
1282 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1285 result = dbentry->n_temp_bytes;
1287 PG_RETURN_INT64(result);
1291 pg_stat_get_db_conflict_tablespace(PG_FUNCTION_ARGS)
1293 Oid dbid = PG_GETARG_OID(0);
1295 PgStat_StatDBEntry *dbentry;
1297 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1300 result = (int64) (dbentry->n_conflict_tablespace);
1302 PG_RETURN_INT64(result);
1306 pg_stat_get_db_conflict_lock(PG_FUNCTION_ARGS)
1308 Oid dbid = PG_GETARG_OID(0);
1310 PgStat_StatDBEntry *dbentry;
1312 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1315 result = (int64) (dbentry->n_conflict_lock);
1317 PG_RETURN_INT64(result);
1321 pg_stat_get_db_conflict_snapshot(PG_FUNCTION_ARGS)
1323 Oid dbid = PG_GETARG_OID(0);
1325 PgStat_StatDBEntry *dbentry;
1327 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1330 result = (int64) (dbentry->n_conflict_snapshot);
1332 PG_RETURN_INT64(result);
1336 pg_stat_get_db_conflict_bufferpin(PG_FUNCTION_ARGS)
1338 Oid dbid = PG_GETARG_OID(0);
1340 PgStat_StatDBEntry *dbentry;
1342 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1345 result = (int64) (dbentry->n_conflict_bufferpin);
1347 PG_RETURN_INT64(result);
1351 pg_stat_get_db_conflict_startup_deadlock(PG_FUNCTION_ARGS)
1353 Oid dbid = PG_GETARG_OID(0);
1355 PgStat_StatDBEntry *dbentry;
1357 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1360 result = (int64) (dbentry->n_conflict_startup_deadlock);
1362 PG_RETURN_INT64(result);
1366 pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS)
1368 Oid dbid = PG_GETARG_OID(0);
1370 PgStat_StatDBEntry *dbentry;
1372 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1376 dbentry->n_conflict_tablespace +
1377 dbentry->n_conflict_lock +
1378 dbentry->n_conflict_snapshot +
1379 dbentry->n_conflict_bufferpin +
1380 dbentry->n_conflict_startup_deadlock);
1382 PG_RETURN_INT64(result);
1386 pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS)
1388 Oid dbid = PG_GETARG_OID(0);
1390 PgStat_StatDBEntry *dbentry;
1392 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1395 result = (int64) (dbentry->n_deadlocks);
1397 PG_RETURN_INT64(result);
1401 pg_stat_get_db_blk_read_time(PG_FUNCTION_ARGS)
1403 Oid dbid = PG_GETARG_OID(0);
1405 PgStat_StatDBEntry *dbentry;
1407 /* convert counter from microsec to millisec for display */
1408 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1411 result = ((double) dbentry->n_block_read_time) / 1000.0;
1413 PG_RETURN_FLOAT8(result);
1417 pg_stat_get_db_blk_write_time(PG_FUNCTION_ARGS)
1419 Oid dbid = PG_GETARG_OID(0);
1421 PgStat_StatDBEntry *dbentry;
1423 /* convert counter from microsec to millisec for display */
1424 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1427 result = ((double) dbentry->n_block_write_time) / 1000.0;
1429 PG_RETURN_FLOAT8(result);
1433 pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS)
1435 PG_RETURN_INT64(pgstat_fetch_global()->timed_checkpoints);
1439 pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS)
1441 PG_RETURN_INT64(pgstat_fetch_global()->requested_checkpoints);
1445 pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS)
1447 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_checkpoints);
1451 pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS)
1453 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_clean);
1457 pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS)
1459 PG_RETURN_INT64(pgstat_fetch_global()->maxwritten_clean);
1463 pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS)
1465 /* time is already in msec, just convert to double for presentation */
1466 PG_RETURN_FLOAT8((double) pgstat_fetch_global()->checkpoint_write_time);
1470 pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS)
1472 /* time is already in msec, just convert to double for presentation */
1473 PG_RETURN_FLOAT8((double) pgstat_fetch_global()->checkpoint_sync_time);
1477 pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS)
1479 PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stat_reset_timestamp);
1483 pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS)
1485 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_backend);
1489 pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS)
1491 PG_RETURN_INT64(pgstat_fetch_global()->buf_fsync_backend);
1495 pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
1497 PG_RETURN_INT64(pgstat_fetch_global()->buf_alloc);
1501 pg_stat_get_xact_numscans(PG_FUNCTION_ARGS)
1503 Oid relid = PG_GETARG_OID(0);
1505 PgStat_TableStatus *tabentry;
1507 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1510 result = (int64) (tabentry->t_counts.t_numscans);
1512 PG_RETURN_INT64(result);
1516 pg_stat_get_xact_tuples_returned(PG_FUNCTION_ARGS)
1518 Oid relid = PG_GETARG_OID(0);
1520 PgStat_TableStatus *tabentry;
1522 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1525 result = (int64) (tabentry->t_counts.t_tuples_returned);
1527 PG_RETURN_INT64(result);
1531 pg_stat_get_xact_tuples_fetched(PG_FUNCTION_ARGS)
1533 Oid relid = PG_GETARG_OID(0);
1535 PgStat_TableStatus *tabentry;
1537 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1540 result = (int64) (tabentry->t_counts.t_tuples_fetched);
1542 PG_RETURN_INT64(result);
1546 pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS)
1548 Oid relid = PG_GETARG_OID(0);
1550 PgStat_TableStatus *tabentry;
1551 PgStat_TableXactStatus *trans;
1553 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1557 result = tabentry->t_counts.t_tuples_inserted;
1558 /* live subtransactions' counts aren't in t_tuples_inserted yet */
1559 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1560 result += trans->tuples_inserted;
1563 PG_RETURN_INT64(result);
1567 pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS)
1569 Oid relid = PG_GETARG_OID(0);
1571 PgStat_TableStatus *tabentry;
1572 PgStat_TableXactStatus *trans;
1574 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1578 result = tabentry->t_counts.t_tuples_updated;
1579 /* live subtransactions' counts aren't in t_tuples_updated yet */
1580 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1581 result += trans->tuples_updated;
1584 PG_RETURN_INT64(result);
1588 pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS)
1590 Oid relid = PG_GETARG_OID(0);
1592 PgStat_TableStatus *tabentry;
1593 PgStat_TableXactStatus *trans;
1595 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1599 result = tabentry->t_counts.t_tuples_deleted;
1600 /* live subtransactions' counts aren't in t_tuples_deleted yet */
1601 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1602 result += trans->tuples_deleted;
1605 PG_RETURN_INT64(result);
1609 pg_stat_get_xact_tuples_hot_updated(PG_FUNCTION_ARGS)
1611 Oid relid = PG_GETARG_OID(0);
1613 PgStat_TableStatus *tabentry;
1615 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1618 result = (int64) (tabentry->t_counts.t_tuples_hot_updated);
1620 PG_RETURN_INT64(result);
1624 pg_stat_get_xact_blocks_fetched(PG_FUNCTION_ARGS)
1626 Oid relid = PG_GETARG_OID(0);
1628 PgStat_TableStatus *tabentry;
1630 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1633 result = (int64) (tabentry->t_counts.t_blocks_fetched);
1635 PG_RETURN_INT64(result);
1639 pg_stat_get_xact_blocks_hit(PG_FUNCTION_ARGS)
1641 Oid relid = PG_GETARG_OID(0);
1643 PgStat_TableStatus *tabentry;
1645 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1648 result = (int64) (tabentry->t_counts.t_blocks_hit);
1650 PG_RETURN_INT64(result);
1654 pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS)
1656 Oid funcid = PG_GETARG_OID(0);
1657 PgStat_BackendFunctionEntry *funcentry;
1659 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1661 PG_RETURN_INT64(funcentry->f_counts.f_numcalls);
1665 pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS)
1667 Oid funcid = PG_GETARG_OID(0);
1668 PgStat_BackendFunctionEntry *funcentry;
1670 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1672 PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_total_time));
1676 pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS)
1678 Oid funcid = PG_GETARG_OID(0);
1679 PgStat_BackendFunctionEntry *funcentry;
1681 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1683 PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_self_time));
1687 /* Get the timestamp of the current statistics snapshot */
1689 pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS)
1691 PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stats_timestamp);
1694 /* Discard the active statistics snapshot */
1696 pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
1698 pgstat_clear_snapshot();
1704 /* Reset all counters for the current database */
1706 pg_stat_reset(PG_FUNCTION_ARGS)
1708 pgstat_reset_counters();
1713 /* Reset some shared cluster-wide counters */
1715 pg_stat_reset_shared(PG_FUNCTION_ARGS)
1717 char *target = text_to_cstring(PG_GETARG_TEXT_PP(0));
1719 pgstat_reset_shared_counters(target);
1724 /* Reset a single counter in the current database */
1726 pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS)
1728 Oid taboid = PG_GETARG_OID(0);
1730 pgstat_reset_single_counter(taboid, RESET_TABLE);
1736 pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS)
1738 Oid funcoid = PG_GETARG_OID(0);
1740 pgstat_reset_single_counter(funcoid, RESET_FUNCTION);
1746 pg_stat_get_archiver(PG_FUNCTION_ARGS)
1751 PgStat_ArchiverStats *archiver_stats;
1753 /* Initialise values and NULL flags arrays */
1754 MemSet(values, 0, sizeof(values));
1755 MemSet(nulls, 0, sizeof(nulls));
1757 /* Initialise attributes information in the tuple descriptor */
1758 tupdesc = CreateTemplateTupleDesc(7, false);
1759 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "archived_count",
1761 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "last_archived_wal",
1763 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "last_archived_time",
1764 TIMESTAMPTZOID, -1, 0);
1765 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "failed_count",
1767 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "last_failed_wal",
1769 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "last_failed_time",
1770 TIMESTAMPTZOID, -1, 0);
1771 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "stats_reset",
1772 TIMESTAMPTZOID, -1, 0);
1774 BlessTupleDesc(tupdesc);
1776 /* Get statistics about the archiver process */
1777 archiver_stats = pgstat_fetch_stat_archiver();
1779 /* Fill values and NULLs */
1780 values[0] = Int64GetDatum(archiver_stats->archived_count);
1781 if (*(archiver_stats->last_archived_wal) == '\0')
1784 values[1] = CStringGetTextDatum(archiver_stats->last_archived_wal);
1786 if (archiver_stats->last_archived_timestamp == 0)
1789 values[2] = TimestampTzGetDatum(archiver_stats->last_archived_timestamp);
1791 values[3] = Int64GetDatum(archiver_stats->failed_count);
1792 if (*(archiver_stats->last_failed_wal) == '\0')
1795 values[4] = CStringGetTextDatum(archiver_stats->last_failed_wal);
1797 if (archiver_stats->last_failed_timestamp == 0)
1800 values[5] = TimestampTzGetDatum(archiver_stats->last_failed_timestamp);
1802 if (archiver_stats->stat_reset_timestamp == 0)
1805 values[6] = TimestampTzGetDatum(archiver_stats->stat_reset_timestamp);
1807 /* Returns the record as Datum */
1808 PG_RETURN_DATUM(HeapTupleGetDatum(
1809 heap_form_tuple(tupdesc, values, nulls)));