From d9702ce17f2f78d4c5139a241a69c432823f8233 Mon Sep 17 00:00:00 2001
From: EC2 Default User <ec2-user@ip-172-31-22-197.ec2.internal>
Date: Wed, 13 Dec 2023 19:20:12 +0000
Subject: [PATCH 1/1] Force autovacuum to use bootstrap superuser

---
 src/backend/postmaster/autovacuum.c | 7 +++++++
 src/backend/utils/init/miscinit.c   | 2 +-
 src/include/miscadmin.h             | 1 +
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index b04fcfc8c8..f468661916 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -75,6 +75,7 @@
 #include "access/xact.h"
 #include "catalog/dependency.h"
 #include "catalog/namespace.h"
+#include "catalog/pg_authid.h"
 #include "catalog/pg_database.h"
 #include "commands/dbcommands.h"
 #include "commands/vacuum.h"
@@ -2025,6 +2026,12 @@ do_autovacuum(void)
 										  ALLOCSET_DEFAULT_SIZES);
 	MemoryContextSwitchTo(AutovacMemCxt);
 
+	/*
+	 * Autovacuum must be run as superuser, so set the session userid to the
+	 * bootstrap superuser id.
+	 */
+	SetSessionUserId(BOOTSTRAP_SUPERUSERID, true);
+
 	/* Start a transaction so our commands have one to play into. */
 	StartTransactionCommand();
 
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index 819936ec02..10bc2add2a 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -546,7 +546,7 @@ GetSessionUserId(void)
 }
 
 
-static void
+void
 SetSessionUserId(Oid userid, bool is_superuser)
 {
 	Assert(SecurityRestrictionContext == 0);
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index 1043a4d782..4f56c85333 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -354,6 +354,7 @@ extern char *GetUserNameFromId(Oid roleid, bool noerr);
 extern Oid	GetUserId(void);
 extern Oid	GetOuterUserId(void);
 extern Oid	GetSessionUserId(void);
+extern void	SetSessionUserId(Oid userid, bool is_superuser);
 extern Oid	GetAuthenticatedUserId(void);
 extern void GetUserIdAndSecContext(Oid *userid, int *sec_context);
 extern void SetUserIdAndSecContext(Oid userid, int sec_context);
-- 
2.40.1

