On Thu, Jan 1, 2026 at 3:10 PM Pavel Stehule <pavel.stehule@gmail.com> wrote: > > Hi > > I tested one use case, and maybe I found little bit possible error message > > create procedure test() > as $$ > begin > vacuum; > end; > $$ language plpgsql; > > (2026-01-01 08:04:05) postgres=# call test(); > ERROR: 25001: VACUUM cannot be executed from a function > CONTEXT: SQL statement "vacuum" > PL/pgSQL function test() line 3 at SQL statement > LOCATION: PreventInTransactionBlock, xact.c:3695 > (2026-01-01 08:09:18) postgres=# > > should be "VACUUM cannot be executed from a function or a procedure" instead ? >
hi. "VACUUM cannot be executed from a function or a procedure" looks good to me.
similarly, in ExecWaitStmt we have: ereport(ERROR, errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("WAIT FOR must be only called without an active or registered snapshot"), errdetail("WAIT FOR cannot be executed from a function or a procedure or within a transaction with an isolation level higher than READ COMMITTED."));
PreventInTransactionBlock is used in so many places, but this error message: `` (errmsg("%s cannot be executed from a function", stmtType))); `` only appears once in the regress tests. maybe we can add some dummy tests for it.