Now that we have non-Latin1 SGML detection, restore Latin1 chars
[pgsql.git] / src / backend / utils / misc / pg_controldata.c
blob98c932dc7bd641c374bd40bc3ba4908cdc7eabd1
1 /*-------------------------------------------------------------------------
3 * pg_controldata.c
5 * Routines to expose the contents of the control data file via
6 * a set of SQL functions.
8 * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
9 * Portions Copyright (c) 1994, Regents of the University of California
11 * IDENTIFICATION
12 * src/backend/utils/misc/pg_controldata.c
13 *-------------------------------------------------------------------------
16 #include "postgres.h"
18 #include "access/htup_details.h"
19 #include "access/transam.h"
20 #include "access/xlog.h"
21 #include "access/xlog_internal.h"
22 #include "catalog/pg_control.h"
23 #include "common/controldata_utils.h"
24 #include "funcapi.h"
25 #include "miscadmin.h"
26 #include "storage/lwlock.h"
27 #include "utils/builtins.h"
28 #include "utils/pg_lsn.h"
29 #include "utils/timestamp.h"
31 Datum
32 pg_control_system(PG_FUNCTION_ARGS)
34 Datum values[4];
35 bool nulls[4];
36 TupleDesc tupdesc;
37 HeapTuple htup;
38 ControlFileData *ControlFile;
39 bool crc_ok;
41 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
42 elog(ERROR, "return type must be a row type");
44 /* read the control file */
45 LWLockAcquire(ControlFileLock, LW_SHARED);
46 ControlFile = get_controlfile(DataDir, &crc_ok);
47 LWLockRelease(ControlFileLock);
48 if (!crc_ok)
49 ereport(ERROR,
50 (errmsg("calculated CRC checksum does not match value stored in file")));
52 values[0] = Int32GetDatum(ControlFile->pg_control_version);
53 nulls[0] = false;
55 values[1] = Int32GetDatum(ControlFile->catalog_version_no);
56 nulls[1] = false;
58 values[2] = Int64GetDatum(ControlFile->system_identifier);
59 nulls[2] = false;
61 values[3] = TimestampTzGetDatum(time_t_to_timestamptz(ControlFile->time));
62 nulls[3] = false;
64 htup = heap_form_tuple(tupdesc, values, nulls);
66 PG_RETURN_DATUM(HeapTupleGetDatum(htup));
69 Datum
70 pg_control_checkpoint(PG_FUNCTION_ARGS)
72 Datum values[18];
73 bool nulls[18];
74 TupleDesc tupdesc;
75 HeapTuple htup;
76 ControlFileData *ControlFile;
77 XLogSegNo segno;
78 char xlogfilename[MAXFNAMELEN];
79 bool crc_ok;
81 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
82 elog(ERROR, "return type must be a row type");
84 /* Read the control file. */
85 LWLockAcquire(ControlFileLock, LW_SHARED);
86 ControlFile = get_controlfile(DataDir, &crc_ok);
87 LWLockRelease(ControlFileLock);
88 if (!crc_ok)
89 ereport(ERROR,
90 (errmsg("calculated CRC checksum does not match value stored in file")));
93 * Calculate name of the WAL file containing the latest checkpoint's REDO
94 * start point.
96 XLByteToSeg(ControlFile->checkPointCopy.redo, segno, wal_segment_size);
97 XLogFileName(xlogfilename, ControlFile->checkPointCopy.ThisTimeLineID,
98 segno, wal_segment_size);
100 /* Populate the values and null arrays */
101 values[0] = LSNGetDatum(ControlFile->checkPoint);
102 nulls[0] = false;
104 values[1] = LSNGetDatum(ControlFile->checkPointCopy.redo);
105 nulls[1] = false;
107 values[2] = CStringGetTextDatum(xlogfilename);
108 nulls[2] = false;
110 values[3] = Int32GetDatum(ControlFile->checkPointCopy.ThisTimeLineID);
111 nulls[3] = false;
113 values[4] = Int32GetDatum(ControlFile->checkPointCopy.PrevTimeLineID);
114 nulls[4] = false;
116 values[5] = BoolGetDatum(ControlFile->checkPointCopy.fullPageWrites);
117 nulls[5] = false;
119 values[6] = CStringGetTextDatum(psprintf("%u:%u",
120 EpochFromFullTransactionId(ControlFile->checkPointCopy.nextXid),
121 XidFromFullTransactionId(ControlFile->checkPointCopy.nextXid)));
122 nulls[6] = false;
124 values[7] = ObjectIdGetDatum(ControlFile->checkPointCopy.nextOid);
125 nulls[7] = false;
127 values[8] = TransactionIdGetDatum(ControlFile->checkPointCopy.nextMulti);
128 nulls[8] = false;
130 values[9] = TransactionIdGetDatum(ControlFile->checkPointCopy.nextMultiOffset);
131 nulls[9] = false;
133 values[10] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestXid);
134 nulls[10] = false;
136 values[11] = ObjectIdGetDatum(ControlFile->checkPointCopy.oldestXidDB);
137 nulls[11] = false;
139 values[12] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestActiveXid);
140 nulls[12] = false;
142 values[13] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestMulti);
143 nulls[13] = false;
145 values[14] = ObjectIdGetDatum(ControlFile->checkPointCopy.oldestMultiDB);
146 nulls[14] = false;
148 values[15] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestCommitTsXid);
149 nulls[15] = false;
151 values[16] = TransactionIdGetDatum(ControlFile->checkPointCopy.newestCommitTsXid);
152 nulls[16] = false;
154 values[17] = TimestampTzGetDatum(time_t_to_timestamptz(ControlFile->checkPointCopy.time));
155 nulls[17] = false;
157 htup = heap_form_tuple(tupdesc, values, nulls);
159 PG_RETURN_DATUM(HeapTupleGetDatum(htup));
162 Datum
163 pg_control_recovery(PG_FUNCTION_ARGS)
165 Datum values[5];
166 bool nulls[5];
167 TupleDesc tupdesc;
168 HeapTuple htup;
169 ControlFileData *ControlFile;
170 bool crc_ok;
172 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
173 elog(ERROR, "return type must be a row type");
175 /* read the control file */
176 LWLockAcquire(ControlFileLock, LW_SHARED);
177 ControlFile = get_controlfile(DataDir, &crc_ok);
178 LWLockRelease(ControlFileLock);
179 if (!crc_ok)
180 ereport(ERROR,
181 (errmsg("calculated CRC checksum does not match value stored in file")));
183 values[0] = LSNGetDatum(ControlFile->minRecoveryPoint);
184 nulls[0] = false;
186 values[1] = Int32GetDatum(ControlFile->minRecoveryPointTLI);
187 nulls[1] = false;
189 values[2] = LSNGetDatum(ControlFile->backupStartPoint);
190 nulls[2] = false;
192 values[3] = LSNGetDatum(ControlFile->backupEndPoint);
193 nulls[3] = false;
195 values[4] = BoolGetDatum(ControlFile->backupEndRequired);
196 nulls[4] = false;
198 htup = heap_form_tuple(tupdesc, values, nulls);
200 PG_RETURN_DATUM(HeapTupleGetDatum(htup));
203 Datum
204 pg_control_init(PG_FUNCTION_ARGS)
206 Datum values[11];
207 bool nulls[11];
208 TupleDesc tupdesc;
209 HeapTuple htup;
210 ControlFileData *ControlFile;
211 bool crc_ok;
213 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
214 elog(ERROR, "return type must be a row type");
216 /* read the control file */
217 LWLockAcquire(ControlFileLock, LW_SHARED);
218 ControlFile = get_controlfile(DataDir, &crc_ok);
219 LWLockRelease(ControlFileLock);
220 if (!crc_ok)
221 ereport(ERROR,
222 (errmsg("calculated CRC checksum does not match value stored in file")));
224 values[0] = Int32GetDatum(ControlFile->maxAlign);
225 nulls[0] = false;
227 values[1] = Int32GetDatum(ControlFile->blcksz);
228 nulls[1] = false;
230 values[2] = Int32GetDatum(ControlFile->relseg_size);
231 nulls[2] = false;
233 values[3] = Int32GetDatum(ControlFile->xlog_blcksz);
234 nulls[3] = false;
236 values[4] = Int32GetDatum(ControlFile->xlog_seg_size);
237 nulls[4] = false;
239 values[5] = Int32GetDatum(ControlFile->nameDataLen);
240 nulls[5] = false;
242 values[6] = Int32GetDatum(ControlFile->indexMaxKeys);
243 nulls[6] = false;
245 values[7] = Int32GetDatum(ControlFile->toast_max_chunk_size);
246 nulls[7] = false;
248 values[8] = Int32GetDatum(ControlFile->loblksize);
249 nulls[8] = false;
251 values[9] = BoolGetDatum(ControlFile->float8ByVal);
252 nulls[9] = false;
254 values[10] = Int32GetDatum(ControlFile->data_checksum_version);
255 nulls[10] = false;
257 htup = heap_form_tuple(tupdesc, values, nulls);
259 PG_RETURN_DATUM(HeapTupleGetDatum(htup));