PostgreSQL Source Code git master
multixactfuncs.c File Reference
#include "postgres.h"
#include "access/htup_details.h"
#include "access/multixact.h"
#include "access/multixact_internal.h"
#include "catalog/pg_authid_d.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "utils/acl.h"
#include "utils/builtins.h"
Include dependency graph for multixactfuncs.c:

Go to the source code of this file.

Functions

Datum pg_get_multixact_members (PG_FUNCTION_ARGS)
 
Datum pg_get_multixact_stats (PG_FUNCTION_ARGS)
 

Function Documentation

◆ pg_get_multixact_members()

Datum pg_get_multixact_members ( PG_FUNCTION_ARGS  )

Definition at line 33 of file multixactfuncs.c.

34{
35 typedef struct
36 {
37 MultiXactMember *members;
38 int nmembers;
39 int iter;
40 } mxact;
42 mxact *multi;
43 FuncCallContext *funccxt;
44
45 if (mxid < FirstMultiXactId)
47 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
48 errmsg("invalid MultiXactId: %u", mxid)));
49
50 if (SRF_IS_FIRSTCALL())
51 {
52 MemoryContext oldcxt;
53 TupleDesc tupdesc;
54
55 funccxt = SRF_FIRSTCALL_INIT();
57
58 multi = palloc_object(mxact);
59 /* no need to allow for old values here */
60 multi->nmembers = GetMultiXactIdMembers(mxid, &multi->members, false,
61 false);
62 multi->iter = 0;
63
64 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
65 elog(ERROR, "return type must be a row type");
66 funccxt->tuple_desc = tupdesc;
67 funccxt->attinmeta = TupleDescGetAttInMetadata(tupdesc);
68 funccxt->user_fctx = multi;
69
71 }
72
73 funccxt = SRF_PERCALL_SETUP();
74 multi = (mxact *) funccxt->user_fctx;
75
76 while (multi->iter < multi->nmembers)
77 {
78 HeapTuple tuple;
79 char *values[2];
80
81 values[0] = psprintf("%u", multi->members[multi->iter].xid);
82 values[1] = mxstatus_to_string(multi->members[multi->iter].status);
83
84 tuple = BuildTupleFromCStrings(funccxt->attinmeta, values);
85
86 multi->iter++;
87 pfree(values[0]);
88 SRF_RETURN_NEXT(funccxt, HeapTupleGetDatum(tuple));
89 }
90
91 SRF_RETURN_DONE(funccxt);
92}
static Datum values[MAXATTR]
Definition: bootstrap.c:155
TransactionId MultiXactId
Definition: c.h:682
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
HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
Definition: execTuples.c:2324
AttInMetadata * TupleDescGetAttInMetadata(TupleDesc tupdesc)
Definition: execTuples.c:2275
#define palloc_object(type)
Definition: fe_memutils.h:74
#define PG_GETARG_TRANSACTIONID(n)
Definition: fmgr.h:280
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
Definition: funcapi.c:276
#define SRF_IS_FIRSTCALL()
Definition: funcapi.h:304
#define SRF_PERCALL_SETUP()
Definition: funcapi.h:308
@ TYPEFUNC_COMPOSITE
Definition: funcapi.h:149
#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
void pfree(void *pointer)
Definition: mcxt.c:1616
char * mxstatus_to_string(MultiXactStatus status)
Definition: multixact.c:1516
int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, bool from_pgupgrade, bool isLockOnly)
Definition: multixact.c:1115
#define FirstMultiXactId
Definition: multixact.h:26
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
while(p+4<=pend)
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
void * user_fctx
Definition: funcapi.h:82
AttInMetadata * attinmeta
Definition: funcapi.h:91
MemoryContext multi_call_memory_ctx
Definition: funcapi.h:101
TupleDesc tuple_desc
Definition: funcapi.h:112

References FuncCallContext::attinmeta, BuildTupleFromCStrings(), elog, ereport, errcode(), errmsg(), ERROR, FirstMultiXactId, get_call_result_type(), GetMultiXactIdMembers(), HeapTupleGetDatum(), MemoryContextSwitchTo(), FuncCallContext::multi_call_memory_ctx, mxstatus_to_string(), palloc_object, pfree(), PG_GETARG_TRANSACTIONID, psprintf(), SRF_FIRSTCALL_INIT, SRF_IS_FIRSTCALL, SRF_PERCALL_SETUP, SRF_RETURN_DONE, SRF_RETURN_NEXT, FuncCallContext::tuple_desc, TupleDescGetAttInMetadata(), TYPEFUNC_COMPOSITE, FuncCallContext::user_fctx, values, and while().

◆ pg_get_multixact_stats()

Datum pg_get_multixact_stats ( PG_FUNCTION_ARGS  )

Definition at line 100 of file multixactfuncs.c.

101{
102 TupleDesc tupdesc;
103 Datum values[4];
104 bool nulls[4];
105 uint64 members;
106 MultiXactId oldestMultiXactId;
107 uint32 multixacts;
108 MultiXactOffset oldestOffset;
109 MultiXactOffset nextOffset;
110 uint64 membersBytes;
111
112 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
114 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
115 errmsg("return type must be a row type")));
116
117 GetMultiXactInfo(&multixacts, &nextOffset, &oldestMultiXactId, &oldestOffset);
118 members = nextOffset - oldestOffset;
119
120 membersBytes = MultiXactOffsetStorageSize(nextOffset, oldestOffset);
121
122 if (!has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS))
123 {
124 /*
125 * Only superusers and roles with privileges of pg_read_all_stats can
126 * see details.
127 */
128 memset(nulls, true, sizeof(bool) * tupdesc->natts);
129 }
130 else
131 {
132 values[0] = UInt32GetDatum(multixacts);
133 values[1] = Int64GetDatum(members);
134 values[2] = Int64GetDatum(membersBytes);
135 values[3] = UInt32GetDatum(oldestMultiXactId);
136 memset(nulls, false, sizeof(nulls));
137 }
138
139 return HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls));
140}
bool has_privs_of_role(Oid member, Oid role)
Definition: acl.c:5284
uint64 MultiXactOffset
Definition: c.h:684
uint64_t uint64
Definition: c.h:553
uint32_t uint32
Definition: c.h:552
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition: heaptuple.c:1117
Oid GetUserId(void)
Definition: miscinit.c:469
void GetMultiXactInfo(uint32 *multixacts, MultiXactOffset *nextOffset, MultiXactId *oldestMultiXactId, MultiXactOffset *oldestOffset)
Definition: multixact.c:2469
static uint64 MultiXactOffsetStorageSize(MultiXactOffset new_offset, MultiXactOffset old_offset)
static Datum Int64GetDatum(int64 X)
Definition: postgres.h:423
uint64_t Datum
Definition: postgres.h:70
static Datum UInt32GetDatum(uint32 X)
Definition: postgres.h:242

References ereport, errcode(), errmsg(), ERROR, get_call_result_type(), GetMultiXactInfo(), GetUserId(), has_privs_of_role(), heap_form_tuple(), HeapTupleGetDatum(), Int64GetDatum(), MultiXactOffsetStorageSize(), TupleDescData::natts, TYPEFUNC_COMPOSITE, UInt32GetDatum(), and values.