From aa57e3a80e5ee7bce121addc607d198e67941fc7 Mon Sep 17 00:00:00 2001
From: "okbob@github.com" <pavel.stehule@gmail.com>
Date: Sat, 3 Jan 2026 07:32:26 +0100
Subject: [PATCH] VACUUM cannot be executed inside a function or a procedure

---
 src/backend/access/transam/xact.c                  |  2 +-
 .../plpgsql/src/expected/plpgsql_transaction.out   | 13 +++++++++++++
 src/pl/plpgsql/src/sql/plpgsql_transaction.sql     | 14 ++++++++++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 842faa44232..5cf85e2f35c 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -3695,7 +3695,7 @@ PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
 		ereport(ERROR,
 				(errcode(ERRCODE_ACTIVE_SQL_TRANSACTION),
 		/* translator: %s represents an SQL statement name */
-				 errmsg("%s cannot be executed from a function", stmtType)));
+				 errmsg("%s cannot be executed from a function or a procedure", stmtType)));
 
 	/* If we got past IsTransactionBlock test, should be in default state */
 	if (CurrentTransactionState->blockState != TBLOCK_DEFAULT &&
diff --git a/src/pl/plpgsql/src/expected/plpgsql_transaction.out b/src/pl/plpgsql/src/expected/plpgsql_transaction.out
index adff10fa6d6..bcdf7958823 100644
--- a/src/pl/plpgsql/src/expected/plpgsql_transaction.out
+++ b/src/pl/plpgsql/src/expected/plpgsql_transaction.out
@@ -736,6 +736,19 @@ SELECT * FROM test1;
  2 | 
 (2 rows)
 
+-- VACUUM cannot be executed inside a function or a procedure
+CREATE PROCEDURE vacuum_inside_procedure()
+LANGUAGE plpgsql AS $$
+BEGIN
+  VACUUM;
+END;
+$$;
+-- error
+CALL vacuum_inside_procedure();
+ERROR:  VACUUM cannot be executed from a function or a procedure
+CONTEXT:  SQL statement "VACUUM"
+PL/pgSQL function vacuum_inside_procedure() line 3 at SQL statement
+DROP PROCEDURE vacuum_inside_procedure();
 DROP TABLE test1;
 DROP TABLE test2;
 DROP TABLE test3;
diff --git a/src/pl/plpgsql/src/sql/plpgsql_transaction.sql b/src/pl/plpgsql/src/sql/plpgsql_transaction.sql
index c73fca7e03e..5e8da3ec4c4 100644
--- a/src/pl/plpgsql/src/sql/plpgsql_transaction.sql
+++ b/src/pl/plpgsql/src/sql/plpgsql_transaction.sql
@@ -631,6 +631,20 @@ $$;
 SELECT * FROM test1;
 
 
+-- VACUUM cannot be executed inside a function or a procedure
+
+CREATE PROCEDURE vacuum_inside_procedure()
+LANGUAGE plpgsql AS $$
+BEGIN
+  VACUUM;
+END;
+$$;
+
+-- error
+CALL vacuum_inside_procedure();
+
+DROP PROCEDURE vacuum_inside_procedure();
+
 DROP TABLE test1;
 DROP TABLE test2;
 DROP TABLE test3;
-- 
2.52.0

