From 37e6fcdf9e10aecb6aab08952c449aca98b35e10 Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Thu, 30 Jul 2026 13:38:17 -0700
Subject: [PATCH v3 05/11] Build subscription conninfo after checking that it's
 enabled.

If a subscription is disabled, don't try to build conninfo because
that may generate a confusing error and try to disable an
already-disabled subscription.

Partially addresses finding 5 in report from linked discussion.

Reported-by: Noah Misch <noah@leadboat.com>
Discussion: https://postgr.es/m/20260710195902.4f.noahmisch%40microsoft.com
Backpatch-through: 19
---
 src/backend/replication/logical/worker.c | 28 +++++++++++++++---------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index 74409fc9202..1cdd28f5049 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -5099,9 +5099,6 @@ maybe_reread_subscription(void)
 		proc_exit(0);
 	}
 
-	/* allocated in transaction context */
-	new_conninfo = SubscriptionConninfo(newsub, true);
-
 	/* Exit if the subscription was disabled. */
 	if (!newsub->enabled)
 	{
@@ -5112,6 +5109,13 @@ maybe_reread_subscription(void)
 		apply_worker_exit();
 	}
 
+	/*
+	 * May raise error, so build conninfo after checking that the subscription
+	 * is enabled. Allocated in transaction context; must be copied to
+	 * ApplyContext when we set MySubscriptionConninfo.
+	 */
+	new_conninfo = SubscriptionConninfo(newsub, true);
+
 	/* !slotname should never happen when enabled is true. */
 	Assert(newsub->slotname);
 
@@ -5859,13 +5863,6 @@ InitializeLogRepWorker(void)
 		proc_exit(0);
 	}
 
-	/* build conninfo in transaction context and copy to ApplyContext */
-	MySubscriptionConninfo =
-		MemoryContextStrdup(ApplyContext,
-							SubscriptionConninfo(MySubscription, true));
-
-	MySubscriptionValid = true;
-
 	if (!MySubscription->enabled)
 	{
 		ereport(LOG,
@@ -5875,6 +5872,17 @@ InitializeLogRepWorker(void)
 		apply_worker_exit();
 	}
 
+	/*
+	 * May raise error for server-based subscriptions, so build conninfo after
+	 * checking that the subscription is enabled. Build in transaction context
+	 * and copy to ApplyContext.
+	 */
+	MySubscriptionConninfo =
+		MemoryContextStrdup(ApplyContext,
+							SubscriptionConninfo(MySubscription, true));
+
+	MySubscriptionValid = true;
+
 	/*
 	 * Restart the worker if retain_dead_tuples was enabled during startup.
 	 *
-- 
2.43.0

