PostgreSQL Source Code: src/backend/commands/wait.c Source File (original) (raw)

34{

39 bool throw = true;

42 const char *result = "";

46

47

50

52 {

54 {

56

60

62

71 else

74 errmsg("unrecognized value for %s option \"%s\": \"%s\"",

77 }

78 else if (strcmp(defel->defname, "timeout") == 0)

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 }

118 else if (strcmp(defel->defname, "no_throw") == 0)

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}

334{

336

337

341 return tupdesc;

342}