PostgreSQL Source Code git master
pgstatfuncs.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * pgstatfuncs.c
4 * Functions for accessing various forms of statistics data
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/utils/adt/pgstatfuncs.c
12 *
13 *-------------------------------------------------------------------------
14 */
15#include "postgres.h"
16
17#include "access/htup_details.h"
18#include "access/xlog.h"
20#include "catalog/catalog.h"
21#include "catalog/pg_authid.h"
22#include "catalog/pg_type.h"
23#include "common/ip.h"
24#include "funcapi.h"
25#include "miscadmin.h"
26#include "pgstat.h"
27#include "postmaster/bgworker.h"
29#include "storage/proc.h"
30#include "storage/procarray.h"
31#include "utils/acl.h"
32#include "utils/builtins.h"
33#include "utils/timestamp.h"
34
35#define UINT32_ACCESS_ONCE(var) ((uint32)(*((volatile uint32 *)&(var))))
36
37#define HAS_PGSTAT_PERMISSIONS(role) (has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS) || has_privs_of_role(GetUserId(), role))
38
39#define PG_STAT_GET_RELENTRY_INT64(stat) \
40Datum \
41CppConcat(pg_stat_get_,stat)(PG_FUNCTION_ARGS) \
42{ \
43 Oid relid = PG_GETARG_OID(0); \
44 int64 result; \
45 PgStat_StatTabEntry *tabentry; \
46 \
47 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) \
48 result = 0; \
49 else \
50 result = (int64) (tabentry->stat); \
51 \
52 PG_RETURN_INT64(result); \
53}
54
55/* pg_stat_get_analyze_count */
56PG_STAT_GET_RELENTRY_INT64(analyze_count)
57
58/* pg_stat_get_autoanalyze_count */
59PG_STAT_GET_RELENTRY_INT64(autoanalyze_count)
60
61/* pg_stat_get_autovacuum_count */
62PG_STAT_GET_RELENTRY_INT64(autovacuum_count)
63
64/* pg_stat_get_blocks_fetched */
65PG_STAT_GET_RELENTRY_INT64(blocks_fetched)
66
67/* pg_stat_get_blocks_hit */
69
70/* pg_stat_get_dead_tuples */
72
73/* pg_stat_get_ins_since_vacuum */
74PG_STAT_GET_RELENTRY_INT64(ins_since_vacuum)
75
76/* pg_stat_get_live_tuples */
78
79/* pg_stat_get_mod_since_analyze */
80PG_STAT_GET_RELENTRY_INT64(mod_since_analyze)
81
82/* pg_stat_get_numscans */
84
85/* pg_stat_get_tuples_deleted */
86PG_STAT_GET_RELENTRY_INT64(tuples_deleted)
87
88/* pg_stat_get_tuples_fetched */
89PG_STAT_GET_RELENTRY_INT64(tuples_fetched)
90
91/* pg_stat_get_tuples_hot_updated */
92PG_STAT_GET_RELENTRY_INT64(tuples_hot_updated)
93
94/* pg_stat_get_tuples_newpage_updated */
95PG_STAT_GET_RELENTRY_INT64(tuples_newpage_updated)
96
97/* pg_stat_get_tuples_inserted */
98PG_STAT_GET_RELENTRY_INT64(tuples_inserted)
99
100/* pg_stat_get_tuples_returned */
101PG_STAT_GET_RELENTRY_INT64(tuples_returned)
102
103/* pg_stat_get_tuples_updated */
104PG_STAT_GET_RELENTRY_INT64(tuples_updated)
105
106/* pg_stat_get_vacuum_count */
107PG_STAT_GET_RELENTRY_INT64(vacuum_count)
108
109#define PG_STAT_GET_RELENTRY_FLOAT8(stat) \
110Datum \
111CppConcat(pg_stat_get_,stat)(PG_FUNCTION_ARGS) \
112{ \
113 Oid relid = PG_GETARG_OID(0); \
114 double result; \
115 PgStat_StatTabEntry *tabentry; \
116 \
117 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) \
118 result = 0; \
119 else \
120 result = (double) (tabentry->stat); \
121 \
122 PG_RETURN_FLOAT8(result); \
123}
124
125/* pg_stat_get_total_vacuum_time */
126PG_STAT_GET_RELENTRY_FLOAT8(total_vacuum_time)
127
128/* pg_stat_get_total_autovacuum_time */
129PG_STAT_GET_RELENTRY_FLOAT8(total_autovacuum_time)
130
131/* pg_stat_get_total_analyze_time */
132PG_STAT_GET_RELENTRY_FLOAT8(total_analyze_time)
133
134/* pg_stat_get_total_autoanalyze_time */
135PG_STAT_GET_RELENTRY_FLOAT8(total_autoanalyze_time)
136
137#define PG_STAT_GET_RELENTRY_TIMESTAMPTZ(stat) \
138Datum \
139CppConcat(pg_stat_get_,stat)(PG_FUNCTION_ARGS) \
140{ \
141 Oid relid = PG_GETARG_OID(0); \
142 TimestampTz result; \
143 PgStat_StatTabEntry *tabentry; \
144 \
145 if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) \
146 result = 0; \
147 else \
148 result = tabentry->stat; \
149 \
150 if (result == 0) \
151 PG_RETURN_NULL(); \
152 else \
153 PG_RETURN_TIMESTAMPTZ(result); \
154}
155
156/* pg_stat_get_last_analyze_time */
157PG_STAT_GET_RELENTRY_TIMESTAMPTZ(last_analyze_time)
158
159/* pg_stat_get_last_autoanalyze_time */
160PG_STAT_GET_RELENTRY_TIMESTAMPTZ(last_autoanalyze_time)
161
162/* pg_stat_get_last_autovacuum_time */
163PG_STAT_GET_RELENTRY_TIMESTAMPTZ(last_autovacuum_time)
164
165/* pg_stat_get_last_vacuum_time */
166PG_STAT_GET_RELENTRY_TIMESTAMPTZ(last_vacuum_time)
167
168/* pg_stat_get_lastscan */
170
171/* pg_stat_get_stat_reset_time */
173
174Datum
176{
177 Oid funcid = PG_GETARG_OID(0);
178 PgStat_StatFuncEntry *funcentry;
179
180 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
182 PG_RETURN_INT64(funcentry->numcalls);
183}
184
185/* convert counter from microsec to millisec for display */
186#define PG_STAT_GET_FUNCENTRY_FLOAT8_MS(stat) \
187Datum \
188CppConcat(pg_stat_get_function_,stat)(PG_FUNCTION_ARGS) \
189{ \
190 Oid funcid = PG_GETARG_OID(0); \
191 double result; \
192 PgStat_StatFuncEntry *funcentry; \
193 \
194 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL) \
195 PG_RETURN_NULL(); \
196 result = ((double) funcentry->stat) / 1000.0; \
197 PG_RETURN_FLOAT8(result); \
198}
199
200/* pg_stat_get_function_total_time */
202
203/* pg_stat_get_function_self_time */
205
206Datum
208{
209 Oid funcid = PG_GETARG_OID(0);
210 TimestampTz result;
211 PgStat_StatFuncEntry *funcentry;
212
213 if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
214 result = 0;
215 else
216 result = funcentry->stat_reset_timestamp;
217
218 if (result == 0)
220 else
221 PG_RETURN_TIMESTAMPTZ(result);
222}
223
224Datum
226{
227 FuncCallContext *funcctx;
228 int *fctx;
229
230 /* stuff done only on the first call of the function */
231 if (SRF_IS_FIRSTCALL())
232 {
233 /* create a function context for cross-call persistence */
234 funcctx = SRF_FIRSTCALL_INIT();
235
237 sizeof(int));
238 funcctx->user_fctx = fctx;
239
240 fctx[0] = 0;
241 }
242
243 /* stuff done on every call of the function */
244 funcctx = SRF_PERCALL_SETUP();
245 fctx = funcctx->user_fctx;
246
247 fctx[0] += 1;
248
249 /*
250 * We recheck pgstat_fetch_stat_numbackends() each time through, just in
251 * case the local status data has been refreshed since we started. It's
252 * plenty cheap enough if not. If a refresh does happen, we'll likely
253 * miss or duplicate some backend IDs, but we're content not to crash.
254 * (Refreshing midway through such a query would be problematic usage
255 * anyway, since the backend IDs we've already returned might no longer
256 * refer to extant sessions.)
257 */
258 if (fctx[0] <= pgstat_fetch_stat_numbackends())
259 {
260 /* do when there is more left to send */
262
263 SRF_RETURN_NEXT(funcctx, Int32GetDatum(local_beentry->proc_number));
264 }
265 else
266 {
267 /* do when there is no more left */
268 SRF_RETURN_DONE(funcctx);
269 }
270}
271
272/*
273 * Returns command progress information for the named command.
274 */
275Datum
277{
278#define PG_STAT_GET_PROGRESS_COLS PGSTAT_NUM_PROGRESS_PARAM + 3
279 int num_backends = pgstat_fetch_stat_numbackends();
280 int curr_backend;
281 char *cmd = text_to_cstring(PG_GETARG_TEXT_PP(0));
282 ProgressCommandType cmdtype;
283 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
284
285 /* Translate command name into command type code. */
286 if (pg_strcasecmp(cmd, "VACUUM") == 0)
287 cmdtype = PROGRESS_COMMAND_VACUUM;
288 else if (pg_strcasecmp(cmd, "ANALYZE") == 0)
289 cmdtype = PROGRESS_COMMAND_ANALYZE;
290 else if (pg_strcasecmp(cmd, "CLUSTER") == 0)
291 cmdtype = PROGRESS_COMMAND_CLUSTER;
292 else if (pg_strcasecmp(cmd, "CREATE INDEX") == 0)
294 else if (pg_strcasecmp(cmd, "BASEBACKUP") == 0)
296 else if (pg_strcasecmp(cmd, "COPY") == 0)
297 cmdtype = PROGRESS_COMMAND_COPY;
298 else
300 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
301 errmsg("invalid command name: \"%s\"", cmd)));
302
303 InitMaterializedSRF(fcinfo, 0);
304
305 /* 1-based index */
306 for (curr_backend = 1; curr_backend <= num_backends; curr_backend++)
307 {
308 LocalPgBackendStatus *local_beentry;
309 PgBackendStatus *beentry;
311 bool nulls[PG_STAT_GET_PROGRESS_COLS] = {0};
312 int i;
313
314 local_beentry = pgstat_get_local_beentry_by_index(curr_backend);
315 beentry = &local_beentry->backendStatus;
316
317 /*
318 * Report values for only those backends which are running the given
319 * command.
320 */
321 if (beentry->st_progress_command != cmdtype)
322 continue;
323
324 /* Value available to all callers */
325 values[0] = Int32GetDatum(beentry->st_procpid);
327
328 /* show rest of the values including relid only to role members */
329 if (HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
330 {
332 for (i = 0; i < PGSTAT_NUM_PROGRESS_PARAM; i++)
333 values[i + 3] = Int64GetDatum(beentry->st_progress_param[i]);
334 }
335 else
336 {
337 nulls[2] = true;
338 for (i = 0; i < PGSTAT_NUM_PROGRESS_PARAM; i++)
339 nulls[i + 3] = true;
340 }
341
342 tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
343 }
344
345 return (Datum) 0;
346}
347
348/*
349 * Returns activity of PG backends.
350 */
351Datum
353{
354#define PG_STAT_GET_ACTIVITY_COLS 31
355 int num_backends = pgstat_fetch_stat_numbackends();
356 int curr_backend;
357 int pid = PG_ARGISNULL(0) ? -1 : PG_GETARG_INT32(0);
358 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
359
360 InitMaterializedSRF(fcinfo, 0);
361
362 /* 1-based index */
363 for (curr_backend = 1; curr_backend <= num_backends; curr_backend++)
364 {
365 /* for each row */
367 bool nulls[PG_STAT_GET_ACTIVITY_COLS] = {0};
368 LocalPgBackendStatus *local_beentry;
369 PgBackendStatus *beentry;
370 PGPROC *proc;
371 const char *wait_event_type = NULL;
372 const char *wait_event = NULL;
373
374 /* Get the next one in the list */
375 local_beentry = pgstat_get_local_beentry_by_index(curr_backend);
376 beentry = &local_beentry->backendStatus;
377
378 /* If looking for specific PID, ignore all the others */
379 if (pid != -1 && beentry->st_procpid != pid)
380 continue;
381
382 /* Values available to all callers */
383 if (beentry->st_databaseid != InvalidOid)
385 else
386 nulls[0] = true;
387
388 values[1] = Int32GetDatum(beentry->st_procpid);
389
390 if (beentry->st_userid != InvalidOid)
391 values[2] = ObjectIdGetDatum(beentry->st_userid);
392 else
393 nulls[2] = true;
394
395 if (beentry->st_appname)
397 else
398 nulls[3] = true;
399
400 if (TransactionIdIsValid(local_beentry->backend_xid))
401 values[15] = TransactionIdGetDatum(local_beentry->backend_xid);
402 else
403 nulls[15] = true;
404
405 if (TransactionIdIsValid(local_beentry->backend_xmin))
406 values[16] = TransactionIdGetDatum(local_beentry->backend_xmin);
407 else
408 nulls[16] = true;
409
410 /* Values only available to role member or pg_read_all_stats */
411 if (HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
412 {
413 char *clipped_activity;
414
415 switch (beentry->st_state)
416 {
417 case STATE_STARTING:
418 values[4] = CStringGetTextDatum("starting");
419 break;
420 case STATE_IDLE:
421 values[4] = CStringGetTextDatum("idle");
422 break;
423 case STATE_RUNNING:
424 values[4] = CStringGetTextDatum("active");
425 break;
427 values[4] = CStringGetTextDatum("idle in transaction");
428 break;
429 case STATE_FASTPATH:
430 values[4] = CStringGetTextDatum("fastpath function call");
431 break;
433 values[4] = CStringGetTextDatum("idle in transaction (aborted)");
434 break;
435 case STATE_DISABLED:
436 values[4] = CStringGetTextDatum("disabled");
437 break;
438 case STATE_UNDEFINED:
439 nulls[4] = true;
440 break;
441 }
442
443 clipped_activity = pgstat_clip_activity(beentry->st_activity_raw);
444 values[5] = CStringGetTextDatum(clipped_activity);
445 pfree(clipped_activity);
446
447 /* leader_pid */
448 nulls[29] = true;
449
450 proc = BackendPidGetProc(beentry->st_procpid);
451
452 if (proc == NULL && (beentry->st_backendType != B_BACKEND))
453 {
454 /*
455 * For an auxiliary process, retrieve process info from
456 * AuxiliaryProcs stored in shared-memory.
457 */
458 proc = AuxiliaryPidGetProc(beentry->st_procpid);
459 }
460
461 /*
462 * If a PGPROC entry was retrieved, display wait events and lock
463 * group leader or apply leader information if any. To avoid
464 * extra overhead, no extra lock is being held, so there is no
465 * guarantee of consistency across multiple rows.
466 */
467 if (proc != NULL)
468 {
469 uint32 raw_wait_event;
470 PGPROC *leader;
471
472 raw_wait_event = UINT32_ACCESS_ONCE(proc->wait_event_info);
473 wait_event_type = pgstat_get_wait_event_type(raw_wait_event);
474 wait_event = pgstat_get_wait_event(raw_wait_event);
475
476 leader = proc->lockGroupLeader;
477
478 /*
479 * Show the leader only for active parallel workers. This
480 * leaves the field as NULL for the leader of a parallel group
481 * or the leader of parallel apply workers.
482 */
483 if (leader && leader->pid != beentry->st_procpid)
484 {
485 values[29] = Int32GetDatum(leader->pid);
486 nulls[29] = false;
487 }
488 else if (beentry->st_backendType == B_BG_WORKER)
489 {
490 int leader_pid = GetLeaderApplyWorkerPid(beentry->st_procpid);
491
492 if (leader_pid != InvalidPid)
493 {
494 values[29] = Int32GetDatum(leader_pid);
495 nulls[29] = false;
496 }
497 }
498 }
499
500 if (wait_event_type)
501 values[6] = CStringGetTextDatum(wait_event_type);
502 else
503 nulls[6] = true;
504
505 if (wait_event)
506 values[7] = CStringGetTextDatum(wait_event);
507 else
508 nulls[7] = true;
509
510 /*
511 * Don't expose transaction time for walsenders; it confuses
512 * monitoring, particularly because we don't keep the time up-to-
513 * date.
514 */
515 if (beentry->st_xact_start_timestamp != 0 &&
516 beentry->st_backendType != B_WAL_SENDER)
518 else
519 nulls[8] = true;
520
521 if (beentry->st_activity_start_timestamp != 0)
523 else
524 nulls[9] = true;
525
526 if (beentry->st_proc_start_timestamp != 0)
528 else
529 nulls[10] = true;
530
531 if (beentry->st_state_start_timestamp != 0)
533 else
534 nulls[11] = true;
535
536 /* A zeroed client addr means we don't know */
538 sizeof(beentry->st_clientaddr)))
539 {
540 nulls[12] = true;
541 nulls[13] = true;
542 nulls[14] = true;
543 }
544 else
545 {
546 if (beentry->st_clientaddr.addr.ss_family == AF_INET ||
547 beentry->st_clientaddr.addr.ss_family == AF_INET6)
548 {
549 char remote_host[NI_MAXHOST];
550 char remote_port[NI_MAXSERV];
551 int ret;
552
553 remote_host[0] = '\0';
554 remote_port[0] = '\0';
555 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
556 beentry->st_clientaddr.salen,
557 remote_host, sizeof(remote_host),
558 remote_port, sizeof(remote_port),
559 NI_NUMERICHOST | NI_NUMERICSERV);
560 if (ret == 0)
561 {
562 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
564 CStringGetDatum(remote_host));
565 if (beentry->st_clienthostname &&
566 beentry->st_clienthostname[0])
568 else
569 nulls[13] = true;
570 values[14] = Int32GetDatum(atoi(remote_port));
571 }
572 else
573 {
574 nulls[12] = true;
575 nulls[13] = true;
576 nulls[14] = true;
577 }
578 }
579 else if (beentry->st_clientaddr.addr.ss_family == AF_UNIX)
580 {
581 /*
582 * Unix sockets always reports NULL for host and -1 for
583 * port, so it's possible to tell the difference to
584 * connections we have no permissions to view, or with
585 * errors.
586 */
587 nulls[12] = true;
588 nulls[13] = true;
589 values[14] = Int32GetDatum(-1);
590 }
591 else
592 {
593 /* Unknown address type, should never happen */
594 nulls[12] = true;
595 nulls[13] = true;
596 nulls[14] = true;
597 }
598 }
599 /* Add backend type */
600 if (beentry->st_backendType == B_BG_WORKER)
601 {
602 const char *bgw_type;
603
604 bgw_type = GetBackgroundWorkerTypeByPid(beentry->st_procpid);
605 if (bgw_type)
606 values[17] = CStringGetTextDatum(bgw_type);
607 else
608 nulls[17] = true;
609 }
610 else
611 values[17] =
613
614 /* SSL information */
615 if (beentry->st_ssl)
616 {
617 values[18] = BoolGetDatum(true); /* ssl */
620 values[21] = Int32GetDatum(beentry->st_sslstatus->ssl_bits);
621
622 if (beentry->st_sslstatus->ssl_client_dn[0])
624 else
625 nulls[22] = true;
626
627 if (beentry->st_sslstatus->ssl_client_serial[0])
631 Int32GetDatum(-1));
632 else
633 nulls[23] = true;
634
635 if (beentry->st_sslstatus->ssl_issuer_dn[0])
637 else
638 nulls[24] = true;
639 }
640 else
641 {
642 values[18] = BoolGetDatum(false); /* ssl */
643 nulls[19] = nulls[20] = nulls[21] = nulls[22] = nulls[23] = nulls[24] = true;
644 }
645
646 /* GSSAPI information */
647 if (beentry->st_gss)
648 {
649 values[25] = BoolGetDatum(beentry->st_gssstatus->gss_auth); /* gss_auth */
651 values[27] = BoolGetDatum(beentry->st_gssstatus->gss_enc); /* GSS Encryption in use */
652 values[28] = BoolGetDatum(beentry->st_gssstatus->gss_delegation); /* GSS credentials
653 * delegated */
654 }
655 else
656 {
657 values[25] = BoolGetDatum(false); /* gss_auth */
658 nulls[26] = true; /* No GSS principal */
659 values[27] = BoolGetDatum(false); /* GSS Encryption not in
660 * use */
661 values[28] = BoolGetDatum(false); /* GSS credentials not
662 * delegated */
663 }
664 if (beentry->st_query_id == INT64CONST(0))
665 nulls[30] = true;
666 else
667 values[30] = Int64GetDatum(beentry->st_query_id);
668 }
669 else
670 {
671 /* No permissions to view data about this session */
672 values[5] = CStringGetTextDatum("<insufficient privilege>");
673 nulls[4] = true;
674 nulls[6] = true;
675 nulls[7] = true;
676 nulls[8] = true;
677 nulls[9] = true;
678 nulls[10] = true;
679 nulls[11] = true;
680 nulls[12] = true;
681 nulls[13] = true;
682 nulls[14] = true;
683 nulls[17] = true;
684 nulls[18] = true;
685 nulls[19] = true;
686 nulls[20] = true;
687 nulls[21] = true;
688 nulls[22] = true;
689 nulls[23] = true;
690 nulls[24] = true;
691 nulls[25] = true;
692 nulls[26] = true;
693 nulls[27] = true;
694 nulls[28] = true;
695 nulls[29] = true;
696 nulls[30] = true;
697 }
698
699 tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
700
701 /* If only a single backend was requested, and we found it, break. */
702 if (pid != -1)
703 break;
704 }
705
706 return (Datum) 0;
707}
708
709
710Datum
712{
714}
715
716
717Datum
719{
720 int32 procNumber = PG_GETARG_INT32(0);
721 PgBackendStatus *beentry;
722
723 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
725
726 PG_RETURN_INT32(beentry->st_procpid);
727}
728
729
730Datum
732{
733 int32 procNumber = PG_GETARG_INT32(0);
734 PgBackendStatus *beentry;
735
736 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
738
740}
741
742
743Datum
745{
746 int32 procNumber = PG_GETARG_INT32(0);
747 PgBackendStatus *beentry;
748
749 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
751
752 PG_RETURN_OID(beentry->st_userid);
753}
754
755Datum
757{
758#define PG_STAT_GET_SUBXACT_COLS 2
759 TupleDesc tupdesc;
761 bool nulls[PG_STAT_GET_SUBXACT_COLS] = {0};
762 int32 procNumber = PG_GETARG_INT32(0);
763 LocalPgBackendStatus *local_beentry;
764
765 /* Initialise attributes information in the tuple descriptor */
767 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "subxact_count",
768 INT4OID, -1, 0);
769 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "subxact_overflow",
770 BOOLOID, -1, 0);
771
772 BlessTupleDesc(tupdesc);
773
774 if ((local_beentry = pgstat_get_local_beentry_by_proc_number(procNumber)) != NULL)
775 {
776 /* Fill values and NULLs */
777 values[0] = Int32GetDatum(local_beentry->backend_subxact_count);
779 }
780 else
781 {
782 nulls[0] = true;
783 nulls[1] = true;
784 }
785
786 /* Returns the record as Datum */
788}
789
790Datum
792{
793 int32 procNumber = PG_GETARG_INT32(0);
794 PgBackendStatus *beentry;
795 const char *activity;
796 char *clipped_activity;
797 text *ret;
798
799 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
800 activity = "<backend information not available>";
801 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
802 activity = "<insufficient privilege>";
803 else if (*(beentry->st_activity_raw) == '\0')
804 activity = "<command string not enabled>";
805 else
806 activity = beentry->st_activity_raw;
807
808 clipped_activity = pgstat_clip_activity(activity);
809 ret = cstring_to_text(activity);
810 pfree(clipped_activity);
811
812 PG_RETURN_TEXT_P(ret);
813}
814
815Datum
817{
818 int32 procNumber = PG_GETARG_INT32(0);
819 PgBackendStatus *beentry;
820 PGPROC *proc;
821 const char *wait_event_type = NULL;
822
823 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
824 wait_event_type = "<backend information not available>";
825 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
826 wait_event_type = "<insufficient privilege>";
827 else if ((proc = BackendPidGetProc(beentry->st_procpid)) != NULL)
828 wait_event_type = pgstat_get_wait_event_type(proc->wait_event_info);
829
830 if (!wait_event_type)
832
833 PG_RETURN_TEXT_P(cstring_to_text(wait_event_type));
834}
835
836Datum
838{
839 int32 procNumber = PG_GETARG_INT32(0);
840 PgBackendStatus *beentry;
841 PGPROC *proc;
842 const char *wait_event = NULL;
843
844 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
845 wait_event = "<backend information not available>";
846 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
847 wait_event = "<insufficient privilege>";
848 else if ((proc = BackendPidGetProc(beentry->st_procpid)) != NULL)
849 wait_event = pgstat_get_wait_event(proc->wait_event_info);
850
851 if (!wait_event)
853
855}
856
857
858Datum
860{
861 int32 procNumber = PG_GETARG_INT32(0);
862 TimestampTz result;
863 PgBackendStatus *beentry;
864
865 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
867
868 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
870
871 result = beentry->st_activity_start_timestamp;
872
873 /*
874 * No time recorded for start of current query -- this is the case if the
875 * user hasn't enabled query-level stats collection.
876 */
877 if (result == 0)
879
880 PG_RETURN_TIMESTAMPTZ(result);
881}
882
883
884Datum
886{
887 int32 procNumber = PG_GETARG_INT32(0);
888 TimestampTz result;
889 PgBackendStatus *beentry;
890
891 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
893
894 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
896
897 result = beentry->st_xact_start_timestamp;
898
899 if (result == 0) /* not in a transaction */
901
902 PG_RETURN_TIMESTAMPTZ(result);
903}
904
905
906Datum
908{
909 int32 procNumber = PG_GETARG_INT32(0);
910 TimestampTz result;
911 PgBackendStatus *beentry;
912
913 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
915
916 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
918
919 result = beentry->st_proc_start_timestamp;
920
921 if (result == 0) /* probably can't happen? */
923
924 PG_RETURN_TIMESTAMPTZ(result);
925}
926
927
928Datum
930{
931 int32 procNumber = PG_GETARG_INT32(0);
932 PgBackendStatus *beentry;
933 char remote_host[NI_MAXHOST];
934 int ret;
935
936 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
938
939 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
941
942 /* A zeroed client addr means we don't know */
944 sizeof(beentry->st_clientaddr)))
946
947 switch (beentry->st_clientaddr.addr.ss_family)
948 {
949 case AF_INET:
950 case AF_INET6:
951 break;
952 default:
954 }
955
956 remote_host[0] = '\0';
957 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
958 beentry->st_clientaddr.salen,
959 remote_host, sizeof(remote_host),
960 NULL, 0,
961 NI_NUMERICHOST | NI_NUMERICSERV);
962 if (ret != 0)
964
965 clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
966
968 CStringGetDatum(remote_host)));
969}
970
971Datum
973{
974 int32 procNumber = PG_GETARG_INT32(0);
975 PgBackendStatus *beentry;
976 char remote_port[NI_MAXSERV];
977 int ret;
978
979 if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL)
981
982 else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
984
985 /* A zeroed client addr means we don't know */
987 sizeof(beentry->st_clientaddr)))
989
990 switch (beentry->st_clientaddr.addr.ss_family)
991 {
992 case AF_INET:
993 case AF_INET6:
994 break;
995 case AF_UNIX:
996 PG_RETURN_INT32(-1);
997 default:
999 }
1000
1001 remote_port[0] = '\0';
1002 ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
1003 beentry->st_clientaddr.salen,
1004 NULL, 0,
1005 remote_port, sizeof(remote_port),
1006 NI_NUMERICHOST | NI_NUMERICSERV);
1007 if (ret != 0)
1009
1011 CStringGetDatum(remote_port)));
1012}
1013
1014
1015Datum
1017{
1018 Oid dbid = PG_GETARG_OID(0);
1019 int32 result;
1020 int tot_backends = pgstat_fetch_stat_numbackends();
1021 int idx;
1022
1023 result = 0;
1024 for (idx = 1; idx <= tot_backends; idx++)
1025 {
1027
1028 if (local_beentry->backendStatus.st_databaseid == dbid)
1029 result++;
1030 }
1031
1032 PG_RETURN_INT32(result);
1033}
1034
1035
1036#define PG_STAT_GET_DBENTRY_INT64(stat) \
1037Datum \
1038CppConcat(pg_stat_get_db_,stat)(PG_FUNCTION_ARGS) \
1039{ \
1040 Oid dbid = PG_GETARG_OID(0); \
1041 int64 result; \
1042 PgStat_StatDBEntry *dbentry; \
1043 \
1044 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL) \
1045 result = 0; \
1046 else \
1047 result = (int64) (dbentry->stat); \
1048 \
1049 PG_RETURN_INT64(result); \
1050}
1051
1052/* pg_stat_get_db_blocks_fetched */
1053PG_STAT_GET_DBENTRY_INT64(blocks_fetched)
1054
1055/* pg_stat_get_db_blocks_hit */
1056PG_STAT_GET_DBENTRY_INT64(blocks_hit)
1057
1058/* pg_stat_get_db_conflict_bufferpin */
1059PG_STAT_GET_DBENTRY_INT64(conflict_bufferpin)
1060
1061/* pg_stat_get_db_conflict_lock */
1062PG_STAT_GET_DBENTRY_INT64(conflict_lock)
1063
1064/* pg_stat_get_db_conflict_snapshot */
1065PG_STAT_GET_DBENTRY_INT64(conflict_snapshot)
1066
1067/* pg_stat_get_db_conflict_startup_deadlock */
1068PG_STAT_GET_DBENTRY_INT64(conflict_startup_deadlock)
1069
1070/* pg_stat_get_db_conflict_tablespace */
1071PG_STAT_GET_DBENTRY_INT64(conflict_tablespace)
1072
1073/* pg_stat_get_db_deadlocks */
1075
1076/* pg_stat_get_db_sessions */
1078
1079/* pg_stat_get_db_sessions_abandoned */
1080PG_STAT_GET_DBENTRY_INT64(sessions_abandoned)
1081
1082/* pg_stat_get_db_sessions_fatal */
1083PG_STAT_GET_DBENTRY_INT64(sessions_fatal)
1084
1085/* pg_stat_get_db_sessions_killed */
1086PG_STAT_GET_DBENTRY_INT64(sessions_killed)
1087
1088/* pg_stat_get_db_parallel_workers_to_launch */
1089PG_STAT_GET_DBENTRY_INT64(parallel_workers_to_launch)
1090
1091/* pg_stat_get_db_parallel_workers_launched */
1092PG_STAT_GET_DBENTRY_INT64(parallel_workers_launched)
1093
1094/* pg_stat_get_db_temp_bytes */
1095PG_STAT_GET_DBENTRY_INT64(temp_bytes)
1096
1097/* pg_stat_get_db_temp_files */
1098PG_STAT_GET_DBENTRY_INT64(temp_files)
1099
1100/* pg_stat_get_db_tuples_deleted */
1101PG_STAT_GET_DBENTRY_INT64(tuples_deleted)
1102
1103/* pg_stat_get_db_tuples_fetched */
1104PG_STAT_GET_DBENTRY_INT64(tuples_fetched)
1105
1106/* pg_stat_get_db_tuples_inserted */
1107PG_STAT_GET_DBENTRY_INT64(tuples_inserted)
1108
1109/* pg_stat_get_db_tuples_returned */
1110PG_STAT_GET_DBENTRY_INT64(tuples_returned)
1111
1112/* pg_stat_get_db_tuples_updated */
1113PG_STAT_GET_DBENTRY_INT64(tuples_updated)
1114
1115/* pg_stat_get_db_xact_commit */
1116PG_STAT_GET_DBENTRY_INT64(xact_commit)
1117
1118/* pg_stat_get_db_xact_rollback */
1119PG_STAT_GET_DBENTRY_INT64(xact_rollback)
1120
1121/* pg_stat_get_db_conflict_logicalslot */
1122PG_STAT_GET_DBENTRY_INT64(conflict_logicalslot)
1123
1124Datum
1126{
1127 Oid dbid = PG_GETARG_OID(0);
1128 TimestampTz result;
1129 PgStat_StatDBEntry *dbentry;
1130
1131 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1132 result = 0;
1133 else
1134 result = dbentry->stat_reset_timestamp;
1135
1136 if (result == 0)
1138 else
1139 PG_RETURN_TIMESTAMPTZ(result);
1140}
1141
1142
1143Datum
1145{
1146 Oid dbid = PG_GETARG_OID(0);
1147 int64 result;
1148 PgStat_StatDBEntry *dbentry;
1149
1150 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1151 result = 0;
1152 else
1153 result = (int64) (dbentry->conflict_tablespace +
1154 dbentry->conflict_lock +
1155 dbentry->conflict_snapshot +
1156 dbentry->conflict_logicalslot +
1157 dbentry->conflict_bufferpin +
1158 dbentry->conflict_startup_deadlock);
1159
1160 PG_RETURN_INT64(result);
1161}
1162
1163Datum
1165{
1166 Oid dbid = PG_GETARG_OID(0);
1167 int64 result;
1168 PgStat_StatDBEntry *dbentry;
1169
1170 if (!DataChecksumsEnabled())
1172
1173 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1174 result = 0;
1175 else
1176 result = (int64) (dbentry->checksum_failures);
1177
1178 PG_RETURN_INT64(result);
1179}
1180
1181Datum
1183{
1184 Oid dbid = PG_GETARG_OID(0);
1185 TimestampTz result;
1186 PgStat_StatDBEntry *dbentry;
1187
1188 if (!DataChecksumsEnabled())
1190
1191 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
1192 result = 0;
1193 else
1194 result = dbentry->last_checksum_failure;
1195
1196 if (result == 0)
1198 else
1199 PG_RETURN_TIMESTAMPTZ(result);
1200}
1201
1202/* convert counter from microsec to millisec for display */
1203#define PG_STAT_GET_DBENTRY_FLOAT8_MS(stat) \
1204Datum \
1205CppConcat(pg_stat_get_db_,stat)(PG_FUNCTION_ARGS) \
1206{ \
1207 Oid dbid = PG_GETARG_OID(0); \
1208 double result; \
1209 PgStat_StatDBEntry *dbentry; \
1210 \
1211 if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL) \
1212 result = 0; \
1213 else \
1214 result = ((double) dbentry->stat) / 1000.0; \
1215 \
1216 PG_RETURN_FLOAT8(result); \
1217}
1218
1219/* pg_stat_get_db_active_time */
1221
1222/* pg_stat_get_db_blk_read_time */
1223PG_STAT_GET_DBENTRY_FLOAT8_MS(blk_read_time)
1224
1225/* pg_stat_get_db_blk_write_time */
1226PG_STAT_GET_DBENTRY_FLOAT8_MS(blk_write_time)
1227
1228/* pg_stat_get_db_idle_in_transaction_time */
1229PG_STAT_GET_DBENTRY_FLOAT8_MS(idle_in_transaction_time)
1230
1231/* pg_stat_get_db_session_time */
1233
1234Datum
1236{
1238}
1239
1240Datum
1242{
1244}
1245
1246Datum
1248{
1250}
1251
1252Datum
1254{
1255 PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->restartpoints_timed);
1256}
1257
1258Datum
1260{
1261 PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->restartpoints_requested);
1262}
1263
1264Datum
1266{
1267 PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->restartpoints_performed);
1268}
1269
1270Datum
1272{
1274}
1275
1276Datum
1278{
1280}
1281
1282Datum
1284{
1285 PG_RETURN_INT64(pgstat_fetch_stat_bgwriter()->buf_written_clean);
1286}
1287
1288Datum
1290{
1291 PG_RETURN_INT64(pgstat_fetch_stat_bgwriter()->maxwritten_clean);
1292}
1293
1294Datum
1296{
1297 /* time is already in msec, just convert to double for presentation */
1298 PG_RETURN_FLOAT8((double)
1299 pgstat_fetch_stat_checkpointer()->write_time);
1300}
1301
1302Datum
1304{
1305 /* time is already in msec, just convert to double for presentation */
1306 PG_RETURN_FLOAT8((double)
1307 pgstat_fetch_stat_checkpointer()->sync_time);
1308}
1309
1310Datum
1312{
1314}
1315
1316Datum
1318{
1319 PG_RETURN_TIMESTAMPTZ(pgstat_fetch_stat_bgwriter()->stat_reset_timestamp);
1320}
1321
1322Datum
1324{
1326}
1327
1328/*
1329* When adding a new column to the pg_stat_io view and the
1330* pg_stat_get_backend_io() function, add a new enum value here above
1331* IO_NUM_COLUMNS.
1332*/
1333typedef enum io_stat_col
1334{
1358
1359/*
1360 * When adding a new IOOp, add a new io_stat_col and add a case to this
1361 * function returning the corresponding io_stat_col.
1362 */
1363static io_stat_col
1365{
1366 switch (io_op)
1367 {
1368 case IOOP_EVICT:
1369 return IO_COL_EVICTIONS;
1370 case IOOP_EXTEND:
1371 return IO_COL_EXTENDS;
1372 case IOOP_FSYNC:
1373 return IO_COL_FSYNCS;
1374 case IOOP_HIT:
1375 return IO_COL_HITS;
1376 case IOOP_READ:
1377 return IO_COL_READS;
1378 case IOOP_REUSE:
1379 return IO_COL_REUSES;
1380 case IOOP_WRITE:
1381 return IO_COL_WRITES;
1382 case IOOP_WRITEBACK:
1383 return IO_COL_WRITEBACKS;
1384 }
1385
1386 elog(ERROR, "unrecognized IOOp value: %d", io_op);
1388}
1389
1390/*
1391 * Get the number of the column containing IO bytes for the specified IOOp.
1392 * If an IOOp is not tracked in bytes, IO_COL_INVALID is returned.
1393 */
1394static io_stat_col
1396{
1397 switch (io_op)
1398 {
1399 case IOOP_EXTEND:
1400 return IO_COL_EXTEND_BYTES;
1401 case IOOP_READ:
1402 return IO_COL_READ_BYTES;
1403 case IOOP_WRITE:
1404 return IO_COL_WRITE_BYTES;
1405 case IOOP_EVICT:
1406 case IOOP_FSYNC:
1407 case IOOP_HIT:
1408 case IOOP_REUSE:
1409 case IOOP_WRITEBACK:
1410 return IO_COL_INVALID;
1411 }
1412
1413 elog(ERROR, "unrecognized IOOp value: %d", io_op);
1415}
1416
1417/*
1418 * Get the number of the column containing IO times for the specified IOOp.
1419 * If an op has no associated time, IO_COL_INVALID is returned.
1420 */
1421static io_stat_col
1423{
1424 switch (io_op)
1425 {
1426 case IOOP_READ:
1427 return IO_COL_READ_TIME;
1428 case IOOP_WRITE:
1429 return IO_COL_WRITE_TIME;
1430 case IOOP_WRITEBACK:
1431 return IO_COL_WRITEBACK_TIME;
1432 case IOOP_EXTEND:
1433 return IO_COL_EXTEND_TIME;
1434 case IOOP_FSYNC:
1435 return IO_COL_FSYNC_TIME;
1436 case IOOP_EVICT:
1437 case IOOP_HIT:
1438 case IOOP_REUSE:
1439 return IO_COL_INVALID;
1440 }
1441
1442 elog(ERROR, "unrecognized IOOp value: %d", io_op);
1444}
1445
1446static inline double
1448{
1449 return val_ms * (double) 0.001;
1450}
1451
1452/*
1453 * pg_stat_io_build_tuples
1454 *
1455 * Helper routine for pg_stat_get_io() and pg_stat_get_backend_io()
1456 * filling a result tuplestore with one tuple for each object and each
1457 * context supported by the caller, based on the contents of bktype_stats.
1458 */
1459static void
1461 PgStat_BktypeIO *bktype_stats,
1462 BackendType bktype,
1463 TimestampTz stat_reset_timestamp)
1464{
1465 Datum bktype_desc = CStringGetTextDatum(GetBackendTypeDesc(bktype));
1466
1467 for (int io_obj = 0; io_obj < IOOBJECT_NUM_TYPES; io_obj++)
1468 {
1469 const char *obj_name = pgstat_get_io_object_name(io_obj);
1470
1471 for (int io_context = 0; io_context < IOCONTEXT_NUM_TYPES; io_context++)
1472 {
1473 const char *context_name = pgstat_get_io_context_name(io_context);
1474
1476 bool nulls[IO_NUM_COLUMNS] = {0};
1477
1478 /*
1479 * Some combinations of BackendType, IOObject, and IOContext are
1480 * not valid for any type of IOOp. In such cases, omit the entire
1481 * row from the view.
1482 */
1483 if (!pgstat_tracks_io_object(bktype, io_obj, io_context))
1484 continue;
1485
1486 values[IO_COL_BACKEND_TYPE] = bktype_desc;
1487 values[IO_COL_CONTEXT] = CStringGetTextDatum(context_name);
1489 if (stat_reset_timestamp != 0)
1490 values[IO_COL_RESET_TIME] = TimestampTzGetDatum(stat_reset_timestamp);
1491 else
1492 nulls[IO_COL_RESET_TIME] = true;
1493
1494 for (int io_op = 0; io_op < IOOP_NUM_TYPES; io_op++)
1495 {
1496 int op_idx = pgstat_get_io_op_index(io_op);
1497 int time_idx = pgstat_get_io_time_index(io_op);
1498 int byte_idx = pgstat_get_io_byte_index(io_op);
1499
1500 /*
1501 * Some combinations of BackendType and IOOp, of IOContext and
1502 * IOOp, and of IOObject and IOOp are not tracked. Set these
1503 * cells in the view NULL.
1504 */
1505 if (pgstat_tracks_io_op(bktype, io_obj, io_context, io_op))
1506 {
1507 PgStat_Counter count =
1508 bktype_stats->counts[io_obj][io_context][io_op];
1509
1510 values[op_idx] = Int64GetDatum(count);
1511 }
1512 else
1513 nulls[op_idx] = true;
1514
1515 if (!nulls[op_idx])
1516 {
1517 /* not every operation is timed */
1518 if (time_idx != IO_COL_INVALID)
1519 {
1520 PgStat_Counter time =
1521 bktype_stats->times[io_obj][io_context][io_op];
1522
1523 values[time_idx] = Float8GetDatum(pg_stat_us_to_ms(time));
1524 }
1525
1526 /* not every IO is tracked in bytes */
1527 if (byte_idx != IO_COL_INVALID)
1528 {
1529 char buf[256];
1530 PgStat_Counter byte =
1531 bktype_stats->bytes[io_obj][io_context][io_op];
1532
1533 /* Convert to numeric */
1534 snprintf(buf, sizeof buf, INT64_FORMAT, byte);
1538 Int32GetDatum(-1));
1539 }
1540 }
1541 else
1542 {
1543 if (time_idx != IO_COL_INVALID)
1544 nulls[time_idx] = true;
1545 if (byte_idx != IO_COL_INVALID)
1546 nulls[byte_idx] = true;
1547 }
1548 }
1549
1550 tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc,
1551 values, nulls);
1552 }
1553 }
1554}
1555
1556Datum
1558{
1559 ReturnSetInfo *rsinfo;
1560 PgStat_IO *backends_io_stats;
1561
1562 InitMaterializedSRF(fcinfo, 0);
1563 rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
1564
1565 backends_io_stats = pgstat_fetch_stat_io();
1566
1567 for (int bktype = 0; bktype < BACKEND_NUM_TYPES; bktype++)
1568 {
1569 PgStat_BktypeIO *bktype_stats = &backends_io_stats->stats[bktype];
1570
1571 /*
1572 * In Assert builds, we can afford an extra loop through all of the
1573 * counters (in pg_stat_io_build_tuples()), checking that only
1574 * expected stats are non-zero, since it keeps the non-Assert code
1575 * cleaner.
1576 */
1577 Assert(pgstat_bktype_io_stats_valid(bktype_stats, bktype));
1578
1579 /*
1580 * For those BackendTypes without IO Operation stats, skip
1581 * representing them in the view altogether.
1582 */
1583 if (!pgstat_tracks_io_bktype(bktype))
1584 continue;
1585
1586 /* save tuples with data from this PgStat_BktypeIO */
1587 pg_stat_io_build_tuples(rsinfo, bktype_stats, bktype,
1588 backends_io_stats->stat_reset_timestamp);
1589 }
1590
1591 return (Datum) 0;
1592}
1593
1594/*
1595 * Returns I/O statistics for a backend with given PID.
1596 */
1597Datum
1599{
1600 ReturnSetInfo *rsinfo;
1601 BackendType bktype;
1602 int pid;
1603 PgStat_Backend *backend_stats;
1604 PgStat_BktypeIO *bktype_stats;
1605
1606 InitMaterializedSRF(fcinfo, 0);
1607 rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
1608
1609 pid = PG_GETARG_INT32(0);
1610 backend_stats = pgstat_fetch_stat_backend_by_pid(pid, &bktype);
1611
1612 if (!backend_stats)
1613 return (Datum) 0;
1614
1615 bktype_stats = &backend_stats->io_stats;
1616
1617 /*
1618 * In Assert builds, we can afford an extra loop through all of the
1619 * counters (in pg_stat_io_build_tuples()), checking that only expected
1620 * stats are non-zero, since it keeps the non-Assert code cleaner.
1621 */
1622 Assert(pgstat_bktype_io_stats_valid(bktype_stats, bktype));
1623
1624 /* save tuples with data from this PgStat_BktypeIO */
1625 pg_stat_io_build_tuples(rsinfo, bktype_stats, bktype,
1626 backend_stats->stat_reset_timestamp);
1627 return (Datum) 0;
1628}
1629
1630/*
1631 * pg_stat_wal_build_tuple
1632 *
1633 * Helper routine for pg_stat_get_wal() and pg_stat_get_backend_wal()
1634 * returning one tuple based on the contents of wal_counters.
1635 */
1636static Datum
1638 TimestampTz stat_reset_timestamp)
1639{
1640#define PG_STAT_WAL_COLS 6
1641 TupleDesc tupdesc;
1643 bool nulls[PG_STAT_WAL_COLS] = {0};
1644 char buf[256];
1645
1646 /* Initialise attributes information in the tuple descriptor */
1648 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "wal_records",
1649 INT8OID, -1, 0);
1650 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "wal_fpi",
1651 INT8OID, -1, 0);
1652 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "wal_bytes",
1653 NUMERICOID, -1, 0);
1654 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "wal_fpi_bytes",
1655 NUMERICOID, -1, 0);
1656 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "wal_buffers_full",
1657 INT8OID, -1, 0);
1658 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "stats_reset",
1659 TIMESTAMPTZOID, -1, 0);
1660
1661 BlessTupleDesc(tupdesc);
1662
1663 /* Fill values and NULLs */
1664 values[0] = Int64GetDatum(wal_counters.wal_records);
1665 values[1] = Int64GetDatum(wal_counters.wal_fpi);
1666
1667 /* Convert to numeric. */
1668 snprintf(buf, sizeof buf, UINT64_FORMAT, wal_counters.wal_bytes);
1672 Int32GetDatum(-1));
1673
1674 snprintf(buf, sizeof buf, UINT64_FORMAT, wal_counters.wal_fpi_bytes);
1678 Int32GetDatum(-1));
1679
1680 values[4] = Int64GetDatum(wal_counters.wal_buffers_full);
1681
1682 if (stat_reset_timestamp != 0)
1683 values[5] = TimestampTzGetDatum(stat_reset_timestamp);
1684 else
1685 nulls[5] = true;
1686
1687 /* Returns the record as Datum */
1689}
1690
1691/*
1692 * Returns WAL statistics for a backend with given PID.
1693 */
1694Datum
1696{
1697 int pid;
1698 PgStat_Backend *backend_stats;
1699 PgStat_WalCounters bktype_stats;
1700
1701 pid = PG_GETARG_INT32(0);
1702 backend_stats = pgstat_fetch_stat_backend_by_pid(pid, NULL);
1703
1704 if (!backend_stats)
1706
1707 bktype_stats = backend_stats->wal_counters;
1708
1709 /* save tuples with data from this PgStat_WalCounters */
1710 return (pg_stat_wal_build_tuple(bktype_stats, backend_stats->stat_reset_timestamp));
1711}
1712
1713/*
1714 * Returns statistics of WAL activity
1715 */
1716Datum
1718{
1719 PgStat_WalStats *wal_stats;
1720
1721 /* Get statistics about WAL activity */
1722 wal_stats = pgstat_fetch_stat_wal();
1723
1724 return (pg_stat_wal_build_tuple(wal_stats->wal_counters,
1725 wal_stats->stat_reset_timestamp));
1726}
1727
1728/*
1729 * Returns statistics of SLRU caches.
1730 */
1731Datum
1733{
1734#define PG_STAT_GET_SLRU_COLS 9
1735 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
1736 int i;
1737 PgStat_SLRUStats *stats;
1738
1739 InitMaterializedSRF(fcinfo, 0);
1740
1741 /* request SLRU stats from the cumulative stats system */
1742 stats = pgstat_fetch_slru();
1743
1744 for (i = 0;; i++)
1745 {
1746 /* for each row */
1748 bool nulls[PG_STAT_GET_SLRU_COLS] = {0};
1750 const char *name;
1751
1753
1754 if (!name)
1755 break;
1756
1757 stat = stats[i];
1758
1760 values[1] = Int64GetDatum(stat.blocks_zeroed);
1761 values[2] = Int64GetDatum(stat.blocks_hit);
1762 values[3] = Int64GetDatum(stat.blocks_read);
1763 values[4] = Int64GetDatum(stat.blocks_written);
1764 values[5] = Int64GetDatum(stat.blocks_exists);
1765 values[6] = Int64GetDatum(stat.flush);
1766 values[7] = Int64GetDatum(stat.truncate);
1767 values[8] = TimestampTzGetDatum(stat.stat_reset_timestamp);
1768
1769 tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
1770 }
1771
1772 return (Datum) 0;
1773}
1774
1775#define PG_STAT_GET_XACT_RELENTRY_INT64(stat) \
1776Datum \
1777CppConcat(pg_stat_get_xact_,stat)(PG_FUNCTION_ARGS) \
1778{ \
1779 Oid relid = PG_GETARG_OID(0); \
1780 int64 result; \
1781 PgStat_TableStatus *tabentry; \
1782 \
1783 if ((tabentry = find_tabstat_entry(relid)) == NULL) \
1784 result = 0; \
1785 else \
1786 result = (int64) (tabentry->counts.stat); \
1787 \
1788 PG_RETURN_INT64(result); \
1789}
1790
1791/* pg_stat_get_xact_numscans */
1793
1794/* pg_stat_get_xact_tuples_returned */
1795PG_STAT_GET_XACT_RELENTRY_INT64(tuples_returned)
1796
1797/* pg_stat_get_xact_tuples_fetched */
1798PG_STAT_GET_XACT_RELENTRY_INT64(tuples_fetched)
1799
1800/* pg_stat_get_xact_tuples_hot_updated */
1801PG_STAT_GET_XACT_RELENTRY_INT64(tuples_hot_updated)
1802
1803/* pg_stat_get_xact_tuples_newpage_updated */
1804PG_STAT_GET_XACT_RELENTRY_INT64(tuples_newpage_updated)
1805
1806/* pg_stat_get_xact_blocks_fetched */
1807PG_STAT_GET_XACT_RELENTRY_INT64(blocks_fetched)
1808
1809/* pg_stat_get_xact_blocks_hit */
1811
1812/* pg_stat_get_xact_tuples_inserted */
1813PG_STAT_GET_XACT_RELENTRY_INT64(tuples_inserted)
1814
1815/* pg_stat_get_xact_tuples_updated */
1816PG_STAT_GET_XACT_RELENTRY_INT64(tuples_updated)
1817
1818/* pg_stat_get_xact_tuples_deleted */
1819PG_STAT_GET_XACT_RELENTRY_INT64(tuples_deleted)
1820
1821Datum
1823{
1824 Oid funcid = PG_GETARG_OID(0);
1825 PgStat_FunctionCounts *funcentry;
1826
1827 if ((funcentry = find_funcstat_entry(funcid)) == NULL)
1829 PG_RETURN_INT64(funcentry->numcalls);
1830}
1831
1832#define PG_STAT_GET_XACT_FUNCENTRY_FLOAT8_MS(stat) \
1833Datum \
1834CppConcat(pg_stat_get_xact_function_,stat)(PG_FUNCTION_ARGS) \
1835{ \
1836 Oid funcid = PG_GETARG_OID(0); \
1837 PgStat_FunctionCounts *funcentry; \
1838 \
1839 if ((funcentry = find_funcstat_entry(funcid)) == NULL) \
1840 PG_RETURN_NULL(); \
1841 PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->stat)); \
1842}
1843
1844/* pg_stat_get_xact_function_total_time */
1846
1847/* pg_stat_get_xact_function_self_time */
1849
1850/* Get the timestamp of the current statistics snapshot */
1851Datum
1853{
1854 bool have_snapshot;
1855 TimestampTz ts;
1856
1857 ts = pgstat_get_stat_snapshot_timestamp(&have_snapshot);
1858
1859 if (!have_snapshot)
1861
1863}
1864
1865/* Discard the active statistics snapshot */
1866Datum
1868{
1870
1872}
1873
1874
1875/* Force statistics to be reported at the next occasion */
1876Datum
1878{
1880
1882}
1883
1884
1885/* Reset all counters for the current database */
1886Datum
1888{
1890
1892}
1893
1894/*
1895 * Reset some shared cluster-wide counters
1896 *
1897 * When adding a new reset target, ideally the name should match that in
1898 * pgstat_kind_builtin_infos, if relevant.
1899 */
1900Datum
1902{
1903 char *target = NULL;
1904
1905 if (PG_ARGISNULL(0))
1906 {
1907 /* Reset all the statistics when nothing is specified */
1915
1917 }
1918
1920
1921 if (strcmp(target, "archiver") == 0)
1923 else if (strcmp(target, "bgwriter") == 0)
1925 else if (strcmp(target, "checkpointer") == 0)
1927 else if (strcmp(target, "io") == 0)
1929 else if (strcmp(target, "recovery_prefetch") == 0)
1931 else if (strcmp(target, "slru") == 0)
1933 else if (strcmp(target, "wal") == 0)
1935 else
1936 ereport(ERROR,
1937 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1938 errmsg("unrecognized reset target: \"%s\"", target),
1939 errhint("Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\".")));
1940
1942}
1943
1944/*
1945 * Reset a statistics for a single object, which may be of current
1946 * database or shared across all databases in the cluster.
1947 */
1948Datum
1950{
1951 Oid taboid = PG_GETARG_OID(0);
1952 Oid dboid = (IsSharedRelation(taboid) ? InvalidOid : MyDatabaseId);
1953
1954 pgstat_reset(PGSTAT_KIND_RELATION, dboid, taboid);
1955
1957}
1958
1959Datum
1961{
1962 Oid funcoid = PG_GETARG_OID(0);
1963
1965
1967}
1968
1969/*
1970 * Reset statistics of backend with given PID.
1971 */
1972Datum
1974{
1975 PGPROC *proc;
1976 PgBackendStatus *beentry;
1977 ProcNumber procNumber;
1978 int backend_pid = PG_GETARG_INT32(0);
1979
1980 proc = BackendPidGetProc(backend_pid);
1981
1982 /* This could be an auxiliary process */
1983 if (!proc)
1984 proc = AuxiliaryPidGetProc(backend_pid);
1985
1986 if (!proc)
1988
1989 procNumber = GetNumberFromPGProc(proc);
1990
1991 beentry = pgstat_get_beentry_by_proc_number(procNumber);
1992 if (!beentry)
1994
1995 /* Check if the backend type tracks statistics */
1998
2000
2002}
2003
2004/* Reset SLRU counters (a specific one or all of them). */
2005Datum
2007{
2008 char *target = NULL;
2009
2010 if (PG_ARGISNULL(0))
2012 else
2013 {
2015 pgstat_reset_slru(target);
2016 }
2017
2019}
2020
2021/* Reset replication slots stats (a specific one or all of them). */
2022Datum
2024{
2025 char *target = NULL;
2026
2027 if (PG_ARGISNULL(0))
2029 else
2030 {
2032 pgstat_reset_replslot(target);
2033 }
2034
2036}
2037
2038/* Reset subscription stats (a specific one or all of them) */
2039Datum
2041{
2042 Oid subid;
2043
2044 if (PG_ARGISNULL(0))
2045 {
2046 /* Clear all subscription stats */
2048 }
2049 else
2050 {
2051 subid = PG_GETARG_OID(0);
2052
2053 if (!OidIsValid(subid))
2054 ereport(ERROR,
2055 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2056 errmsg("invalid subscription OID %u", subid)));
2058 }
2059
2061}
2062
2063Datum
2065{
2066 TupleDesc tupdesc;
2067 Datum values[7] = {0};
2068 bool nulls[7] = {0};
2069 PgStat_ArchiverStats *archiver_stats;
2070
2071 /* Initialise attributes information in the tuple descriptor */
2072 tupdesc = CreateTemplateTupleDesc(7);
2073 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "archived_count",
2074 INT8OID, -1, 0);
2075 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "last_archived_wal",
2076 TEXTOID, -1, 0);
2077 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "last_archived_time",
2078 TIMESTAMPTZOID, -1, 0);
2079 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "failed_count",
2080 INT8OID, -1, 0);
2081 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "last_failed_wal",
2082 TEXTOID, -1, 0);
2083 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "last_failed_time",
2084 TIMESTAMPTZOID, -1, 0);
2085 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "stats_reset",
2086 TIMESTAMPTZOID, -1, 0);
2087
2088 BlessTupleDesc(tupdesc);
2089
2090 /* Get statistics about the archiver process */
2091 archiver_stats = pgstat_fetch_stat_archiver();
2092
2093 /* Fill values and NULLs */
2094 values[0] = Int64GetDatum(archiver_stats->archived_count);
2095 if (*(archiver_stats->last_archived_wal) == '\0')
2096 nulls[1] = true;
2097 else
2098 values[1] = CStringGetTextDatum(archiver_stats->last_archived_wal);
2099
2100 if (archiver_stats->last_archived_timestamp == 0)
2101 nulls[2] = true;
2102 else
2104
2105 values[3] = Int64GetDatum(archiver_stats->failed_count);
2106 if (*(archiver_stats->last_failed_wal) == '\0')
2107 nulls[4] = true;
2108 else
2109 values[4] = CStringGetTextDatum(archiver_stats->last_failed_wal);
2110
2111 if (archiver_stats->last_failed_timestamp == 0)
2112 nulls[5] = true;
2113 else
2114 values[5] = TimestampTzGetDatum(archiver_stats->last_failed_timestamp);
2115
2116 if (archiver_stats->stat_reset_timestamp == 0)
2117 nulls[6] = true;
2118 else
2119 values[6] = TimestampTzGetDatum(archiver_stats->stat_reset_timestamp);
2120
2121 /* Returns the record as Datum */
2123}
2124
2125/*
2126 * Get the statistics for the replication slot. If the slot statistics is not
2127 * available, return all-zeroes stats.
2128 */
2129Datum
2131{
2132#define PG_STAT_GET_REPLICATION_SLOT_COLS 11
2133 text *slotname_text = PG_GETARG_TEXT_P(0);
2134 NameData slotname;
2135 TupleDesc tupdesc;
2137 bool nulls[PG_STAT_GET_REPLICATION_SLOT_COLS] = {0};
2138 PgStat_StatReplSlotEntry *slotent;
2140
2141 /* Initialise attributes information in the tuple descriptor */
2143 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "slot_name",
2144 TEXTOID, -1, 0);
2145 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "spill_txns",
2146 INT8OID, -1, 0);
2147 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "spill_count",
2148 INT8OID, -1, 0);
2149 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "spill_bytes",
2150 INT8OID, -1, 0);
2151 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "stream_txns",
2152 INT8OID, -1, 0);
2153 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "stream_count",
2154 INT8OID, -1, 0);
2155 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "stream_bytes",
2156 INT8OID, -1, 0);
2157 TupleDescInitEntry(tupdesc, (AttrNumber) 8, "mem_exceeded_count",
2158 INT8OID, -1, 0);
2159 TupleDescInitEntry(tupdesc, (AttrNumber) 9, "total_txns",
2160 INT8OID, -1, 0);
2161 TupleDescInitEntry(tupdesc, (AttrNumber) 10, "total_bytes",
2162 INT8OID, -1, 0);
2163 TupleDescInitEntry(tupdesc, (AttrNumber) 11, "stats_reset",
2164 TIMESTAMPTZOID, -1, 0);
2165 BlessTupleDesc(tupdesc);
2166
2167 namestrcpy(&slotname, text_to_cstring(slotname_text));
2168 slotent = pgstat_fetch_replslot(slotname);
2169 if (!slotent)
2170 {
2171 /*
2172 * If the slot is not found, initialise its stats. This is possible if
2173 * the create slot message is lost.
2174 */
2175 memset(&allzero, 0, sizeof(PgStat_StatReplSlotEntry));
2176 slotent = &allzero;
2177 }
2178
2179 values[0] = CStringGetTextDatum(NameStr(slotname));
2180 values[1] = Int64GetDatum(slotent->spill_txns);
2181 values[2] = Int64GetDatum(slotent->spill_count);
2182 values[3] = Int64GetDatum(slotent->spill_bytes);
2183 values[4] = Int64GetDatum(slotent->stream_txns);
2184 values[5] = Int64GetDatum(slotent->stream_count);
2185 values[6] = Int64GetDatum(slotent->stream_bytes);
2187 values[8] = Int64GetDatum(slotent->total_txns);
2188 values[9] = Int64GetDatum(slotent->total_bytes);
2189
2190 if (slotent->stat_reset_timestamp == 0)
2191 nulls[10] = true;
2192 else
2194
2195 /* Returns the record as Datum */
2197}
2198
2199/*
2200 * Get the subscription statistics for the given subscription. If the
2201 * subscription statistics is not available, return all-zeros stats.
2202 */
2203Datum
2205{
2206#define PG_STAT_GET_SUBSCRIPTION_STATS_COLS 13
2207 Oid subid = PG_GETARG_OID(0);
2208 TupleDesc tupdesc;
2210 bool nulls[PG_STAT_GET_SUBSCRIPTION_STATS_COLS] = {0};
2211 PgStat_StatSubEntry *subentry;
2212 PgStat_StatSubEntry allzero;
2213 int i = 0;
2214
2215 /* Get subscription stats */
2216 subentry = pgstat_fetch_stat_subscription(subid);
2217
2218 /* Initialise attributes information in the tuple descriptor */
2220 TupleDescInitEntry(tupdesc, (AttrNumber) 1, "subid",
2221 OIDOID, -1, 0);
2222 TupleDescInitEntry(tupdesc, (AttrNumber) 2, "apply_error_count",
2223 INT8OID, -1, 0);
2224 TupleDescInitEntry(tupdesc, (AttrNumber) 3, "sync_seq_error_count",
2225 INT8OID, -1, 0);
2226 TupleDescInitEntry(tupdesc, (AttrNumber) 4, "sync_table_error_count",
2227 INT8OID, -1, 0);
2228 TupleDescInitEntry(tupdesc, (AttrNumber) 5, "confl_insert_exists",
2229 INT8OID, -1, 0);
2230 TupleDescInitEntry(tupdesc, (AttrNumber) 6, "confl_update_origin_differs",
2231 INT8OID, -1, 0);
2232 TupleDescInitEntry(tupdesc, (AttrNumber) 7, "confl_update_exists",
2233 INT8OID, -1, 0);
2234 TupleDescInitEntry(tupdesc, (AttrNumber) 8, "confl_update_deleted",
2235 INT8OID, -1, 0);
2236 TupleDescInitEntry(tupdesc, (AttrNumber) 9, "confl_update_missing",
2237 INT8OID, -1, 0);
2238 TupleDescInitEntry(tupdesc, (AttrNumber) 10, "confl_delete_origin_differs",
2239 INT8OID, -1, 0);
2240 TupleDescInitEntry(tupdesc, (AttrNumber) 11, "confl_delete_missing",
2241 INT8OID, -1, 0);
2242 TupleDescInitEntry(tupdesc, (AttrNumber) 12, "confl_multiple_unique_conflicts",
2243 INT8OID, -1, 0);
2244 TupleDescInitEntry(tupdesc, (AttrNumber) 13, "stats_reset",
2245 TIMESTAMPTZOID, -1, 0);
2246 BlessTupleDesc(tupdesc);
2247
2248 if (!subentry)
2249 {
2250 /* If the subscription is not found, initialise its stats */
2251 memset(&allzero, 0, sizeof(PgStat_StatSubEntry));
2252 subentry = &allzero;
2253 }
2254
2255 /* subid */
2256 values[i++] = ObjectIdGetDatum(subid);
2257
2258 /* apply_error_count */
2259 values[i++] = Int64GetDatum(subentry->apply_error_count);
2260
2261 /* sync_seq_error_count */
2263
2264 /* sync_table_error_count */
2266
2267 /* conflict count */
2268 for (int nconflict = 0; nconflict < CONFLICT_NUM_TYPES; nconflict++)
2269 values[i++] = Int64GetDatum(subentry->conflict_count[nconflict]);
2270
2271 /* stats_reset */
2272 if (subentry->stat_reset_timestamp == 0)
2273 nulls[i] = true;
2274 else
2276
2278
2279 /* Returns the record as Datum */
2281}
2282
2283/*
2284 * Checks for presence of stats for object with provided kind, database oid,
2285 * object oid.
2286 *
2287 * This is useful for tests, but not really anything else. Therefore not
2288 * documented.
2289 */
2290Datum
2292{
2293 char *stats_type = text_to_cstring(PG_GETARG_TEXT_P(0));
2294 Oid dboid = PG_GETARG_OID(1);
2295 uint64 objid = PG_GETARG_INT64(2);
2296 PgStat_Kind kind = pgstat_get_kind_from_str(stats_type);
2297
2298 PG_RETURN_BOOL(pgstat_have_entry(kind, dboid, objid));
2299}
Datum idx(PG_FUNCTION_ARGS)
Definition: _int_op.c:262
int16 AttrNumber
Definition: attnum.h:21
Datum numeric_in(PG_FUNCTION_ARGS)
Definition: numeric.c:626
#define PGSTAT_NUM_PROGRESS_PARAM
ProgressCommandType
@ PROGRESS_COMMAND_ANALYZE
@ PROGRESS_COMMAND_CLUSTER
@ PROGRESS_COMMAND_CREATE_INDEX
@ PROGRESS_COMMAND_VACUUM
@ PROGRESS_COMMAND_BASEBACKUP
@ PROGRESS_COMMAND_COPY
int pgstat_fetch_stat_numbackends(void)
LocalPgBackendStatus * pgstat_get_local_beentry_by_proc_number(ProcNumber procNumber)
char * pgstat_clip_activity(const char *raw_activity)
LocalPgBackendStatus * pgstat_get_local_beentry_by_index(int idx)
PgBackendStatus * pgstat_get_beentry_by_proc_number(ProcNumber procNumber)
@ STATE_UNDEFINED
@ STATE_IDLEINTRANSACTION_ABORTED
@ STATE_STARTING
@ STATE_IDLE
@ STATE_IDLEINTRANSACTION
@ STATE_DISABLED
@ STATE_FASTPATH
@ STATE_RUNNING
const char * GetBackgroundWorkerTypeByPid(pid_t pid)
Definition: bgworker.c:1375
static Datum values[MAXATTR]
Definition: bootstrap.c:153
#define CStringGetTextDatum(s)
Definition: builtins.h:97
#define NameStr(name)
Definition: c.h:756
#define INT64CONST(x)
Definition: c.h:557
#define INT64_FORMAT
Definition: c.h:561
int64_t int64
Definition: c.h:540
#define UINT64_FORMAT
Definition: c.h:562
int32_t int32
Definition: c.h:539
uint64_t uint64
Definition: c.h:544
#define pg_unreachable()
Definition: c.h:336
uint32_t uint32
Definition: c.h:543
#define OidIsValid(objectId)
Definition: c.h:779
bool IsSharedRelation(Oid relationId)
Definition: catalog.c:304
#define CONFLICT_NUM_TYPES
Definition: conflict.h:64
int64 TimestampTz
Definition: timestamp.h:39
int errhint(const char *fmt,...)
Definition: elog.c:1330
int errcode(int sqlerrcode)
Definition: elog.c:863
int errmsg(const char *fmt,...)
Definition: elog.c:1080
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
#define ereport(elevel,...)
Definition: elog.h:150
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
Definition: execTuples.c:2260
#define PG_RETURN_VOID()
Definition: fmgr.h:349
#define PG_GETARG_OID(n)
Definition: fmgr.h:275
#define PG_GETARG_TEXT_PP(n)
Definition: fmgr.h:309
#define PG_RETURN_FLOAT8(x)
Definition: fmgr.h:367
#define PG_ARGISNULL(n)
Definition: fmgr.h:209
#define PG_RETURN_INT64(x)
Definition: fmgr.h:368
#define DirectFunctionCall1(func, arg1)
Definition: fmgr.h:682
#define PG_RETURN_NULL()
Definition: fmgr.h:345
#define PG_GETARG_INT64(n)
Definition: fmgr.h:283
#define PG_RETURN_TEXT_P(x)
Definition: fmgr.h:372
#define PG_RETURN_INT32(x)
Definition: fmgr.h:354
#define PG_GETARG_INT32(n)
Definition: fmgr.h:269
#define PG_RETURN_DATUM(x)
Definition: fmgr.h:353
#define DirectFunctionCall3(func, arg1, arg2, arg3)
Definition: fmgr.h:686
#define PG_RETURN_OID(x)
Definition: fmgr.h:360
#define PG_FUNCTION_ARGS
Definition: fmgr.h:193
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:359
#define PG_GETARG_TEXT_P(n)
Definition: fmgr.h:336
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
Definition: funcapi.c:76
#define SRF_IS_FIRSTCALL()
Definition: funcapi.h:304
#define SRF_PERCALL_SETUP()
Definition: funcapi.h:308
#define SRF_RETURN_NEXT(_funcctx, _result)
Definition: funcapi.h:310
#define SRF_FIRSTCALL_INIT()
Definition: funcapi.h:306
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
Definition: funcapi.h:230
#define SRF_RETURN_DONE(_funcctx)
Definition: funcapi.h:328
int MyProcPid
Definition: globals.c:47
Oid MyDatabaseId
Definition: globals.c:94
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition: heaptuple.c:1117
Datum int4in(PG_FUNCTION_ARGS)
Definition: int.c:287
int pg_getnameinfo_all(const struct sockaddr_storage *addr, int salen, char *node, int nodelen, char *service, int servicelen, int flags)
Definition: ip.c:117
int i
Definition: isn.c:77
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:81
pid_t GetLeaderApplyWorkerPid(pid_t pid)
Definition: launcher.c:1595
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:1229
void pfree(void *pointer)
Definition: mcxt.c:1594
static bool pg_memory_is_all_zeros(const void *ptr, size_t len)
Definition: memutils.h:219
#define BACKEND_NUM_TYPES
Definition: miscadmin.h:377
BackendType
Definition: miscadmin.h:338
@ B_WAL_SENDER
Definition: miscadmin.h:347
@ B_BG_WORKER
Definition: miscadmin.h:346
@ B_BACKEND
Definition: miscadmin.h:342
#define InvalidPid
Definition: miscadmin.h:32
const char * GetBackendTypeDesc(BackendType backendType)
Definition: miscinit.c:263
void namestrcpy(Name name, const char *str)
Definition: name.c:233
void clean_ipv6_addr(int addr_family, char *addr)
Definition: network.c:2028
Datum inet_in(PG_FUNCTION_ARGS)
Definition: network.c:119
static char * buf
Definition: pg_test_fsync.c:72
void pgstat_reset(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat.c:854
void pgstat_reset_counters(void)
Definition: pgstat.c:835
void pgstat_reset_of_kind(PgStat_Kind kind)
Definition: pgstat.c:876
void pgstat_force_next_flush(void)
Definition: pgstat.c:814
void pgstat_clear_snapshot(void)
Definition: pgstat.c:902
TimestampTz pgstat_get_stat_snapshot_timestamp(bool *have_snapshot)
Definition: pgstat.c:1027
bool pgstat_have_entry(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat.c:1044
PgStat_Kind pgstat_get_kind_from_str(char *kind_str)
Definition: pgstat.c:1401
#define IOOP_NUM_TYPES
Definition: pgstat.h:319
#define IOCONTEXT_NUM_TYPES
Definition: pgstat.h:293
IOOp
Definition: pgstat.h:305
@ IOOP_EXTEND
Definition: pgstat.h:314
@ IOOP_FSYNC
Definition: pgstat.h:308
@ IOOP_READ
Definition: pgstat.h:315
@ IOOP_WRITEBACK
Definition: pgstat.h:311
@ IOOP_HIT
Definition: pgstat.h:309
@ IOOP_EVICT
Definition: pgstat.h:307
@ IOOP_REUSE
Definition: pgstat.h:310
@ IOOP_WRITE
Definition: pgstat.h:316
int64 PgStat_Counter
Definition: pgstat.h:67
#define IOOBJECT_NUM_TYPES
Definition: pgstat.h:282
PgStat_ArchiverStats * pgstat_fetch_stat_archiver(void)
bool pgstat_tracks_backend_bktype(BackendType bktype)
PgStat_Backend * pgstat_fetch_stat_backend_by_pid(int pid, BackendType *bktype)
PgStat_BgWriterStats * pgstat_fetch_stat_bgwriter(void)
PgStat_CheckpointerStats * pgstat_fetch_stat_checkpointer(void)
PgStat_StatDBEntry * pgstat_fetch_stat_dbentry(Oid dboid)
PgStat_StatFuncEntry * pgstat_fetch_stat_funcentry(Oid func_id)
PgStat_FunctionCounts * find_funcstat_entry(Oid func_id)
PgStat_IO * pgstat_fetch_stat_io(void)
Definition: pgstat_io.c:164
const char * pgstat_get_io_context_name(IOContext io_context)
Definition: pgstat_io.c:240
bool pgstat_tracks_io_bktype(BackendType bktype)
Definition: pgstat_io.c:351
const char * pgstat_get_io_object_name(IOObject io_object)
Definition: pgstat_io.c:261
bool pgstat_bktype_io_stats_valid(PgStat_BktypeIO *backend_io, BackendType bktype)
Definition: pgstat_io.c:37
bool pgstat_tracks_io_op(BackendType bktype, IOObject io_object, IOContext io_context, IOOp io_op)
Definition: pgstat_io.c:477
bool pgstat_tracks_io_object(BackendType bktype, IOObject io_object, IOContext io_context)
Definition: pgstat_io.c:393
#define PGSTAT_KIND_ARCHIVER
Definition: pgstat_kind.h:35
#define PGSTAT_KIND_WAL
Definition: pgstat_kind.h:40
#define PgStat_Kind
Definition: pgstat_kind.h:17
#define PGSTAT_KIND_BGWRITER
Definition: pgstat_kind.h:36
#define PGSTAT_KIND_REPLSLOT
Definition: pgstat_kind.h:30
#define PGSTAT_KIND_FUNCTION
Definition: pgstat_kind.h:29
#define PGSTAT_KIND_SLRU
Definition: pgstat_kind.h:39
#define PGSTAT_KIND_RELATION
Definition: pgstat_kind.h:28
#define PGSTAT_KIND_CHECKPOINTER
Definition: pgstat_kind.h:37
#define PGSTAT_KIND_IO
Definition: pgstat_kind.h:38
#define PGSTAT_KIND_SUBSCRIPTION
Definition: pgstat_kind.h:31
#define PGSTAT_KIND_BACKEND
Definition: pgstat_kind.h:32
void pgstat_reset_replslot(const char *name)
PgStat_StatReplSlotEntry * pgstat_fetch_replslot(NameData slotname)
PgStat_SLRUStats * pgstat_fetch_slru(void)
Definition: pgstat_slru.c:91
const char * pgstat_get_slru_name(int slru_idx)
Definition: pgstat_slru.c:104
void pgstat_reset_slru(const char *name)
Definition: pgstat_slru.c:45
PgStat_StatSubEntry * pgstat_fetch_stat_subscription(Oid subid)
PgStat_WalStats * pgstat_fetch_stat_wal(void)
Definition: pgstat_wal.c:67
#define PG_STAT_GET_XACT_RELENTRY_INT64(stat)
Definition: pgstatfuncs.c:1775
Datum pg_stat_get_progress_info(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:276
Datum pg_stat_get_checkpointer_num_requested(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1241
Datum pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1852
Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:929
Datum pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1125
Datum pg_stat_get_wal(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1717
Datum pg_stat_reset_replication_slot(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:2023
Datum pg_stat_get_checkpointer_num_timed(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1235
#define UINT32_ACCESS_ONCE(var)
Definition: pgstatfuncs.c:35
Datum pg_stat_get_activity(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:352
Datum pg_stat_get_slru(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1732
static void pg_stat_io_build_tuples(ReturnSetInfo *rsinfo, PgStat_BktypeIO *bktype_stats, BackendType bktype, TimestampTz stat_reset_timestamp)
Definition: pgstatfuncs.c:1460
Datum pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:972
Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:907
Datum pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1144
Datum pg_stat_get_subscription_stats(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:2204
#define PG_STAT_GET_SLRU_COLS
#define PG_STAT_GET_DBENTRY_INT64(stat)
Definition: pgstatfuncs.c:1036
Datum pg_stat_get_checkpointer_buffers_written(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1271
Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:718
Datum pg_stat_get_checkpointer_sync_time(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1303
static double pg_stat_us_to_ms(PgStat_Counter val_ms)
Definition: pgstatfuncs.c:1447
#define PG_STAT_WAL_COLS
#define PG_STAT_GET_ACTIVITY_COLS
static Datum pg_stat_wal_build_tuple(PgStat_WalCounters wal_counters, TimestampTz stat_reset_timestamp)
Definition: pgstatfuncs.c:1637
static io_stat_col pgstat_get_io_time_index(IOOp io_op)
Definition: pgstatfuncs.c:1422
Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:791
#define PG_STAT_GET_FUNCENTRY_FLOAT8_MS(stat)
Definition: pgstatfuncs.c:186
Datum pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1016
Datum pg_stat_get_db_checksum_failures(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1164
Datum pg_stat_get_function_stat_reset_time(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:207
Datum pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:2040
Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1867
Datum pg_stat_reset_slru(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:2006
Datum pg_stat_get_checkpointer_restartpoints_requested(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1259
Datum pg_stat_get_checkpointer_num_performed(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1247
Datum pg_stat_get_db_checksum_last_failure(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1182
Datum pg_stat_get_backend_wal(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1695
static io_stat_col pgstat_get_io_op_index(IOOp io_op)
Definition: pgstatfuncs.c:1364
Datum pg_stat_have_stats(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:2291
Datum pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:225
Datum pg_stat_get_backend_wait_event_type(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:816
static io_stat_col pgstat_get_io_byte_index(IOOp io_op)
Definition: pgstatfuncs.c:1395
#define PG_STAT_GET_SUBSCRIPTION_STATS_COLS
Datum pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1289
Datum pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1283
Datum pg_stat_get_io(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1557
Datum pg_stat_get_checkpointer_restartpoints_performed(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1265
#define PG_STAT_GET_DBENTRY_FLOAT8_MS(stat)
Definition: pgstatfuncs.c:1203
Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:744
Datum pg_stat_reset(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1887
Datum pg_stat_get_backend_wait_event(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:837
#define PG_STAT_GET_SUBXACT_COLS
#define PG_STAT_GET_XACT_FUNCENTRY_FLOAT8_MS(stat)
Definition: pgstatfuncs.c:1832
#define PG_STAT_GET_RELENTRY_INT64(stat)
Definition: pgstatfuncs.c:39
Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:731
Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1822
#define PG_STAT_GET_RELENTRY_TIMESTAMPTZ(stat)
Definition: pgstatfuncs.c:137
Datum pg_stat_reset_backend_stats(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1973
#define PG_STAT_GET_PROGRESS_COLS
Datum pg_stat_get_checkpointer_write_time(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1295
#define HAS_PGSTAT_PERMISSIONS(role)
Definition: pgstatfuncs.c:37
Datum pg_stat_get_backend_io(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1598
Datum pg_stat_get_checkpointer_slru_written(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1277
#define PG_STAT_GET_RELENTRY_FLOAT8(stat)
Definition: pgstatfuncs.c:109
Datum pg_stat_get_archiver(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:2064
Datum pg_stat_get_checkpointer_restartpoints_timed(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1253
Datum pg_stat_reset_shared(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1901
Datum pg_stat_force_next_flush(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1877
Datum pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1949
Datum pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1317
Datum pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:885
Datum pg_stat_get_checkpointer_stat_reset_time(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1311
Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:175
Datum pg_stat_get_backend_subxact(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:756
Datum pg_stat_get_replication_slot(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:2130
io_stat_col
Definition: pgstatfuncs.c:1334
@ IO_COL_READS
Definition: pgstatfuncs.c:1339
@ IO_NUM_COLUMNS
Definition: pgstatfuncs.c:1356
@ IO_COL_RESET_TIME
Definition: pgstatfuncs.c:1355
@ IO_COL_WRITE_TIME
Definition: pgstatfuncs.c:1344
@ IO_COL_HITS
Definition: pgstatfuncs.c:1350
@ IO_COL_EXTENDS
Definition: pgstatfuncs.c:1347
@ IO_COL_WRITEBACK_TIME
Definition: pgstatfuncs.c:1346
@ IO_COL_REUSES
Definition: pgstatfuncs.c:1352
@ IO_COL_WRITES
Definition: pgstatfuncs.c:1342
@ IO_COL_OBJECT
Definition: pgstatfuncs.c:1337
@ IO_COL_EVICTIONS
Definition: pgstatfuncs.c:1351
@ IO_COL_WRITEBACKS
Definition: pgstatfuncs.c:1345
@ IO_COL_CONTEXT
Definition: pgstatfuncs.c:1338
@ IO_COL_READ_BYTES
Definition: pgstatfuncs.c:1340
@ IO_COL_EXTEND_BYTES
Definition: pgstatfuncs.c:1348
@ IO_COL_BACKEND_TYPE
Definition: pgstatfuncs.c:1336
@ IO_COL_FSYNC_TIME
Definition: pgstatfuncs.c:1354
@ IO_COL_EXTEND_TIME
Definition: pgstatfuncs.c:1349
@ IO_COL_FSYNCS
Definition: pgstatfuncs.c:1353
@ IO_COL_WRITE_BYTES
Definition: pgstatfuncs.c:1343
@ IO_COL_INVALID
Definition: pgstatfuncs.c:1335
@ IO_COL_READ_TIME
Definition: pgstatfuncs.c:1341
Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:859
Datum pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1960
Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:1323
Datum pg_backend_pid(PG_FUNCTION_ARGS)
Definition: pgstatfuncs.c:711
#define PG_STAT_GET_REPLICATION_SLOT_COLS
int pg_strcasecmp(const char *s1, const char *s2)
Definition: pgstrcasecmp.c:36
#define snprintf
Definition: port.h:239
static Datum Int64GetDatum(int64 X)
Definition: postgres.h:403
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:332
static Datum TransactionIdGetDatum(TransactionId X)
Definition: postgres.h:282
static Datum BoolGetDatum(bool X)
Definition: postgres.h:112
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:262
uint64_t Datum
Definition: postgres.h:70
static Datum Float8GetDatum(float8 X)
Definition: postgres.h:492
static Datum CStringGetDatum(const char *X)
Definition: postgres.h:360
static Datum Int32GetDatum(int32 X)
Definition: postgres.h:222
#define InvalidOid
Definition: postgres_ext.h:37
unsigned int Oid
Definition: postgres_ext.h:32
#define GetNumberFromPGProc(proc)
Definition: proc.h:441
PGPROC * BackendPidGetProc(int pid)
Definition: procarray.c:3158
int ProcNumber
Definition: procnumber.h:24
PGPROC * AuxiliaryPidGetProc(int pid)
Definition: proc.c:1101
void * user_fctx
Definition: funcapi.h:82
MemoryContext multi_call_memory_ctx
Definition: funcapi.h:101
TransactionId backend_xid
PgBackendStatus backendStatus
TransactionId backend_xmin
Definition: proc.h:179
uint32 wait_event_info
Definition: proc.h:296
int pid
Definition: proc.h:199
PGPROC * lockGroupLeader
Definition: proc.h:321
char gss_princ[NAMEDATALEN]
char ssl_version[NAMEDATALEN]
char ssl_cipher[NAMEDATALEN]
char ssl_client_dn[NAMEDATALEN]
char ssl_client_serial[NAMEDATALEN]
char ssl_issuer_dn[NAMEDATALEN]
BackendType st_backendType
TimestampTz st_state_start_timestamp
TimestampTz st_proc_start_timestamp
PgBackendGSSStatus * st_gssstatus
BackendState st_state
TimestampTz st_activity_start_timestamp
ProgressCommandType st_progress_command
SockAddr st_clientaddr
int64 st_progress_param[PGSTAT_NUM_PROGRESS_PARAM]
PgBackendSSLStatus * st_sslstatus
TimestampTz st_xact_start_timestamp
char * st_clienthostname
Oid st_progress_command_target
TimestampTz last_failed_timestamp
Definition: pgstat.h:228
TimestampTz stat_reset_timestamp
Definition: pgstat.h:229
TimestampTz last_archived_timestamp
Definition: pgstat.h:224
char last_failed_wal[MAX_XFN_CHARS+1]
Definition: pgstat.h:226
PgStat_Counter failed_count
Definition: pgstat.h:225
PgStat_Counter archived_count
Definition: pgstat.h:221
char last_archived_wal[MAX_XFN_CHARS+1]
Definition: pgstat.h:222
TimestampTz stat_reset_timestamp
Definition: pgstat.h:499
PgStat_WalCounters wal_counters
Definition: pgstat.h:501
PgStat_BktypeIO io_stats
Definition: pgstat.h:500
PgStat_Counter times[IOOBJECT_NUM_TYPES][IOCONTEXT_NUM_TYPES][IOOP_NUM_TYPES]
Definition: pgstat.h:329
uint64 bytes[IOOBJECT_NUM_TYPES][IOCONTEXT_NUM_TYPES][IOOP_NUM_TYPES]
Definition: pgstat.h:327
PgStat_Counter counts[IOOBJECT_NUM_TYPES][IOCONTEXT_NUM_TYPES][IOOP_NUM_TYPES]
Definition: pgstat.h:328
PgStat_Counter numcalls
Definition: pgstat.h:84
PgStat_BktypeIO stats[BACKEND_NUM_TYPES]
Definition: pgstat.h:342
TimestampTz stat_reset_timestamp
Definition: pgstat.h:341
PgStat_Counter conflict_startup_deadlock
Definition: pgstat.h:362
PgStat_Counter conflict_lock
Definition: pgstat.h:358
TimestampTz stat_reset_timestamp
Definition: pgstat.h:380
PgStat_Counter conflict_snapshot
Definition: pgstat.h:359
TimestampTz last_checksum_failure
Definition: pgstat.h:367
PgStat_Counter conflict_bufferpin
Definition: pgstat.h:361
PgStat_Counter conflict_logicalslot
Definition: pgstat.h:360
PgStat_Counter checksum_failures
Definition: pgstat.h:366
PgStat_Counter conflict_tablespace
Definition: pgstat.h:357
PgStat_Counter numcalls
Definition: pgstat.h:385
TimestampTz stat_reset_timestamp
Definition: pgstat.h:389
TimestampTz stat_reset_timestamp
Definition: pgstat.h:403
PgStat_Counter mem_exceeded_count
Definition: pgstat.h:400
PgStat_Counter stream_count
Definition: pgstat.h:398
PgStat_Counter total_txns
Definition: pgstat.h:401
PgStat_Counter total_bytes
Definition: pgstat.h:402
PgStat_Counter spill_txns
Definition: pgstat.h:394
PgStat_Counter stream_txns
Definition: pgstat.h:397
PgStat_Counter spill_count
Definition: pgstat.h:395
PgStat_Counter stream_bytes
Definition: pgstat.h:399
PgStat_Counter spill_bytes
Definition: pgstat.h:396
PgStat_Counter sync_table_error_count
Definition: pgstat.h:422
PgStat_Counter apply_error_count
Definition: pgstat.h:420
PgStat_Counter sync_seq_error_count
Definition: pgstat.h:421
PgStat_Counter conflict_count[CONFLICT_NUM_TYPES]
Definition: pgstat.h:423
TimestampTz stat_reset_timestamp
Definition: pgstat.h:424
PgStat_Counter wal_fpi
Definition: pgstat.h:477
uint64 wal_bytes
Definition: pgstat.h:478
uint64 wal_fpi_bytes
Definition: pgstat.h:479
PgStat_Counter wal_buffers_full
Definition: pgstat.h:480
PgStat_Counter wal_records
Definition: pgstat.h:476
TimestampTz stat_reset_timestamp
Definition: pgstat.h:490
PgStat_WalCounters wal_counters
Definition: pgstat.h:489
TupleDesc setDesc
Definition: execnodes.h:364
Tuplestorestate * setResult
Definition: execnodes.h:363
struct sockaddr_storage addr
Definition: pqcomm.h:32
socklen_t salen
Definition: pqcomm.h:33
Definition: c.h:751
Definition: c.h:697
#define TransactionIdIsValid(xid)
Definition: transam.h:41
TupleDesc CreateTemplateTupleDesc(int natts)
Definition: tupdesc.c:182
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
Definition: tupdesc.c:842
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, const Datum *values, const bool *isnull)
Definition: tuplestore.c:784
static Datum TimestampTzGetDatum(TimestampTz X)
Definition: timestamp.h:52
#define PG_RETURN_TIMESTAMPTZ(x)
Definition: timestamp.h:68
text * cstring_to_text(const char *s)
Definition: varlena.c:181
char * text_to_cstring(const text *t)
Definition: varlena.c:214
const char * pgstat_get_wait_event_type(uint32 wait_event_info)
Definition: wait_event.c:373
const char * pgstat_get_wait_event(uint32 wait_event_info)
Definition: wait_event.c:431
const char * name
#define stat
Definition: win32_port.h:274
bool DataChecksumsEnabled(void)
Definition: xlog.c:4629
void XLogPrefetchResetStats(void)