diff --git a/src/backend/commands/wait.c b/src/backend/commands/wait.c index 85fcd463..b84fa815 100644 --- a/src/backend/commands/wait.c +++ b/src/backend/commands/wait.c @@ -31,7 +31,8 @@ void -ExecWaitStmt(ParseState *pstate, WaitStmt *stmt, DestReceiver *dest) +ExecWaitStmt(ParseState *pstate, WaitStmt *stmt, bool isTopLevel, + DestReceiver *dest) { XLogRecPtr lsn; int64 timeout = 0; @@ -135,6 +136,16 @@ ExecWaitStmt(ParseState *pstate, WaitStmt *stmt, DestReceiver *dest) } } + /* + * WAIT FOR must not run inside a function or procedure. + * Forbid this case upfront. + */ + if (!isTopLevel) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("%s cannot be executed from a function or procedure", + "WAIT FOR"))); + /* * We are going to wait for the LSN. We should first care that we don't * hold a snapshot and correspondingly our MyProc->xmin is invalid. diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 1d34c199..73a56f1d 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1062,7 +1062,8 @@ standard_ProcessUtility(PlannedStmt *pstmt, case T_WaitStmt: { - ExecWaitStmt(pstate, (WaitStmt *) parsetree, dest); + ExecWaitStmt(pstate, (WaitStmt *) parsetree, isTopLevel, + dest); } break; diff --git a/src/include/commands/wait.h b/src/include/commands/wait.h index 521a3129..d7b3ee85 100644 --- a/src/include/commands/wait.h +++ b/src/include/commands/wait.h @@ -16,7 +16,8 @@ #include "parser/parse_node.h" #include "tcop/dest.h" -extern void ExecWaitStmt(ParseState *pstate, WaitStmt *stmt, DestReceiver *dest); +extern void ExecWaitStmt(ParseState *pstate, WaitStmt *stmt, bool isTopLevel, + DestReceiver *dest); extern TupleDesc WaitStmtResultDesc(WaitStmt *stmt); #endif /* WAIT_H */