1 /*-------------------------------------------------------------------------
4 * Functions for accessing the statistics collector data
6 * Portions Copyright (c) 1996-2014, 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(14, 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",
569 funcctx->tuple_desc = BlessTupleDesc(tupdesc);
571 funcctx->user_fctx = palloc0(sizeof(int));
574 /* Get all backends */
575 funcctx->max_calls = pgstat_fetch_stat_numbackends();
580 * Get one backend - locate by pid.
582 * We lookup the backend early, so we can return zero rows if it
583 * doesn't exist, instead of returning a single row full of NULLs.
585 int pid = PG_GETARG_INT32(0);
587 int n = pgstat_fetch_stat_numbackends();
589 for (i = 1; i <= n; i++)
591 PgBackendStatus *be = pgstat_fetch_stat_beentry(i);
595 if (be->st_procpid == pid)
597 *(int *) (funcctx->user_fctx) = i;
603 if (*(int *) (funcctx->user_fctx) == 0)
604 /* Pid not found, return zero rows */
605 funcctx->max_calls = 0;
607 funcctx->max_calls = 1;
610 MemoryContextSwitchTo(oldcontext);
613 /* stuff done on every call of the function */
614 funcctx = SRF_PERCALL_SETUP();
616 if (funcctx->call_cntr < funcctx->max_calls)
622 PgBackendStatus *beentry;
624 MemSet(values, 0, sizeof(values));
625 MemSet(nulls, 0, sizeof(nulls));
627 if (*(int *) (funcctx->user_fctx) > 0)
629 /* Get specific pid slot */
630 beentry = pgstat_fetch_stat_beentry(*(int *) (funcctx->user_fctx));
634 /* Get the next one in the list */
635 beentry = pgstat_fetch_stat_beentry(funcctx->call_cntr + 1); /* 1-based index */
641 for (i = 0; i < sizeof(nulls) / sizeof(nulls[0]); i++)
645 values[5] = CStringGetTextDatum("<backend information not available>");
647 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
648 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
651 /* Values available to all callers */
652 values[0] = ObjectIdGetDatum(beentry->st_databaseid);
653 values[1] = Int32GetDatum(beentry->st_procpid);
654 values[2] = ObjectIdGetDatum(beentry->st_userid);
655 if (beentry->st_appname)
656 values[3] = CStringGetTextDatum(beentry->st_appname);
660 /* Values only available to same user or superuser */
661 if (superuser() || beentry->st_userid == GetUserId())
663 SockAddr zero_clientaddr;
665 switch (beentry->st_state)
668 values[4] = CStringGetTextDatum("idle");
671 values[4] = CStringGetTextDatum("active");
673 case STATE_IDLEINTRANSACTION:
674 values[4] = CStringGetTextDatum("idle in transaction");
677 values[4] = CStringGetTextDatum("fastpath function call");
679 case STATE_IDLEINTRANSACTION_ABORTED:
680 values[4] = CStringGetTextDatum("idle in transaction (aborted)");
683 values[4] = CStringGetTextDatum("disabled");
685 case STATE_UNDEFINED:
690 values[5] = CStringGetTextDatum(beentry->st_activity);
691 values[6] = BoolGetDatum(beentry->st_waiting);
693 if (beentry->st_xact_start_timestamp != 0)
694 values[7] = TimestampTzGetDatum(beentry->st_xact_start_timestamp);
698 if (beentry->st_activity_start_timestamp != 0)
699 values[8] = TimestampTzGetDatum(beentry->st_activity_start_timestamp);
703 if (beentry->st_proc_start_timestamp != 0)
704 values[9] = TimestampTzGetDatum(beentry->st_proc_start_timestamp);
708 if (beentry->st_state_start_timestamp != 0)
709 values[10] = TimestampTzGetDatum(beentry->st_state_start_timestamp);
713 /* A zeroed client addr means we don't know */
714 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
715 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
716 sizeof(zero_clientaddr)) == 0)
724 if (beentry->st_clientaddr.addr.ss_family == AF_INET
726 || beentry->st_clientaddr.addr.ss_family == AF_INET6
730 char remote_host[NI_MAXHOST];
731 char remote_port[NI_MAXSERV];
734 remote_host[0] = '\0';
735 remote_port[0] = '\0';
736 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
737 beentry->st_clientaddr.salen,
738 remote_host, sizeof(remote_host),
739 remote_port, sizeof(remote_port),
740 NI_NUMERICHOST | NI_NUMERICSERV);
743 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
744 values[11] = DirectFunctionCall1(inet_in,
745 CStringGetDatum(remote_host));
746 if (beentry->st_clienthostname)
747 values[12] = CStringGetTextDatum(beentry->st_clienthostname);
750 values[13] = Int32GetDatum(atoi(remote_port));
759 else if (beentry->st_clientaddr.addr.ss_family == AF_UNIX)
762 * Unix sockets always reports NULL for host and -1 for
763 * port, so it's possible to tell the difference to
764 * connections we have no permissions to view, or with
769 values[13] = DatumGetInt32(-1);
773 /* Unknown address type, should never happen */
782 /* No permissions to view data about this session */
783 values[5] = CStringGetTextDatum("<insufficient privilege>");
795 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
797 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
802 SRF_RETURN_DONE(funcctx);
808 pg_backend_pid(PG_FUNCTION_ARGS)
810 PG_RETURN_INT32(MyProcPid);
815 pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
817 int32 beid = PG_GETARG_INT32(0);
818 PgBackendStatus *beentry;
820 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
823 PG_RETURN_INT32(beentry->st_procpid);
828 pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
830 int32 beid = PG_GETARG_INT32(0);
831 PgBackendStatus *beentry;
833 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
836 PG_RETURN_OID(beentry->st_databaseid);
841 pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
843 int32 beid = PG_GETARG_INT32(0);
844 PgBackendStatus *beentry;
846 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
849 PG_RETURN_OID(beentry->st_userid);
854 pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
856 int32 beid = PG_GETARG_INT32(0);
857 PgBackendStatus *beentry;
858 const char *activity;
860 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
861 activity = "<backend information not available>";
862 else if (!superuser() && beentry->st_userid != GetUserId())
863 activity = "<insufficient privilege>";
864 else if (*(beentry->st_activity) == '\0')
865 activity = "<command string not enabled>";
867 activity = beentry->st_activity;
869 PG_RETURN_TEXT_P(cstring_to_text(activity));
874 pg_stat_get_backend_waiting(PG_FUNCTION_ARGS)
876 int32 beid = PG_GETARG_INT32(0);
878 PgBackendStatus *beentry;
880 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
883 if (!superuser() && beentry->st_userid != GetUserId())
886 result = beentry->st_waiting;
888 PG_RETURN_BOOL(result);
893 pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
895 int32 beid = PG_GETARG_INT32(0);
897 PgBackendStatus *beentry;
899 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
902 if (!superuser() && beentry->st_userid != GetUserId())
905 result = beentry->st_activity_start_timestamp;
908 * No time recorded for start of current query -- this is the case if the
909 * user hasn't enabled query-level stats collection.
914 PG_RETURN_TIMESTAMPTZ(result);
919 pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS)
921 int32 beid = PG_GETARG_INT32(0);
923 PgBackendStatus *beentry;
925 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
928 if (!superuser() && beentry->st_userid != GetUserId())
931 result = beentry->st_xact_start_timestamp;
933 if (result == 0) /* not in a transaction */
936 PG_RETURN_TIMESTAMPTZ(result);
941 pg_stat_get_backend_start(PG_FUNCTION_ARGS)
943 int32 beid = PG_GETARG_INT32(0);
945 PgBackendStatus *beentry;
947 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
950 if (!superuser() && beentry->st_userid != GetUserId())
953 result = beentry->st_proc_start_timestamp;
955 if (result == 0) /* probably can't happen? */
958 PG_RETURN_TIMESTAMPTZ(result);
963 pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
965 int32 beid = PG_GETARG_INT32(0);
966 PgBackendStatus *beentry;
967 SockAddr zero_clientaddr;
968 char remote_host[NI_MAXHOST];
971 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
974 if (!superuser() && beentry->st_userid != GetUserId())
977 /* A zeroed client addr means we don't know */
978 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
979 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
980 sizeof(zero_clientaddr)) == 0)
983 switch (beentry->st_clientaddr.addr.ss_family)
994 remote_host[0] = '\0';
995 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
996 beentry->st_clientaddr.salen,
997 remote_host, sizeof(remote_host),
999 NI_NUMERICHOST | NI_NUMERICSERV);
1003 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
1005 PG_RETURN_INET_P(DirectFunctionCall1(inet_in,
1006 CStringGetDatum(remote_host)));
1010 pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
1012 int32 beid = PG_GETARG_INT32(0);
1013 PgBackendStatus *beentry;
1014 SockAddr zero_clientaddr;
1015 char remote_port[NI_MAXSERV];
1018 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
1021 if (!superuser() && beentry->st_userid != GetUserId())
1024 /* A zeroed client addr means we don't know */
1025 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
1026 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
1027 sizeof(zero_clientaddr)) == 0)
1030 switch (beentry->st_clientaddr.addr.ss_family)
1038 PG_RETURN_INT32(-1);
1043 remote_port[0] = '\0';
1044 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
1045 beentry->st_clientaddr.salen,
1047 remote_port, sizeof(remote_port),
1048 NI_NUMERICHOST | NI_NUMERICSERV);
1052 PG_RETURN_DATUM(DirectFunctionCall1(int4in,
1053 CStringGetDatum(remote_port)));
1058 pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
1060 Oid dbid = PG_GETARG_OID(0);
1062 int tot_backends = pgstat_fetch_stat_numbackends();
1066 for (beid = 1; beid <= tot_backends; beid++)
1068 PgBackendStatus *beentry = pgstat_fetch_stat_beentry(beid);
1070 if (beentry && beentry->st_databaseid == dbid)
1074 PG_RETURN_INT32(result);
1079 pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
1081 Oid dbid = PG_GETARG_OID(0);
1083 PgStat_StatDBEntry *dbentry;
1085 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1088 result = (int64) (dbentry->n_xact_commit);
1090 PG_RETURN_INT64(result);
1095 pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
1097 Oid dbid = PG_GETARG_OID(0);
1099 PgStat_StatDBEntry *dbentry;
1101 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1104 result = (int64) (dbentry->n_xact_rollback);
1106 PG_RETURN_INT64(result);
1111 pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
1113 Oid dbid = PG_GETARG_OID(0);
1115 PgStat_StatDBEntry *dbentry;
1117 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1120 result = (int64) (dbentry->n_blocks_fetched);
1122 PG_RETURN_INT64(result);
1127 pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS)
1129 Oid dbid = PG_GETARG_OID(0);
1131 PgStat_StatDBEntry *dbentry;
1133 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1136 result = (int64) (dbentry->n_blocks_hit);
1138 PG_RETURN_INT64(result);
1143 pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS)
1145 Oid dbid = PG_GETARG_OID(0);
1147 PgStat_StatDBEntry *dbentry;
1149 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1152 result = (int64) (dbentry->n_tuples_returned);
1154 PG_RETURN_INT64(result);
1159 pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS)
1161 Oid dbid = PG_GETARG_OID(0);
1163 PgStat_StatDBEntry *dbentry;
1165 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1168 result = (int64) (dbentry->n_tuples_fetched);
1170 PG_RETURN_INT64(result);
1175 pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS)
1177 Oid dbid = PG_GETARG_OID(0);
1179 PgStat_StatDBEntry *dbentry;
1181 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1184 result = (int64) (dbentry->n_tuples_inserted);
1186 PG_RETURN_INT64(result);
1191 pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS)
1193 Oid dbid = PG_GETARG_OID(0);
1195 PgStat_StatDBEntry *dbentry;
1197 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1200 result = (int64) (dbentry->n_tuples_updated);
1202 PG_RETURN_INT64(result);
1207 pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS)
1209 Oid dbid = PG_GETARG_OID(0);
1211 PgStat_StatDBEntry *dbentry;
1213 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1216 result = (int64) (dbentry->n_tuples_deleted);
1218 PG_RETURN_INT64(result);
1222 pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS)
1224 Oid dbid = PG_GETARG_OID(0);
1226 PgStat_StatDBEntry *dbentry;
1228 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1231 result = dbentry->stat_reset_timestamp;
1236 PG_RETURN_TIMESTAMPTZ(result);
1240 pg_stat_get_db_temp_files(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->n_temp_files;
1251 PG_RETURN_INT64(result);
1256 pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS)
1258 Oid dbid = PG_GETARG_OID(0);
1260 PgStat_StatDBEntry *dbentry;
1262 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1265 result = dbentry->n_temp_bytes;
1267 PG_RETURN_INT64(result);
1271 pg_stat_get_db_conflict_tablespace(PG_FUNCTION_ARGS)
1273 Oid dbid = PG_GETARG_OID(0);
1275 PgStat_StatDBEntry *dbentry;
1277 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1280 result = (int64) (dbentry->n_conflict_tablespace);
1282 PG_RETURN_INT64(result);
1286 pg_stat_get_db_conflict_lock(PG_FUNCTION_ARGS)
1288 Oid dbid = PG_GETARG_OID(0);
1290 PgStat_StatDBEntry *dbentry;
1292 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1295 result = (int64) (dbentry->n_conflict_lock);
1297 PG_RETURN_INT64(result);
1301 pg_stat_get_db_conflict_snapshot(PG_FUNCTION_ARGS)
1303 Oid dbid = PG_GETARG_OID(0);
1305 PgStat_StatDBEntry *dbentry;
1307 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1310 result = (int64) (dbentry->n_conflict_snapshot);
1312 PG_RETURN_INT64(result);
1316 pg_stat_get_db_conflict_bufferpin(PG_FUNCTION_ARGS)
1318 Oid dbid = PG_GETARG_OID(0);
1320 PgStat_StatDBEntry *dbentry;
1322 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1325 result = (int64) (dbentry->n_conflict_bufferpin);
1327 PG_RETURN_INT64(result);
1331 pg_stat_get_db_conflict_startup_deadlock(PG_FUNCTION_ARGS)
1333 Oid dbid = PG_GETARG_OID(0);
1335 PgStat_StatDBEntry *dbentry;
1337 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1340 result = (int64) (dbentry->n_conflict_startup_deadlock);
1342 PG_RETURN_INT64(result);
1346 pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS)
1348 Oid dbid = PG_GETARG_OID(0);
1350 PgStat_StatDBEntry *dbentry;
1352 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1356 dbentry->n_conflict_tablespace +
1357 dbentry->n_conflict_lock +
1358 dbentry->n_conflict_snapshot +
1359 dbentry->n_conflict_bufferpin +
1360 dbentry->n_conflict_startup_deadlock);
1362 PG_RETURN_INT64(result);
1366 pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS)
1368 Oid dbid = PG_GETARG_OID(0);
1370 PgStat_StatDBEntry *dbentry;
1372 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1375 result = (int64) (dbentry->n_deadlocks);
1377 PG_RETURN_INT64(result);
1381 pg_stat_get_db_blk_read_time(PG_FUNCTION_ARGS)
1383 Oid dbid = PG_GETARG_OID(0);
1385 PgStat_StatDBEntry *dbentry;
1387 /* convert counter from microsec to millisec for display */
1388 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1391 result = ((double) dbentry->n_block_read_time) / 1000.0;
1393 PG_RETURN_FLOAT8(result);
1397 pg_stat_get_db_blk_write_time(PG_FUNCTION_ARGS)
1399 Oid dbid = PG_GETARG_OID(0);
1401 PgStat_StatDBEntry *dbentry;
1403 /* convert counter from microsec to millisec for display */
1404 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1407 result = ((double) dbentry->n_block_write_time) / 1000.0;
1409 PG_RETURN_FLOAT8(result);
1413 pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS)
1415 PG_RETURN_INT64(pgstat_fetch_global()->timed_checkpoints);
1419 pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS)
1421 PG_RETURN_INT64(pgstat_fetch_global()->requested_checkpoints);
1425 pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS)
1427 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_checkpoints);
1431 pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS)
1433 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_clean);
1437 pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS)
1439 PG_RETURN_INT64(pgstat_fetch_global()->maxwritten_clean);
1443 pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS)
1445 /* time is already in msec, just convert to double for presentation */
1446 PG_RETURN_FLOAT8((double) pgstat_fetch_global()->checkpoint_write_time);
1450 pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS)
1452 /* time is already in msec, just convert to double for presentation */
1453 PG_RETURN_FLOAT8((double) pgstat_fetch_global()->checkpoint_sync_time);
1457 pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS)
1459 PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stat_reset_timestamp);
1463 pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS)
1465 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_backend);
1469 pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS)
1471 PG_RETURN_INT64(pgstat_fetch_global()->buf_fsync_backend);
1475 pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
1477 PG_RETURN_INT64(pgstat_fetch_global()->buf_alloc);
1481 pg_stat_get_xact_numscans(PG_FUNCTION_ARGS)
1483 Oid relid = PG_GETARG_OID(0);
1485 PgStat_TableStatus *tabentry;
1487 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1490 result = (int64) (tabentry->t_counts.t_numscans);
1492 PG_RETURN_INT64(result);
1496 pg_stat_get_xact_tuples_returned(PG_FUNCTION_ARGS)
1498 Oid relid = PG_GETARG_OID(0);
1500 PgStat_TableStatus *tabentry;
1502 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1505 result = (int64) (tabentry->t_counts.t_tuples_returned);
1507 PG_RETURN_INT64(result);
1511 pg_stat_get_xact_tuples_fetched(PG_FUNCTION_ARGS)
1513 Oid relid = PG_GETARG_OID(0);
1515 PgStat_TableStatus *tabentry;
1517 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1520 result = (int64) (tabentry->t_counts.t_tuples_fetched);
1522 PG_RETURN_INT64(result);
1526 pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS)
1528 Oid relid = PG_GETARG_OID(0);
1530 PgStat_TableStatus *tabentry;
1531 PgStat_TableXactStatus *trans;
1533 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1537 result = tabentry->t_counts.t_tuples_inserted;
1538 /* live subtransactions' counts aren't in t_tuples_inserted yet */
1539 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1540 result += trans->tuples_inserted;
1543 PG_RETURN_INT64(result);
1547 pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS)
1549 Oid relid = PG_GETARG_OID(0);
1551 PgStat_TableStatus *tabentry;
1552 PgStat_TableXactStatus *trans;
1554 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1558 result = tabentry->t_counts.t_tuples_updated;
1559 /* live subtransactions' counts aren't in t_tuples_updated yet */
1560 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1561 result += trans->tuples_updated;
1564 PG_RETURN_INT64(result);
1568 pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS)
1570 Oid relid = PG_GETARG_OID(0);
1572 PgStat_TableStatus *tabentry;
1573 PgStat_TableXactStatus *trans;
1575 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1579 result = tabentry->t_counts.t_tuples_deleted;
1580 /* live subtransactions' counts aren't in t_tuples_deleted yet */
1581 for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
1582 result += trans->tuples_deleted;
1585 PG_RETURN_INT64(result);
1589 pg_stat_get_xact_tuples_hot_updated(PG_FUNCTION_ARGS)
1591 Oid relid = PG_GETARG_OID(0);
1593 PgStat_TableStatus *tabentry;
1595 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1598 result = (int64) (tabentry->t_counts.t_tuples_hot_updated);
1600 PG_RETURN_INT64(result);
1604 pg_stat_get_xact_blocks_fetched(PG_FUNCTION_ARGS)
1606 Oid relid = PG_GETARG_OID(0);
1608 PgStat_TableStatus *tabentry;
1610 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1613 result = (int64) (tabentry->t_counts.t_blocks_fetched);
1615 PG_RETURN_INT64(result);
1619 pg_stat_get_xact_blocks_hit(PG_FUNCTION_ARGS)
1621 Oid relid = PG_GETARG_OID(0);
1623 PgStat_TableStatus *tabentry;
1625 if ((tabentry = find_tabstat_entry(relid)) == NULL)
1628 result = (int64) (tabentry->t_counts.t_blocks_hit);
1630 PG_RETURN_INT64(result);
1634 pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS)
1636 Oid funcid = PG_GETARG_OID(0);
1637 PgStat_BackendFunctionEntry *funcentry;
1639 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1641 PG_RETURN_INT64(funcentry->f_counts.f_numcalls);
1645 pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS)
1647 Oid funcid = PG_GETARG_OID(0);
1648 PgStat_BackendFunctionEntry *funcentry;
1650 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1652 PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_total_time));
1656 pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS)
1658 Oid funcid = PG_GETARG_OID(0);
1659 PgStat_BackendFunctionEntry *funcentry;
1661 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1663 PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_self_time));
1667 /* Discard the active statistics snapshot */
1669 pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
1671 pgstat_clear_snapshot();
1677 /* Reset all counters for the current database */
1679 pg_stat_reset(PG_FUNCTION_ARGS)
1681 pgstat_reset_counters();
1686 /* Reset some shared cluster-wide counters */
1688 pg_stat_reset_shared(PG_FUNCTION_ARGS)
1690 char *target = text_to_cstring(PG_GETARG_TEXT_PP(0));
1692 pgstat_reset_shared_counters(target);
1697 /* Reset a a single counter in the current database */
1699 pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS)
1701 Oid taboid = PG_GETARG_OID(0);
1703 pgstat_reset_single_counter(taboid, RESET_TABLE);
1709 pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS)
1711 Oid funcoid = PG_GETARG_OID(0);
1713 pgstat_reset_single_counter(funcoid, RESET_FUNCTION);
1719 pg_stat_get_archiver(PG_FUNCTION_ARGS)
1724 PgStat_ArchiverStats *archiver_stats;
1726 /* Initialise values and NULL flags arrays */
1727 MemSet(values, 0, sizeof(values));
1728 MemSet(nulls, 0, sizeof(nulls));
1730 /* Initialise attributes information in the tuple descriptor */
1731 tupdesc = CreateTemplateTupleDesc(7, false);
1732 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "archived_count",
1734 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "last_archived_wal",
1736 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "last_archived_time",
1737 TIMESTAMPTZOID, -1, 0);
1738 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "failed_count",
1740 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "last_failed_wal",
1742 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "last_failed_time",
1743 TIMESTAMPTZOID, -1, 0);
1744 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "stats_reset",
1745 TIMESTAMPTZOID, -1, 0);
1747 BlessTupleDesc(tupdesc);
1749 /* Get statistics about the archiver process */
1750 archiver_stats = pgstat_fetch_stat_archiver();
1752 /* Fill values and NULLs */
1753 values[0] = Int64GetDatum(archiver_stats->archived_count);
1754 if (*(archiver_stats->last_archived_wal) == '\0')
1757 values[1] = CStringGetTextDatum(archiver_stats->last_archived_wal);
1759 if (archiver_stats->last_archived_timestamp == 0)
1762 values[2] = TimestampTzGetDatum(archiver_stats->last_archived_timestamp);
1764 values[3] = Int64GetDatum(archiver_stats->failed_count);
1765 if (*(archiver_stats->last_failed_wal) == '\0')
1768 values[4] = CStringGetTextDatum(archiver_stats->last_failed_wal);
1770 if (archiver_stats->last_failed_timestamp == 0)
1773 values[5] = TimestampTzGetDatum(archiver_stats->last_failed_timestamp);
1775 if (archiver_stats->stat_reset_timestamp == 0)
1778 values[6] = TimestampTzGetDatum(archiver_stats->stat_reset_timestamp);
1780 /* Returns the record as Datum */
1781 PG_RETURN_DATUM(HeapTupleGetDatum(
1782 heap_form_tuple(tupdesc, values, nulls)));