1 /*-------------------------------------------------------------------------
4 * Functions for accessing the statistics collector data
6 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.55 2009/11/28 23:38:07 tgl Exp $
13 *-------------------------------------------------------------------------
18 #include "miscadmin.h"
20 #include "catalog/pg_type.h"
21 #include "utils/builtins.h"
22 #include "utils/inet.h"
25 /* bogus ... these externs should be in a header file */
26 extern Datum pg_stat_get_numscans(PG_FUNCTION_ARGS);
27 extern Datum pg_stat_get_tuples_returned(PG_FUNCTION_ARGS);
28 extern Datum pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS);
29 extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
30 extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
31 extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
32 extern Datum pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS);
33 extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
34 extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
35 extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
36 extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
37 extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
38 extern Datum pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS);
39 extern Datum pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS);
40 extern Datum pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS);
42 extern Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS);
43 extern Datum pg_stat_get_function_time(PG_FUNCTION_ARGS);
44 extern Datum pg_stat_get_function_self_time(PG_FUNCTION_ARGS);
46 extern Datum pg_stat_get_backend_idset(PG_FUNCTION_ARGS);
47 extern Datum pg_stat_get_activity(PG_FUNCTION_ARGS);
48 extern Datum pg_backend_pid(PG_FUNCTION_ARGS);
49 extern Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS);
50 extern Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS);
51 extern Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS);
52 extern Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS);
53 extern Datum pg_stat_get_backend_waiting(PG_FUNCTION_ARGS);
54 extern Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS);
55 extern Datum pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS);
56 extern Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS);
57 extern Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS);
58 extern Datum pg_stat_get_backend_client_port(PG_FUNCTION_ARGS);
60 extern Datum pg_stat_get_db_numbackends(PG_FUNCTION_ARGS);
61 extern Datum pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS);
62 extern Datum pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS);
63 extern Datum pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS);
64 extern Datum pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS);
65 extern Datum pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS);
66 extern Datum pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS);
67 extern Datum pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS);
68 extern Datum pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS);
69 extern Datum pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS);
71 extern Datum pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS);
72 extern Datum pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS);
73 extern Datum pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS);
74 extern Datum pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS);
75 extern Datum pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS);
76 extern Datum pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS);
77 extern Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS);
79 extern Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS);
80 extern Datum pg_stat_reset(PG_FUNCTION_ARGS);
82 /* Global bgwriter statistics, from bgwriter.c */
83 extern PgStat_MsgBgWriter bgwriterStats;
86 pg_stat_get_numscans(PG_FUNCTION_ARGS)
88 Oid relid = PG_GETARG_OID(0);
90 PgStat_StatTabEntry *tabentry;
92 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
95 result = (int64) (tabentry->numscans);
97 PG_RETURN_INT64(result);
102 pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
104 Oid relid = PG_GETARG_OID(0);
106 PgStat_StatTabEntry *tabentry;
108 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
111 result = (int64) (tabentry->tuples_returned);
113 PG_RETURN_INT64(result);
118 pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
120 Oid relid = PG_GETARG_OID(0);
122 PgStat_StatTabEntry *tabentry;
124 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
127 result = (int64) (tabentry->tuples_fetched);
129 PG_RETURN_INT64(result);
134 pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
136 Oid relid = PG_GETARG_OID(0);
138 PgStat_StatTabEntry *tabentry;
140 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
143 result = (int64) (tabentry->tuples_inserted);
145 PG_RETURN_INT64(result);
150 pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
152 Oid relid = PG_GETARG_OID(0);
154 PgStat_StatTabEntry *tabentry;
156 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
159 result = (int64) (tabentry->tuples_updated);
161 PG_RETURN_INT64(result);
166 pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
168 Oid relid = PG_GETARG_OID(0);
170 PgStat_StatTabEntry *tabentry;
172 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
175 result = (int64) (tabentry->tuples_deleted);
177 PG_RETURN_INT64(result);
182 pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS)
184 Oid relid = PG_GETARG_OID(0);
186 PgStat_StatTabEntry *tabentry;
188 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
191 result = (int64) (tabentry->tuples_hot_updated);
193 PG_RETURN_INT64(result);
198 pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
200 Oid relid = PG_GETARG_OID(0);
202 PgStat_StatTabEntry *tabentry;
204 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
207 result = (int64) (tabentry->n_live_tuples);
209 PG_RETURN_INT64(result);
214 pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
216 Oid relid = PG_GETARG_OID(0);
218 PgStat_StatTabEntry *tabentry;
220 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
223 result = (int64) (tabentry->n_dead_tuples);
225 PG_RETURN_INT64(result);
230 pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
232 Oid relid = PG_GETARG_OID(0);
234 PgStat_StatTabEntry *tabentry;
236 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
239 result = (int64) (tabentry->blocks_fetched);
241 PG_RETURN_INT64(result);
246 pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
248 Oid relid = PG_GETARG_OID(0);
250 PgStat_StatTabEntry *tabentry;
252 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
255 result = (int64) (tabentry->blocks_hit);
257 PG_RETURN_INT64(result);
261 pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
263 Oid relid = PG_GETARG_OID(0);
265 PgStat_StatTabEntry *tabentry;
267 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
270 result = tabentry->vacuum_timestamp;
275 PG_RETURN_TIMESTAMPTZ(result);
279 pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
281 Oid relid = PG_GETARG_OID(0);
283 PgStat_StatTabEntry *tabentry;
285 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
288 result = tabentry->autovac_vacuum_timestamp;
293 PG_RETURN_TIMESTAMPTZ(result);
297 pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
299 Oid relid = PG_GETARG_OID(0);
301 PgStat_StatTabEntry *tabentry;
303 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
306 result = tabentry->analyze_timestamp;
311 PG_RETURN_TIMESTAMPTZ(result);
315 pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
317 Oid relid = PG_GETARG_OID(0);
319 PgStat_StatTabEntry *tabentry;
321 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
324 result = tabentry->autovac_analyze_timestamp;
329 PG_RETURN_TIMESTAMPTZ(result);
333 pg_stat_get_function_calls(PG_FUNCTION_ARGS)
335 Oid funcid = PG_GETARG_OID(0);
336 PgStat_StatFuncEntry *funcentry;
338 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
340 PG_RETURN_INT64(funcentry->f_numcalls);
344 pg_stat_get_function_time(PG_FUNCTION_ARGS)
346 Oid funcid = PG_GETARG_OID(0);
347 PgStat_StatFuncEntry *funcentry;
349 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
351 PG_RETURN_INT64(funcentry->f_time);
355 pg_stat_get_function_self_time(PG_FUNCTION_ARGS)
357 Oid funcid = PG_GETARG_OID(0);
358 PgStat_StatFuncEntry *funcentry;
360 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
362 PG_RETURN_INT64(funcentry->f_time_self);
366 pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
368 FuncCallContext *funcctx;
372 /* stuff done only on the first call of the function */
373 if (SRF_IS_FIRSTCALL())
375 /* create a function context for cross-call persistence */
376 funcctx = SRF_FIRSTCALL_INIT();
378 fctx = MemoryContextAlloc(funcctx->multi_call_memory_ctx,
380 funcctx->user_fctx = fctx;
383 fctx[1] = pgstat_fetch_stat_numbackends();
386 /* stuff done on every call of the function */
387 funcctx = SRF_PERCALL_SETUP();
388 fctx = funcctx->user_fctx;
393 if (result <= fctx[1])
395 /* do when there is more left to send */
396 SRF_RETURN_NEXT(funcctx, Int32GetDatum(result));
400 /* do when there is no more left */
401 SRF_RETURN_DONE(funcctx);
406 pg_stat_get_activity(PG_FUNCTION_ARGS)
408 FuncCallContext *funcctx;
410 if (SRF_IS_FIRSTCALL())
412 MemoryContext oldcontext;
415 funcctx = SRF_FIRSTCALL_INIT();
417 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
419 tupdesc = CreateTemplateTupleDesc(11, false);
420 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "datid", OIDOID, -1, 0);
421 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "procpid", INT4OID, -1, 0);
422 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "usesysid", OIDOID, -1, 0);
423 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "current_query", TEXTOID, -1, 0);
424 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "waiting", BOOLOID, -1, 0);
425 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "act_start", TIMESTAMPTZOID, -1, 0);
426 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "query_start", TIMESTAMPTZOID, -1, 0);
427 TupleDescInitEntry(tupdesc, (AttrNumber) 8, "backend_start", TIMESTAMPTZOID, -1, 0);
428 TupleDescInitEntry(tupdesc, (AttrNumber) 9, "client_addr", INETOID, -1, 0);
429 TupleDescInitEntry(tupdesc, (AttrNumber) 10, "client_port", INT4OID, -1, 0);
430 TupleDescInitEntry(tupdesc, (AttrNumber) 11, "application_name", TEXTOID, -1, 0);
432 funcctx->tuple_desc = BlessTupleDesc(tupdesc);
434 funcctx->user_fctx = palloc0(sizeof(int));
437 /* Get all backends */
438 funcctx->max_calls = pgstat_fetch_stat_numbackends();
443 * Get one backend - locate by pid.
445 * We lookup the backend early, so we can return zero rows if it
446 * doesn't exist, instead of returning a single row full of NULLs.
448 int pid = PG_GETARG_INT32(0);
450 int n = pgstat_fetch_stat_numbackends();
452 for (i = 1; i <= n; i++)
454 PgBackendStatus *be = pgstat_fetch_stat_beentry(i);
458 if (be->st_procpid == pid)
460 *(int *) (funcctx->user_fctx) = i;
466 if (*(int *) (funcctx->user_fctx) == 0)
467 /* Pid not found, return zero rows */
468 funcctx->max_calls = 0;
470 funcctx->max_calls = 1;
473 MemoryContextSwitchTo(oldcontext);
476 /* stuff done on every call of the function */
477 funcctx = SRF_PERCALL_SETUP();
479 if (funcctx->call_cntr < funcctx->max_calls)
485 PgBackendStatus *beentry;
486 SockAddr zero_clientaddr;
488 MemSet(values, 0, sizeof(values));
489 MemSet(nulls, 0, sizeof(nulls));
491 if (*(int *) (funcctx->user_fctx) > 0)
492 /* Get specific pid slot */
493 beentry = pgstat_fetch_stat_beentry(*(int *) (funcctx->user_fctx));
495 /* Get the next one in the list */
496 beentry = pgstat_fetch_stat_beentry(funcctx->call_cntr + 1); /* 1-based index */
501 for (i = 0; i < sizeof(nulls) / sizeof(nulls[0]); i++)
505 values[3] = CStringGetTextDatum("<backend information not available>");
507 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
508 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
511 /* Values available to all callers */
512 values[0] = ObjectIdGetDatum(beentry->st_databaseid);
513 values[1] = Int32GetDatum(beentry->st_procpid);
514 values[2] = ObjectIdGetDatum(beentry->st_userid);
516 /* Values only available to same user or superuser */
517 if (superuser() || beentry->st_userid == GetUserId())
519 if (*(beentry->st_activity) == '\0')
521 values[3] = CStringGetTextDatum("<command string not enabled>");
525 values[3] = CStringGetTextDatum(beentry->st_activity);
528 values[4] = BoolGetDatum(beentry->st_waiting);
530 if (beentry->st_xact_start_timestamp != 0)
531 values[5] = TimestampTzGetDatum(beentry->st_xact_start_timestamp);
535 if (beentry->st_activity_start_timestamp != 0)
536 values[6] = TimestampTzGetDatum(beentry->st_activity_start_timestamp);
540 if (beentry->st_proc_start_timestamp != 0)
541 values[7] = TimestampTzGetDatum(beentry->st_proc_start_timestamp);
545 /* A zeroed client addr means we don't know */
546 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
547 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
548 sizeof(zero_clientaddr) == 0))
555 if (beentry->st_clientaddr.addr.ss_family == AF_INET
557 || beentry->st_clientaddr.addr.ss_family == AF_INET6
561 char remote_host[NI_MAXHOST];
562 char remote_port[NI_MAXSERV];
565 remote_host[0] = '\0';
566 remote_port[0] = '\0';
567 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
568 beentry->st_clientaddr.salen,
569 remote_host, sizeof(remote_host),
570 remote_port, sizeof(remote_port),
571 NI_NUMERICHOST | NI_NUMERICSERV);
579 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
580 values[8] = DirectFunctionCall1(inet_in,
581 CStringGetDatum(remote_host));
582 values[9] = Int32GetDatum(atoi(remote_port));
585 else if (beentry->st_clientaddr.addr.ss_family == AF_UNIX)
588 * Unix sockets always reports NULL for host and -1 for
589 * port, so it's possible to tell the difference to
590 * connections we have no permissions to view, or with
594 values[9] = DatumGetInt32(-1);
598 /* Unknown address type, should never happen */
604 /* application name */
605 if (beentry->st_appname)
606 values[10] = CStringGetTextDatum(beentry->st_appname);
612 /* No permissions to view data about this session */
613 values[3] = CStringGetTextDatum("<insufficient privilege>");
623 tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
625 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
630 SRF_RETURN_DONE(funcctx);
636 pg_backend_pid(PG_FUNCTION_ARGS)
638 PG_RETURN_INT32(MyProcPid);
643 pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
645 int32 beid = PG_GETARG_INT32(0);
646 PgBackendStatus *beentry;
648 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
651 PG_RETURN_INT32(beentry->st_procpid);
656 pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
658 int32 beid = PG_GETARG_INT32(0);
659 PgBackendStatus *beentry;
661 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
664 PG_RETURN_OID(beentry->st_databaseid);
669 pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
671 int32 beid = PG_GETARG_INT32(0);
672 PgBackendStatus *beentry;
674 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
677 PG_RETURN_OID(beentry->st_userid);
682 pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
684 int32 beid = PG_GETARG_INT32(0);
685 PgBackendStatus *beentry;
686 const char *activity;
688 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
689 activity = "<backend information not available>";
690 else if (!superuser() && beentry->st_userid != GetUserId())
691 activity = "<insufficient privilege>";
692 else if (*(beentry->st_activity) == '\0')
693 activity = "<command string not enabled>";
695 activity = beentry->st_activity;
697 PG_RETURN_TEXT_P(cstring_to_text(activity));
702 pg_stat_get_backend_waiting(PG_FUNCTION_ARGS)
704 int32 beid = PG_GETARG_INT32(0);
706 PgBackendStatus *beentry;
708 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
711 if (!superuser() && beentry->st_userid != GetUserId())
714 result = beentry->st_waiting;
716 PG_RETURN_BOOL(result);
721 pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
723 int32 beid = PG_GETARG_INT32(0);
725 PgBackendStatus *beentry;
727 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
730 if (!superuser() && beentry->st_userid != GetUserId())
733 result = beentry->st_activity_start_timestamp;
736 * No time recorded for start of current query -- this is the case if the
737 * user hasn't enabled query-level stats collection.
742 PG_RETURN_TIMESTAMPTZ(result);
747 pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS)
749 int32 beid = PG_GETARG_INT32(0);
751 PgBackendStatus *beentry;
753 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
756 if (!superuser() && beentry->st_userid != GetUserId())
759 result = beentry->st_xact_start_timestamp;
761 if (result == 0) /* not in a transaction */
764 PG_RETURN_TIMESTAMPTZ(result);
769 pg_stat_get_backend_start(PG_FUNCTION_ARGS)
771 int32 beid = PG_GETARG_INT32(0);
773 PgBackendStatus *beentry;
775 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
778 if (!superuser() && beentry->st_userid != GetUserId())
781 result = beentry->st_proc_start_timestamp;
783 if (result == 0) /* probably can't happen? */
786 PG_RETURN_TIMESTAMPTZ(result);
791 pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
793 int32 beid = PG_GETARG_INT32(0);
794 PgBackendStatus *beentry;
795 SockAddr zero_clientaddr;
796 char remote_host[NI_MAXHOST];
799 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
802 if (!superuser() && beentry->st_userid != GetUserId())
805 /* A zeroed client addr means we don't know */
806 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
807 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
808 sizeof(zero_clientaddr) == 0))
811 switch (beentry->st_clientaddr.addr.ss_family)
822 remote_host[0] = '\0';
823 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
824 beentry->st_clientaddr.salen,
825 remote_host, sizeof(remote_host),
827 NI_NUMERICHOST | NI_NUMERICSERV);
831 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
833 PG_RETURN_INET_P(DirectFunctionCall1(inet_in,
834 CStringGetDatum(remote_host)));
838 pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
840 int32 beid = PG_GETARG_INT32(0);
841 PgBackendStatus *beentry;
842 SockAddr zero_clientaddr;
843 char remote_port[NI_MAXSERV];
846 if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
849 if (!superuser() && beentry->st_userid != GetUserId())
852 /* A zeroed client addr means we don't know */
853 memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
854 if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
855 sizeof(zero_clientaddr) == 0))
858 switch (beentry->st_clientaddr.addr.ss_family)
871 remote_port[0] = '\0';
872 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
873 beentry->st_clientaddr.salen,
875 remote_port, sizeof(remote_port),
876 NI_NUMERICHOST | NI_NUMERICSERV);
880 PG_RETURN_DATUM(DirectFunctionCall1(int4in,
881 CStringGetDatum(remote_port)));
886 pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
888 Oid dbid = PG_GETARG_OID(0);
890 int tot_backends = pgstat_fetch_stat_numbackends();
894 for (beid = 1; beid <= tot_backends; beid++)
896 PgBackendStatus *beentry = pgstat_fetch_stat_beentry(beid);
898 if (beentry && beentry->st_databaseid == dbid)
902 PG_RETURN_INT32(result);
907 pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
909 Oid dbid = PG_GETARG_OID(0);
911 PgStat_StatDBEntry *dbentry;
913 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
916 result = (int64) (dbentry->n_xact_commit);
918 PG_RETURN_INT64(result);
923 pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
925 Oid dbid = PG_GETARG_OID(0);
927 PgStat_StatDBEntry *dbentry;
929 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
932 result = (int64) (dbentry->n_xact_rollback);
934 PG_RETURN_INT64(result);
939 pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
941 Oid dbid = PG_GETARG_OID(0);
943 PgStat_StatDBEntry *dbentry;
945 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
948 result = (int64) (dbentry->n_blocks_fetched);
950 PG_RETURN_INT64(result);
955 pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS)
957 Oid dbid = PG_GETARG_OID(0);
959 PgStat_StatDBEntry *dbentry;
961 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
964 result = (int64) (dbentry->n_blocks_hit);
966 PG_RETURN_INT64(result);
971 pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS)
973 Oid dbid = PG_GETARG_OID(0);
975 PgStat_StatDBEntry *dbentry;
977 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
980 result = (int64) (dbentry->n_tuples_returned);
982 PG_RETURN_INT64(result);
987 pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS)
989 Oid dbid = PG_GETARG_OID(0);
991 PgStat_StatDBEntry *dbentry;
993 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
996 result = (int64) (dbentry->n_tuples_fetched);
998 PG_RETURN_INT64(result);
1003 pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS)
1005 Oid dbid = PG_GETARG_OID(0);
1007 PgStat_StatDBEntry *dbentry;
1009 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1012 result = (int64) (dbentry->n_tuples_inserted);
1014 PG_RETURN_INT64(result);
1019 pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS)
1021 Oid dbid = PG_GETARG_OID(0);
1023 PgStat_StatDBEntry *dbentry;
1025 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1028 result = (int64) (dbentry->n_tuples_updated);
1030 PG_RETURN_INT64(result);
1035 pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS)
1037 Oid dbid = PG_GETARG_OID(0);
1039 PgStat_StatDBEntry *dbentry;
1041 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1044 result = (int64) (dbentry->n_tuples_deleted);
1046 PG_RETURN_INT64(result);
1050 pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS)
1052 PG_RETURN_INT64(pgstat_fetch_global()->timed_checkpoints);
1056 pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS)
1058 PG_RETURN_INT64(pgstat_fetch_global()->requested_checkpoints);
1062 pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS)
1064 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_checkpoints);
1068 pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS)
1070 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_clean);
1074 pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS)
1076 PG_RETURN_INT64(pgstat_fetch_global()->maxwritten_clean);
1080 pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS)
1082 PG_RETURN_INT64(pgstat_fetch_global()->buf_written_backend);
1086 pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
1088 PG_RETURN_INT64(pgstat_fetch_global()->buf_alloc);
1092 /* Discard the active statistics snapshot */
1094 pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
1096 pgstat_clear_snapshot();
1102 /* Reset all counters for the current database */
1104 pg_stat_reset(PG_FUNCTION_ARGS)
1106 pgstat_reset_counters();