34{
39 bool throw = true;
42 const char *result = "<unset>";
46
47
50
52 {
54 {
56
60
62
71 else
74 errmsg(
"unrecognized value for %s option \"%s\": \"%s\"",
77 }
79 {
82 double result;
83
87
89
91 {
96 }
97
98
99
100
101
102
103 result =
rint(result);
104
105
109 errmsg(
"timeout value is out of range"));
110
111 if (result < 0)
114 errmsg(
"timeout cannot be negative"));
115
117 }
119 {
122
124
126 }
127 else
128 {
131 errmsg(
"option \"%s\" not recognized",
134 }
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
151
152
153
154
155
157
158
162 errmsg(
"WAIT FOR must be called without an active or registered snapshot"),
163 errdetail(
"WAIT FOR cannot be executed from a function or procedure, nor within a transaction with an isolation level higher than READ COMMITTED."));
164
165
166
167
168
170
171
172
173
174
176 {
180 errmsg(
"recovery is in progress"),
181 errhint(
"Waiting for primary_flush can only be done on a primary server. "
182 "Use standby_flush mode on a standby server.")));
183 }
184
185
187
188
189
190
192 {
194
195 result = "success";
196 break;
197
199 if (throw)
200 {
202
203 switch (lsnType)
204 {
208 errmsg(
"timed out while waiting for target LSN %X/%08X to be replayed; current standby_replay LSN %X/%08X",
211 break;
212
216 errmsg(
"timed out while waiting for target LSN %X/%08X to be written; current standby_write LSN %X/%08X",
219 break;
220
224 errmsg(
"timed out while waiting for target LSN %X/%08X to be flushed; current standby_flush LSN %X/%08X",
227 break;
228
232 errmsg(
"timed out while waiting for target LSN %X/%08X to be flushed; current primary_flush LSN %X/%08X",
235 break;
236
237 default:
238 elog(
ERROR,
"unexpected wait LSN type %d", lsnType);
239 }
240 }
241 else
242 result = "timeout";
243 break;
244
246 if (throw)
247 {
249 {
251
252 switch (lsnType)
253 {
257 errmsg(
"recovery is not in progress"),
258 errdetail(
"Recovery ended before target LSN %X/%08X was replayed; last standby_replay LSN %X/%08X.",
261 break;
262
266 errmsg(
"recovery is not in progress"),
267 errdetail(
"Recovery ended before target LSN %X/%08X was written; last standby_write LSN %X/%08X.",
270 break;
271
275 errmsg(
"recovery is not in progress"),
276 errdetail(
"Recovery ended before target LSN %X/%08X was flushed; last standby_flush LSN %X/%08X.",
279 break;
280
281 default:
282 elog(
ERROR,
"unexpected wait LSN type %d", lsnType);
283 }
284 }
285 else
286 {
287 switch (lsnType)
288 {
292 errmsg(
"recovery is not in progress"),
293 errhint(
"Waiting for the standby_replay LSN can only be executed during recovery."));
294 break;
295
299 errmsg(
"recovery is not in progress"),
300 errhint(
"Waiting for the standby_write LSN can only be executed during recovery."));
301 break;
302
306 errmsg(
"recovery is not in progress"),
307 errhint(
"Waiting for the standby_flush LSN can only be executed during recovery."));
308 break;
309
310 default:
311 elog(
ERROR,
"unexpected wait LSN type %d", lsnType);
312 }
313 }
314 }
315 else
316 result = "not in recovery";
317 break;
318 }
319
320
322
323
325
326
328
330}
#define Assert(condition)
#define FLOAT8_FITS_IN_INT64(num)
char * defGetString(DefElem *def)
bool defGetBoolean(DefElem *def)
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
const TupleTableSlotOps TTSOpsVirtual
void end_tup_output(TupOutputState *tstate)
TupOutputState * begin_tup_output_tupdesc(DestReceiver *dest, TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
#define do_text_output_oneline(tstate, str_to_emit)
#define DirectFunctionCall1(func, arg1)
bool parse_real(const char *value, double *result, int flags, const char **hintmsg)
int parser_errposition(ParseState *pstate, int location)
#define foreach_node(type, var, lst)
Datum pg_lsn_in(PG_FUNCTION_ARGS)
static XLogRecPtr DatumGetLSN(Datum X)
int pg_strcasecmp(const char *s1, const char *s2)
static Datum CStringGetDatum(const char *X)
bool ActiveSnapshotSet(void)
bool HaveRegisteredOrActiveSnapshot(void)
void PopActiveSnapshot(void)
void InvalidateCatalogSnapshot(void)
#define InvalidTransactionId
TupleDesc WaitStmtResultDesc(WaitStmt *stmt)
bool RecoveryInProgress(void)
#define LSN_FORMAT_ARGS(lsn)
bool PromoteIsTriggered(void)
XLogRecPtr GetCurrentLSNForWaitType(WaitLSNType lsnType)
WaitLSNResult WaitForLSN(WaitLSNType lsnType, XLogRecPtr targetLSN, int64 timeout)
@ WAIT_LSN_RESULT_NOT_IN_RECOVERY
@ WAIT_LSN_RESULT_TIMEOUT
@ WAIT_LSN_RESULT_SUCCESS
@ WAIT_LSN_TYPE_PRIMARY_FLUSH
@ WAIT_LSN_TYPE_STANDBY_REPLAY
@ WAIT_LSN_TYPE_STANDBY_FLUSH
@ WAIT_LSN_TYPE_STANDBY_WRITE