From 9d4ddb094d98925546fb51262784cb3aaf9b2109 Mon Sep 17 00:00:00 2001
From: Hou Zhijie <houzj.fnst@cn.fujitsu.com>
Date: Fri, 12 May 2023 17:40:08 +0800
Subject: [PATCH v2] Fix possible logical replication table sync crash

Commit e7e7da2f8d57bbe6c8fb463a9eec51486000ba2e added a new
password_required option but forgot that you need database access
to check whether an arbitrary role ID is a superuser.

e7e7da2f8d57bbe6c8fb463a9eec51486000ba2e fixed a similar bug in apply
worker, and this patch is to fix the similar bug in table sync worker.
---
 src/backend/replication/logical/tablesync.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c
index abae8d44df..db10a446b3 100644
--- a/src/backend/replication/logical/tablesync.c
+++ b/src/backend/replication/logical/tablesync.c
@@ -1262,6 +1262,12 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos)
 	relstate = GetSubscriptionRelState(MyLogicalRepWorker->subid,
 									   MyLogicalRepWorker->relid,
 									   &relstate_lsn);
+
+	/* Is the use of a password mandatory? */
+	must_use_password = MySubscription->passwordrequired &&
+		!superuser_arg(MySubscription->owner);
+
+	/* Note that the superuser_arg call can access the DB */
 	CommitTransactionCommand();
 
 	SpinLockAcquire(&MyLogicalRepWorker->relmutex);
@@ -1288,10 +1294,6 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos)
 									slotname,
 									NAMEDATALEN);
 
-	/* Is the use of a password mandatory? */
-	must_use_password = MySubscription->passwordrequired &&
-		!superuser_arg(MySubscription->owner);
-
 	/*
 	 * Here we use the slot name instead of the subscription name as the
 	 * application_name, so that it is different from the leader apply worker,
-- 
2.30.0.windows.2

