diff --git a/src/backend/distributed/executor/multi_utility.c b/src/backend/distributed/executor/multi_utility.c index 620f71934..d39ad7ef1 100644 --- a/src/backend/distributed/executor/multi_utility.c +++ b/src/backend/distributed/executor/multi_utility.c @@ -1555,10 +1555,18 @@ ProcessVacuumStmt(VacuumStmt *vacuumStmt, const char *vacuumCommand) taskList = VacuumTaskList(relationId, vacuumStmt); - /* save old commit protocol to restore at xact end */ - Assert(SavedMultiShardCommitProtocol == COMMIT_PROTOCOL_BARE); - SavedMultiShardCommitProtocol = MultiShardCommitProtocol; - MultiShardCommitProtocol = COMMIT_PROTOCOL_BARE; + /* + * VACUUM commands cannot run inside a transaction block, so we use + * the "bare" commit protocol without BEGIN/COMMIT. However, ANALYZE + * commands can run inside a transaction block. + */ + if ((vacuumStmt->options & VACOPT_VACUUM) != 0) + { + /* save old commit protocol to restore at xact end */ + Assert(SavedMultiShardCommitProtocol == COMMIT_PROTOCOL_BARE); + SavedMultiShardCommitProtocol = MultiShardCommitProtocol; + MultiShardCommitProtocol = COMMIT_PROTOCOL_BARE; + } ExecuteModifyTasksWithoutResults(taskList); } diff --git a/src/test/regress/expected/multi_utilities.out b/src/test/regress/expected/multi_utilities.out index 0f29d0063..85b3fe432 100644 --- a/src/test/regress/expected/multi_utilities.out +++ b/src/test/regress/expected/multi_utilities.out @@ -25,6 +25,11 @@ COPY sharded_table TO STDOUT; COPY (SELECT COUNT(*) FROM sharded_table) TO STDOUT; 0 COMMIT; +-- ANALYZE is supported in a transaction block +BEGIN; +ANALYZE sharded_table; +ANALYZE sharded_table; +END; -- cursors may not involve distributed tables DECLARE all_sharded_rows CURSOR FOR SELECT * FROM sharded_table; ERROR: DECLARE CURSOR can only be used in transaction blocks diff --git a/src/test/regress/sql/multi_utilities.sql b/src/test/regress/sql/multi_utilities.sql index 0e84a9226..f3558c513 100644 --- a/src/test/regress/sql/multi_utilities.sql +++ b/src/test/regress/sql/multi_utilities.sql @@ -20,6 +20,12 @@ COPY sharded_table TO STDOUT; COPY (SELECT COUNT(*) FROM sharded_table) TO STDOUT; COMMIT; +-- ANALYZE is supported in a transaction block +BEGIN; +ANALYZE sharded_table; +ANALYZE sharded_table; +END; + -- cursors may not involve distributed tables DECLARE all_sharded_rows CURSOR FOR SELECT * FROM sharded_table;