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/builtins.h"
24 #include "utils/inet.h"
25 #include "utils/timestamp.h"
27 /* bogus ... these externs should be in a header file */
28 extern Datum pg_stat_get_numscans(PG_FUNCTION_ARGS);
29 extern Datum pg_stat_get_tuples_returned(PG_FUNCTION_ARGS);
30 extern Datum pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS);
31 extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
32 extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
33 extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
34 extern Datum pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS);
35 extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
36 extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
37 extern Datum pg_stat_get_mod_since_analyze(PG_FUNCTION_ARGS);
38 extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
39 extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
40 extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
41 extern Datum pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS);
42 extern Datum pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS);
43 extern Datum pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS);
44 extern Datum pg_stat_get_vacuum_count(PG_FUNCTION_ARGS);
45 extern Datum pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS);
46 extern Datum pg_stat_get_analyze_count(PG_FUNCTION_ARGS);
47 extern Datum pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS);
49 extern Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS);
50 extern Datum pg_stat_get_function_total_time(PG_FUNCTION_ARGS);
51 extern Datum pg_stat_get_function_self_time(PG_FUNCTION_ARGS);
53 extern Datum pg_stat_get_backend_idset(PG_FUNCTION_ARGS);
54 extern Datum pg_stat_get_activity(PG_FUNCTION_ARGS);
55 extern Datum pg_backend_pid(PG_FUNCTION_ARGS);
56 extern Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS);
57 extern Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS);
58 extern Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS);
59 extern Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS);
60 extern Datum pg_stat_get_backend_waiting(PG_FUNCTION_ARGS);
61 extern Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS);
62 extern Datum pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS);
63 extern Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS);
64 extern Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS);
65 extern Datum pg_stat_get_backend_client_port(PG_FUNCTION_ARGS);
67 extern Datum pg_stat_get_db_numbackends(PG_FUNCTION_ARGS);
68 extern Datum pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS);
69 extern Datum pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS);
70 extern Datum pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS);
71 extern Datum pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS);
72 extern Datum pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS);
73 extern Datum pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS);
74 extern Datum pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS);
75 extern Datum pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS);
76 extern Datum pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS);
77 extern Datum pg_stat_get_db_conflict_tablespace(PG_FUNCTION_ARGS);
78 extern Datum pg_stat_get_db_conflict_lock(PG_FUNCTION_ARGS);
79 extern Datum pg_stat_get_db_conflict_snapshot(PG_FUNCTION_ARGS);
80 extern Datum pg_stat_get_db_conflict_bufferpin(PG_FUNCTION_ARGS);
81 extern Datum pg_stat_get_db_conflict_startup_deadlock(PG_FUNCTION_ARGS);
82 extern Datum pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS);
83 extern Datum pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS);
84 extern Datum pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS);
85 extern Datum pg_stat_get_db_temp_files(PG_FUNCTION_ARGS);
86 extern Datum pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS);
87 extern Datum pg_stat_get_db_blk_read_time(PG_FUNCTION_ARGS);
88 extern Datum pg_stat_get_db_blk_write_time(PG_FUNCTION_ARGS);
90 extern Datum pg_stat_get_archiver(PG_FUNCTION_ARGS);
92 extern Datum pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS);
93 extern Datum pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS);
94 extern Datum pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS);
95 extern Datum pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS);
96 extern Datum pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS);
97 extern Datum pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS);
98 extern Datum pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS);
99 extern Datum pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS);
100 extern Datum pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS);
101 extern Datum pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS);
102 extern Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS);
104 extern Datum pg_stat_get_xact_numscans(PG_FUNCTION_ARGS);
105 extern Datum pg_stat_get_xact_tuples_returned(PG_FUNCTION_ARGS);
106 extern Datum pg_stat_get_xact_tuples_fetched(PG_FUNCTION_ARGS);
107 extern Datum pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS);
108 extern Datum pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS);
109 extern Datum pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS);
110 extern Datum pg_stat_get_xact_tuples_hot_updated(PG_FUNCTION_ARGS);
111 extern Datum pg_stat_get_xact_blocks_fetched(PG_FUNCTION_ARGS);
112 extern Datum pg_stat_get_xact_blocks_hit(PG_FUNCTION_ARGS);
114 extern Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS);
115 extern Datum pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS);
116 extern Datum pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS);
118 extern Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS);
119 extern Datum pg_stat_reset(PG_FUNCTION_ARGS);
120 extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS);
121 extern Datum pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS);
122 extern Datum pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS);
124 /* Global bgwriter statistics, from bgwriter.c */
125 extern PgStat_MsgBgWriter bgwriterStats;
128 pg_stat_get_numscans(PG_FUNCTION_ARGS)
130 Oid relid = PG_GETARG_OID(0);
132 PgStat_StatTabEntry *tabentry;
134 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
137 result = (int64) (tabentry->numscans);
139 PG_RETURN_INT64(result);
144 pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
146 Oid relid = PG_GETARG_OID(0);
148 PgStat_StatTabEntry *tabentry;
150 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
153 result = (int64) (tabentry->tuples_returned);
155 PG_RETURN_INT64(result);
160 pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
162 Oid relid = PG_GETARG_OID(0);
164 PgStat_StatTabEntry *tabentry;
166 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
169 result = (int64) (tabentry->tuples_fetched);
171 PG_RETURN_INT64(result);
176 pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
178 Oid relid = PG_GETARG_OID(0);
180 PgStat_StatTabEntry *tabentry;
182 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
185 result = (int64) (tabentry->tuples_inserted);
187 PG_RETURN_INT64(result);
192 pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
194 Oid relid = PG_GETARG_OID(0);
196 PgStat_StatTabEntry *tabentry;
198 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
201 result = (int64) (tabentry->tuples_updated);
203 PG_RETURN_INT64(result);
208 pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
210 Oid relid = PG_GETARG_OID(0);
212 PgStat_StatTabEntry *tabentry;
214 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
217 result = (int64) (tabentry->tuples_deleted);
219 PG_RETURN_INT64(result);
224 pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS)
226 Oid relid = PG_GETARG_OID(0);
228 PgStat_StatTabEntry *tabentry;
230 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
233 result = (int64) (tabentry->tuples_hot_updated);
235 PG_RETURN_INT64(result);
240 pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
242 Oid relid = PG_GETARG_OID(0);
244 PgStat_StatTabEntry *tabentry;
246 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
249 result = (int64) (tabentry->n_live_tuples);
251 PG_RETURN_INT64(result);
256 pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
258 Oid relid = PG_GETARG_OID(0);
260 PgStat_StatTabEntry *tabentry;
262 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
265 result = (int64) (tabentry->n_dead_tuples);
267 PG_RETURN_INT64(result);
272 pg_stat_get_mod_since_analyze(PG_FUNCTION_ARGS)
274 Oid relid = PG_GETARG_OID(0);
276 PgStat_StatTabEntry *tabentry;
278 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
281 result = (int64) (tabentry->changes_since_analyze);
283 PG_RETURN_INT64(result);
288 pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
290 Oid relid = PG_GETARG_OID(0);
292 PgStat_StatTabEntry *tabentry;
294 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
297 result = (int64) (tabentry->blocks_fetched);
299 PG_RETURN_INT64(result);
304 pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
306 Oid relid = PG_GETARG_OID(0);
308 PgStat_StatTabEntry *tabentry;
310 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
313 result = (int64) (tabentry->blocks_hit);
315 PG_RETURN_INT64(result);
319 pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
321 Oid relid = PG_GETARG_OID(0);
323 PgStat_StatTabEntry *tabentry;
325 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
328 result = tabentry->vacuum_timestamp;
333 PG_RETURN_TIMESTAMPTZ(result);
337 pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
339 Oid relid = PG_GETARG_OID(0);
341 PgStat_StatTabEntry *tabentry;
343 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
346 result = tabentry->autovac_vacuum_timestamp;
351 PG_RETURN_TIMESTAMPTZ(result);
355 pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
357 Oid relid = PG_GETARG_OID(0);
359 PgStat_StatTabEntry *tabentry;
361 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
364 result = tabentry->analyze_timestamp;
369 PG_RETURN_TIMESTAMPTZ(result);
373 pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
375 Oid relid = PG_GETARG_OID(0);
377 PgStat_StatTabEntry *tabentry;
379 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
382 result = tabentry->autovac_analyze_timestamp;
387 PG_RETURN_TIMESTAMPTZ(result);
391 pg_stat_get_vacuum_count(PG_FUNCTION_ARGS)
393 Oid relid = PG_GETARG_OID(0);
395 PgStat_StatTabEntry *tabentry;
397 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
400 result = (int64) (tabentry->vacuum_count);
402 PG_RETURN_INT64(result);
406 pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS)
408 Oid relid = PG_GETARG_OID(0);
410 PgStat_StatTabEntry *tabentry;
412 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
415 result = (int64) (tabentry->autovac_vacuum_count);
417 PG_RETURN_INT64(result);
421 pg_stat_get_analyze_count(PG_FUNCTION_ARGS)
423 Oid relid = PG_GETARG_OID(0);
425 PgStat_StatTabEntry *tabentry;
427 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
430 result = (int64) (tabentry->analyze_count);
432 PG_RETURN_INT64(result);
436 pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS)
438 Oid relid = PG_GETARG_OID(0);
440 PgStat_StatTabEntry *tabentry;
442 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
445 result = (int64) (tabentry->autovac_analyze_count);
447 PG_RETURN_INT64(result);
451 pg_stat_get_function_calls(PG_FUNCTION_ARGS)
453 Oid funcid = PG_GETARG_OID(0);
454 PgStat_StatFuncEntry *funcentry;
456 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
458 PG_RETURN_INT64(funcentry->f_numcalls);
462 pg_stat_get_function_total_time(PG_FUNCTION_ARGS)
464 Oid funcid = PG_GETARG_OID(0);
465 PgStat_StatFuncEntry *funcentry;
467 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
469 /* convert counter from microsec to millisec for display */
470 PG_RETURN_FLOAT8(((double) funcentry->f_total_time) / 1000.0);
474 pg_stat_get_function_self_time(PG_FUNCTION_ARGS)
476 Oid funcid = PG_GETARG_OID(0);
477 PgStat_StatFuncEntry *funcentry;
479 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
481 /* convert counter from microsec to millisec for display */
482 PG_RETURN_FLOAT8(((double) funcentry->f_self_time) / 1000.0);
486 pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
488 FuncCallContext *funcctx;
492 /* stuff done only on the first call of the function */
493 if (SRF_IS_FIRSTCALL())
495 /* create a function context for cross-call persistence */
496 funcctx = SRF_FIRSTCALL_INIT();
498 fctx = MemoryContextAlloc(funcctx->multi_call_memory_ctx,
500 funcctx->user_fctx = fctx;
503 fctx[1] = pgstat_fetch_stat_numbackends();
506 /* stuff done on every call of the function */
507 funcctx = SRF_PERCALL_SETUP();
508 fctx = funcctx->user_fctx;
513 if (result <= fctx[1])
515 /* do when there is more left to send */
516 SRF_RETURN_NEXT(funcctx, Int32GetDatum(result));
520 /* do when there is no more left */
521 SRF_RETURN_DONE(funcctx);
526 pg_stat_get_activity(PG_FUNCTION_ARGS)
528 FuncCallContext *funcctx;
530 if (SRF_IS_FIRSTCALL())
532 MemoryContext oldcontext;
535 funcctx = SRF_FIRSTCALL_INIT();
537 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
539 tupdesc = CreateTemplateTupleDesc(16, false);
540 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "datid",
542 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "pid",
544 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "usesysid",
546 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "application_name",
548 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "state",
550 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "query",
552 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "waiting",
554 TupleDescInitEntry(tupdesc, (AttrNumber) 8, "act_start",
555 TIMESTAMPTZOID, -1, 0);
556 TupleDescInitEntry(tupdesc, (AttrNumber) 9, "query_start",
557 TIMESTAMPTZOID, -1, 0);
558 TupleDescInitEntry(tupdesc, (AttrNumber) 10, "backend_start",
559 TIMESTAMPTZOID, -1, 0);
560 TupleDescInitEntry(tupdesc, (AttrNumber) 11, "state_change",
561 TIMESTAMPTZOID, -1, 0);
562 TupleDescInitEntry(tupdesc, (AttrNumber) 12, "client_addr",
564 TupleDescInitEntry(tupdesc, (AttrNumber) 13, "client_hostname",
566 TupleDescInitEntry(tupdesc, (AttrNumber) 14, "client_port",
568 TupleDescInitEntry(tupdesc, (AttrNumber) 15, "backend_xid",
570 TupleDescInitEntry(tupdesc, (AttrNumber) 16, "backend_xmin",
573 funcctx->tuple_desc = BlessTupleDesc(tupdesc);
575 funcctx->user_fctx = palloc0(sizeof(int));
578 /* Get all backends */
579 funcctx->max_calls = pgstat_fetch_stat_numbackends();
584 * Get one backend - locate by pid.
586 * We lookup the backend early, so we can return zero rows if it
587 * doesn't exist, instead of returning a single row full of NULLs.
589 int pid = PG_GETARG_INT32(0);
591 int n = pgstat_fetch_stat_numbackends();
593 for (i = 1; i <= n; i++)
595 PgBackendStatus *be = pgstat_fetch_stat_beentry(i);
599 if (be->st_procpid == pid)
601 *(int *) (funcctx->user_fctx) = i;
607 if (*(int *) (funcctx->user_fctx) == 0)
608 /* Pid not found, return zero rows */
609 funcctx->max_calls = 0;
611 funcctx->max_calls = 1;
614 MemoryContextSwitchTo(oldcontext);
617 /* stuff done on every call of the function */
618 funcctx = SRF_PERCALL_SETUP();
620 if (funcctx->call_cntr < funcctx->max_calls)
626 LocalPgBackendStatus *local_beentry;
627 PgBackendStatus *beentry;
629 MemSet(values, 0, sizeof(values));
630 MemSet(nulls, 0, sizeof(nulls));
632 if (*(int *) (funcctx->user_fctx) > 0)
634 /* Get specific pid slot */
635 local_beentry = pgstat_fetch_stat_local_beentry(*(int *) (funcctx->user_fctx));
636 beentry = &local_beentry->backendStatus;
640 /* Get the next one in the list */
641 local_beentry = pgstat_fetch_stat_local_beentry(funcctx->call_cntr + 1); /* 1-based index */
642 beentry = &local_beentry->backendStatus;
648 for (i = 0; i < sizeof(nulls) / sizeof(nulls[0]); i++)
652 values[5] = CStringGetTextDatum("<backend information not available>");
654 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
655 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
658 /* Values available to all callers */
659 values[0] = ObjectIdGetDatum(beentry->st_databaseid);
660 values[1] = Int32GetDatum(beentry->st_procpid);
661 values[2] = ObjectIdGetDatum(beentry->st_userid);
662 if (beentry->st_appname)
663 values[3] = CStringGetTextDatum(beentry->st_appname);
667 if (TransactionIdIsValid(local_beentry->backend_xid))
668 values[14] = TransactionIdGetDatum(local_beentry->backend_xid);
672 if (TransactionIdIsValid(local_beentry->backend_xmin))
673 values[15] = TransactionIdGetDatum(local_beentry->backend_xmin);
677 /* Values only available to same user or superuser */
678 if (superuser() || beentry->st_userid == GetUserId())
680 SockAddr zero_clientaddr;
682 switch (beentry->st_state)
685 values[4] = CStringGetTextDatum("idle");
688 values[4] = CStringGetTextDatum("active");
690 case STATE_IDLEINTRANSACTION:
691 values[4] = CStringGetTextDatum("idle in transaction");
694 values[4] = CStringGetTextDatum("fastpath function call");
696 case STATE_IDLEINTRANSACTION_ABORTED:
697 values[4] = CStringGetTextDatum("idle in transaction (aborted)");
700 values[4] = CStringGetTextDatum("disabled");
702 case STATE_UNDEFINED:
707 values[5] = CStringGetTextDatum(beentry->st_activity);
708 values[6] = BoolGetDatum(beentry->st_waiting);
710 if (beentry->st_xact_start_timestamp != 0)
711 values[7] = TimestampTzGetDatum(beentry->st_xact_start_timestamp);
715 if (beentry->st_activity_start_timestamp != 0)
716 values[8] = TimestampTzGetDatum(beentry->st_activity_start_timestamp);
720 if (beentry->st_proc_start_timestamp != 0)
721 values[9] = TimestampTzGetDatum(beentry->st_proc_start_timestamp);
725 if (beentry->st_state_start_timestamp != 0)
726 values[10] = TimestampTzGetDatum(beentry->st_state_start_timestamp);
730 /* A zeroed client addr means we don't know */
731 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
732 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
733 sizeof(zero_clientaddr)) == 0)
741 if (beentry->st_clientaddr.addr.ss_family == AF_INET
743 || beentry->st_clientaddr.addr.ss_family == AF_INET6
747 char remote_host[NI_MAXHOST];
748 char remote_port[NI_MAXSERV];
751 remote_host[0] = '\0';
752 remote_port[0] = '\0';
753 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
754 beentry->st_clientaddr.salen,
755 remote_host, sizeof(remote_host),
756 remote_port, sizeof(remote_port),
757 NI_NUMERICHOST | NI_NUMERICSERV);
760 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
761 values[11] = DirectFunctionCall1(inet_in,
762 CStringGetDatum(remote_host));
763 if (beentry->st_clienthostname &&
764 beentry->st_clienthostname[0])
765 values[12] = CStringGetTextDatum(beentry->st_clienthostname);
768 values[13] = Int32GetDatum(atoi(remote_port));
777 else if (beentry->st_clientaddr.addr.ss_family == AF_UNIX)
780 * Unix sockets always reports NULL for host and -1 for
781 * port, so it's possible to tell the difference to
782 * connections we have no permissions to view, or with
787 values[13] = DatumGetInt32(-1);
791 /* Unknown address type, should never happen */
800 /* No permissions to view data about this session */
801 values[5] = CStringGetTextDatum("<insufficient privilege>");
813 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
815 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
820 SRF_RETURN_DONE(funcctx);
826 pg_backend_pid(PG_FUNCTION_ARGS)
828 PG_RETURN_INT32(MyProcPid);
833 pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
835 int32 beid = PG_GETARG_INT32(0);
836 PgBackendStatus *beentry;
838 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
841 PG_RETURN_INT32(beentry->st_procpid);
846 pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
848 int32 beid = PG_GETARG_INT32(0);
849 PgBackendStatus *beentry;
851 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
854 PG_RETURN_OID(beentry->st_databaseid);
859 pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
861 int32 beid = PG_GETARG_INT32(0);
862 PgBackendStatus *beentry;
864 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
867 PG_RETURN_OID(beentry->st_userid);
872 pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
874 int32 beid = PG_GETARG_INT32(0);
875 PgBackendStatus *beentry;
876 const char *activity;
878 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
879 activity = "<backend information not available>";
880 else if (!superuser() && beentry->st_userid != GetUserId())
881 activity = "<insufficient privilege>";
882 else if (*(beentry->st_activity) == '\0')
883 activity = "<command string not enabled>";
885 activity = beentry->st_activity;
887 PG_RETURN_TEXT_P(cstring_to_text(activity));
892 pg_stat_get_backend_waiting(PG_FUNCTION_ARGS)
894 int32 beid = PG_GETARG_INT32(0);
896 PgBackendStatus *beentry;
898 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
901 if (!superuser() && beentry->st_userid != GetUserId())
904 result = beentry->st_waiting;
906 PG_RETURN_BOOL(result);
911 pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
913 int32 beid = PG_GETARG_INT32(0);
915 PgBackendStatus *beentry;
917 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
920 if (!superuser() && beentry->st_userid != GetUserId())
923 result = beentry->st_activity_start_timestamp;
926 * No time recorded for start of current query -- this is the case if the
927 * user hasn't enabled query-level stats collection.
932 PG_RETURN_TIMESTAMPTZ(result);
937 pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS)
939 int32 beid = PG_GETARG_INT32(0);
941 PgBackendStatus *beentry;
943 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
946 if (!superuser() && beentry->st_userid != GetUserId())
949 result = beentry->st_xact_start_timestamp;
951 if (result == 0) /* not in a transaction */
954 PG_RETURN_TIMESTAMPTZ(result);
959 pg_stat_get_backend_start(PG_FUNCTION_ARGS)
961 int32 beid = PG_GETARG_INT32(0);
963 PgBackendStatus *beentry;
965 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
968 if (!superuser() && beentry->st_userid != GetUserId())
971 result = beentry->st_proc_start_timestamp;
973 if (result == 0) /* probably can't happen? */
976 PG_RETURN_TIMESTAMPTZ(result);
981 pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
983 int32 beid = PG_GETARG_INT32(0);
984 PgBackendStatus *beentry;
985 SockAddr zero_clientaddr;
986 char remote_host[NI_MAXHOST];
989 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
992 if (!superuser() && beentry->st_userid != GetUserId())
995 /* A zeroed client addr means we don't know */
996 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
997 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
998 sizeof(zero_clientaddr)) == 0)
1001 switch (beentry->st_clientaddr.addr.ss_family)
1012 remote_host[0] = '\0';
1013 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
1014 beentry->st_clientaddr.salen,
1015 remote_host, sizeof(remote_host),
1017 NI_NUMERICHOST | NI_NUMERICSERV);
1021 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
1023 PG_RETURN_INET_P(DirectFunctionCall1(inet_in,
1024 CStringGetDatum(remote_host)));
1028 pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
1030 int32 beid = PG_GETARG_INT32(0);
1031 PgBackendStatus *beentry;
1032 SockAddr zero_clientaddr;
1033 char remote_port[NI_MAXSERV];
1036 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
1039 if (!superuser() && beentry->st_userid != GetUserId())
1042 /* A zeroed client addr means we don't know */
1043 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
1044 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
1045 sizeof(zero_clientaddr)) == 0)
1048 switch (beentry->st_clientaddr.addr.ss_family)
1056 PG_RETURN_INT32(-1);
1061 remote_port[0] = '\0';
1062 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
1063 beentry->st_clientaddr.salen,
1065 remote_port, sizeof(remote_port),
1066 NI_NUMERICHOST | NI_NUMERICSERV);
1070 PG_RETURN_DATUM(DirectFunctionCall1(int4in,
1071 CStringGetDatum(remote_port)));
1076 pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
1078 Oid dbid = PG_GETARG_OID(0);
1080 int tot_backends = pgstat_fetch_stat_numbackends();
1084 for (beid = 1; beid <= tot_backends; beid++)
1086 PgBackendStatus *beentry = pgstat_fetch_stat_beentry(beid);
1088 if (beentry && beentry->st_databaseid == dbid)
1092 PG_RETURN_INT32(result);
1097 pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
1099 Oid dbid = PG_GETARG_OID(0);
1101 PgStat_StatDBEntry *dbentry;
1103 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1106 result = (int64) (dbentry->n_xact_commit);
1108 PG_RETURN_INT64(result);
1113 pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
1115 Oid dbid = PG_GETARG_OID(0);
1117 PgStat_StatDBEntry *dbentry;
1119 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1122 result = (int64) (dbentry->n_xact_rollback);
1124 PG_RETURN_INT64(result);
1129 pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
1131 Oid dbid = PG_GETARG_OID(0);
1133 PgStat_StatDBEntry *dbentry;
1135 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1138 result = (int64) (dbentry->n_blocks_fetched);
1140 PG_RETURN_INT64(result);
1145 pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS)
1147 Oid dbid = PG_GETARG_OID(0);
1149 PgStat_StatDBEntry *dbentry;
1151 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1154 result = (int64) (dbentry->n_blocks_hit);
1156 PG_RETURN_INT64(result);
1161 pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS)
1163 Oid dbid = PG_GETARG_OID(0);
1165 PgStat_StatDBEntry *dbentry;
1167 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1170 result = (int64) (dbentry->n_tuples_returned);
1172 PG_RETURN_INT64(result);
1177 pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS)
1179 Oid dbid = PG_GETARG_OID(0);
1181 PgStat_StatDBEntry *dbentry;
1183 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1186 result = (int64) (dbentry->n_tuples_fetched);
1188 PG_RETURN_INT64(result);
1193 pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS)
1195 Oid dbid = PG_GETARG_OID(0);
1197 PgStat_StatDBEntry *dbentry;
1199 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1202 result = (int64) (dbentry->n_tuples_inserted);
1204 PG_RETURN_INT64(result);
1209 pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS)
1211 Oid dbid = PG_GETARG_OID(0);
1213 PgStat_StatDBEntry *dbentry;
1215 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1218 result = (int64) (dbentry->n_tuples_updated);
1220 PG_RETURN_INT64(result);
1225 pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS)
1227 Oid dbid = PG_GETARG_OID(0);
1229 PgStat_StatDBEntry *dbentry;
1231 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1234 result = (int64) (dbentry->n_tuples_deleted);
1236 PG_RETURN_INT64(result);
1240 pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS)
1242 Oid dbid = PG_GETARG_OID(0);
1244 PgStat_StatDBEntry *dbentry;
1246 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1249 result = dbentry->stat_reset_timestamp;
1254 PG_RETURN_TIMESTAMPTZ(result);
1258 pg_stat_get_db_temp_files(PG_FUNCTION_ARGS)
1260 Oid dbid = PG_GETARG_OID(0);
1262 PgStat_StatDBEntry *dbentry;
1264 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1267 result = dbentry->n_temp_files;
1269 PG_RETURN_INT64(result);
1274 pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS)
1276 Oid dbid = PG_GETARG_OID(0);
1278 PgStat_StatDBEntry *dbentry;
1280 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1283 result = dbentry->n_temp_bytes;
1285 PG_RETURN_INT64(result);
1289 pg_stat_get_db_conflict_tablespace(PG_FUNCTION_ARGS)
1291 Oid dbid = PG_GETARG_OID(0);
1293 PgStat_StatDBEntry *dbentry;
1295 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1298 result = (int64) (dbentry->n_conflict_tablespace);
1300 PG_RETURN_INT64(result);
1304 pg_stat_get_db_conflict_lock(PG_FUNCTION_ARGS)
1306 Oid dbid = PG_GETARG_OID(0);
1308 PgStat_StatDBEntry *dbentry;
1310 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1313 result = (int64) (dbentry->n_conflict_lock);
1315 PG_RETURN_INT64(result);
1319 pg_stat_get_db_conflict_snapshot(PG_FUNCTION_ARGS)
1321 Oid dbid = PG_GETARG_OID(0);
1323 PgStat_StatDBEntry *dbentry;
1325 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1328 result = (int64) (dbentry->n_conflict_snapshot);
1330 PG_RETURN_INT64(result);
1334 pg_stat_get_db_conflict_bufferpin(PG_FUNCTION_ARGS)
1336 Oid dbid = PG_GETARG_OID(0);
1338 PgStat_StatDBEntry *dbentry;
1340 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1343 result = (int64) (dbentry->n_conflict_bufferpin);
1345 PG_RETURN_INT64(result);
1349 pg_stat_get_db_conflict_startup_deadlock(PG_FUNCTION_ARGS)
1351 Oid dbid = PG_GETARG_OID(0);
1353 PgStat_StatDBEntry *dbentry;
1355 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1358 result = (int64) (dbentry->n_conflict_startup_deadlock);
1360 PG_RETURN_INT64(result);
1364 pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS)
1366 Oid dbid = PG_GETARG_OID(0);
1368 PgStat_StatDBEntry *dbentry;
1370 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1374 dbentry->n_conflict_tablespace +
1375 dbentry->n_conflict_lock +
1376 dbentry->n_conflict_snapshot +
1377 dbentry->n_conflict_bufferpin +
1378 dbentry->n_conflict_startup_deadlock);
1380 PG_RETURN_INT64(result);
1384 pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS)
1386 Oid dbid = PG_GETARG_OID(0);
1388 PgStat_StatDBEntry *dbentry;
1390 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1393 result = (int64) (dbentry->n_deadlocks);
1395 PG_RETURN_INT64(result);
1399 pg_stat_get_db_blk_read_time(PG_FUNCTION_ARGS)
1401 Oid dbid = PG_GETARG_OID(0);
1403 PgStat_StatDBEntry *dbentry;
1405 /* convert counter from microsec to millisec for display */
1406 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1409 result = ((double) dbentry->n_block_read_time) / 1000.0;
1411 PG_RETURN_FLOAT8(result);
1415 pg_stat_get_db_blk_write_time(PG_FUNCTION_ARGS)
1417 Oid dbid = PG_GETARG_OID(0);
1419 PgStat_StatDBEntry *dbentry;
1421 /* convert counter from microsec to millisec for display */
1422 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1425 result = ((double) dbentry->n_block_write_time) / 1000.0;
1427 PG_RETURN_FLOAT8(result);
1431 pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS)
1433 PG_RETURN_INT64(pgstat_fetch_global()->timed_checkpoints);
1437 pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS)
1439 PG_RETURN_INT64(pgstat_fetch_global()->requested_checkpoints);
1443 pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS)
1445 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_checkpoints);
1449 pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS)
1451 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_clean);
1455 pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS)
1457 PG_RETURN_INT64(pgstat_fetch_global()->maxwritten_clean);
1461 pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS)
1463 /* time is already in msec, just convert to double for presentation */
1464 PG_RETURN_FLOAT8((double) pgstat_fetch_global()->checkpoint_write_time);
1468 pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS)
1470 /* time is already in msec, just convert to double for presentation */
1471 PG_RETURN_FLOAT8((double) pgstat_fetch_global()->checkpoint_sync_time);
1475 pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS)
1477 PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stat_reset_timestamp);
1481 pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS)
1483 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_backend);
1487 pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS)
1489 PG_RETURN_INT64(pgstat_fetch_global()->buf_fsync_backend);
1493 pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
1495 PG_RETURN_INT64(pgstat_fetch_global()->buf_alloc);
1499 pg_stat_get_xact_numscans(PG_FUNCTION_ARGS)
1501 Oid relid = PG_GETARG_OID(0);
1503 PgStat_TableStatus *tabentry;
1505 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1508 result = (int64) (tabentry->t_counts.t_numscans);
1510 PG_RETURN_INT64(result);
1514 pg_stat_get_xact_tuples_returned(PG_FUNCTION_ARGS)
1516 Oid relid = PG_GETARG_OID(0);
1518 PgStat_TableStatus *tabentry;
1520 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1523 result = (int64) (tabentry->t_counts.t_tuples_returned);
1525 PG_RETURN_INT64(result);
1529 pg_stat_get_xact_tuples_fetched(PG_FUNCTION_ARGS)
1531 Oid relid = PG_GETARG_OID(0);
1533 PgStat_TableStatus *tabentry;
1535 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1538 result = (int64) (tabentry->t_counts.t_tuples_fetched);
1540 PG_RETURN_INT64(result);
1544 pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS)
1546 Oid relid = PG_GETARG_OID(0);
1548 PgStat_TableStatus *tabentry;
1549 PgStat_TableXactStatus *trans;
1551 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1555 result = tabentry->t_counts.t_tuples_inserted;
1556 /* live subtransactions' counts aren't in t_tuples_inserted yet */
1557 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1558 result += trans->tuples_inserted;
1561 PG_RETURN_INT64(result);
1565 pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS)
1567 Oid relid = PG_GETARG_OID(0);
1569 PgStat_TableStatus *tabentry;
1570 PgStat_TableXactStatus *trans;
1572 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1576 result = tabentry->t_counts.t_tuples_updated;
1577 /* live subtransactions' counts aren't in t_tuples_updated yet */
1578 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1579 result += trans->tuples_updated;
1582 PG_RETURN_INT64(result);
1586 pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS)
1588 Oid relid = PG_GETARG_OID(0);
1590 PgStat_TableStatus *tabentry;
1591 PgStat_TableXactStatus *trans;
1593 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1597 result = tabentry->t_counts.t_tuples_deleted;
1598 /* live subtransactions' counts aren't in t_tuples_deleted yet */
1599 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1600 result += trans->tuples_deleted;
1603 PG_RETURN_INT64(result);
1607 pg_stat_get_xact_tuples_hot_updated(PG_FUNCTION_ARGS)
1609 Oid relid = PG_GETARG_OID(0);
1611 PgStat_TableStatus *tabentry;
1613 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1616 result = (int64) (tabentry->t_counts.t_tuples_hot_updated);
1618 PG_RETURN_INT64(result);
1622 pg_stat_get_xact_blocks_fetched(PG_FUNCTION_ARGS)
1624 Oid relid = PG_GETARG_OID(0);
1626 PgStat_TableStatus *tabentry;
1628 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1631 result = (int64) (tabentry->t_counts.t_blocks_fetched);
1633 PG_RETURN_INT64(result);
1637 pg_stat_get_xact_blocks_hit(PG_FUNCTION_ARGS)
1639 Oid relid = PG_GETARG_OID(0);
1641 PgStat_TableStatus *tabentry;
1643 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1646 result = (int64) (tabentry->t_counts.t_blocks_hit);
1648 PG_RETURN_INT64(result);
1652 pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS)
1654 Oid funcid = PG_GETARG_OID(0);
1655 PgStat_BackendFunctionEntry *funcentry;
1657 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1659 PG_RETURN_INT64(funcentry->f_counts.f_numcalls);
1663 pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS)
1665 Oid funcid = PG_GETARG_OID(0);
1666 PgStat_BackendFunctionEntry *funcentry;
1668 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1670 PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_total_time));
1674 pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS)
1676 Oid funcid = PG_GETARG_OID(0);
1677 PgStat_BackendFunctionEntry *funcentry;
1679 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1681 PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_self_time));
1685 /* Discard the active statistics snapshot */
1687 pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
1689 pgstat_clear_snapshot();
1695 /* Reset all counters for the current database */
1697 pg_stat_reset(PG_FUNCTION_ARGS)
1699 pgstat_reset_counters();
1704 /* Reset some shared cluster-wide counters */
1706 pg_stat_reset_shared(PG_FUNCTION_ARGS)
1708 char *target = text_to_cstring(PG_GETARG_TEXT_PP(0));
1710 pgstat_reset_shared_counters(target);
1715 /* Reset a single counter in the current database */
1717 pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS)
1719 Oid taboid = PG_GETARG_OID(0);
1721 pgstat_reset_single_counter(taboid, RESET_TABLE);
1727 pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS)
1729 Oid funcoid = PG_GETARG_OID(0);
1731 pgstat_reset_single_counter(funcoid, RESET_FUNCTION);
1737 pg_stat_get_archiver(PG_FUNCTION_ARGS)
1742 PgStat_ArchiverStats *archiver_stats;
1744 /* Initialise values and NULL flags arrays */
1745 MemSet(values, 0, sizeof(values));
1746 MemSet(nulls, 0, sizeof(nulls));
1748 /* Initialise attributes information in the tuple descriptor */
1749 tupdesc = CreateTemplateTupleDesc(7, false);
1750 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "archived_count",
1752 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "last_archived_wal",
1754 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "last_archived_time",
1755 TIMESTAMPTZOID, -1, 0);
1756 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "failed_count",
1758 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "last_failed_wal",
1760 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "last_failed_time",
1761 TIMESTAMPTZOID, -1, 0);
1762 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "stats_reset",
1763 TIMESTAMPTZOID, -1, 0);
1765 BlessTupleDesc(tupdesc);
1767 /* Get statistics about the archiver process */
1768 archiver_stats = pgstat_fetch_stat_archiver();
1770 /* Fill values and NULLs */
1771 values[0] = Int64GetDatum(archiver_stats->archived_count);
1772 if (*(archiver_stats->last_archived_wal) == '\0')
1775 values[1] = CStringGetTextDatum(archiver_stats->last_archived_wal);
1777 if (archiver_stats->last_archived_timestamp == 0)
1780 values[2] = TimestampTzGetDatum(archiver_stats->last_archived_timestamp);
1782 values[3] = Int64GetDatum(archiver_stats->failed_count);
1783 if (*(archiver_stats->last_failed_wal) == '\0')
1786 values[4] = CStringGetTextDatum(archiver_stats->last_failed_wal);
1788 if (archiver_stats->last_failed_timestamp == 0)
1791 values[5] = TimestampTzGetDatum(archiver_stats->last_failed_timestamp);
1793 if (archiver_stats->stat_reset_timestamp == 0)
1796 values[6] = TimestampTzGetDatum(archiver_stats->stat_reset_timestamp);
1798 /* Returns the record as Datum */
1799 PG_RETURN_DATUM(HeapTupleGetDatum(
1800 heap_form_tuple(tupdesc, values, nulls)));