From 446c23ee5fca547d9bb01fa3d65c90107dfbede6 Mon Sep 17 00:00:00 2001
From: Vignesh C <vignesh21@gmail.com>
Date: Tue, 14 Jul 2026 17:10:58 +0530
Subject: [PATCH v3 3/3] Ignore default_transaction_read_only in sequence sync
 workers

Sequence synchronization updates sequence state via setval(),
which explicitly calls PreventCommandIfReadOnly(). If
default_transaction_read_only is enabled on the subscriber, this
causes sequencesync workers to fail with "cannot execute setval()
in a read-only transaction", even though apply and tablesync workers
are unaffected since they write via direct heap access.

Override default_transaction_read_only to "off" in
SequenceSyncWorkerMain(), so sequence synchronization keeps working
regardless of the subscriber's default setting.
---
 .../replication/logical/sequencesync.c        |  8 +++
 src/test/subscription/t/036_sequences.pl      | 51 +++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git a/src/backend/replication/logical/sequencesync.c b/src/backend/replication/logical/sequencesync.c
index 770fa5de10b..fa74f1edbaa 100644
--- a/src/backend/replication/logical/sequencesync.c
+++ b/src/backend/replication/logical/sequencesync.c
@@ -826,6 +826,14 @@ SequenceSyncWorkerMain(Datum main_arg)
 {
 	int			worker_slot = DatumGetInt32(main_arg);
 
+	/*
+	 * Ignore default_transaction_read_only for sequence synchronization
+	 * workers, as they need to be able to modify sequences regardless of that
+	 * setting.
+	 */
+	SetConfigOption("default_transaction_read_only", "off", PGC_SUSET,
+					PGC_S_OVERRIDE);
+
 	SetupApplyOrSyncWorker(worker_slot);
 
 	start_sequence_sync();
diff --git a/src/test/subscription/t/036_sequences.pl b/src/test/subscription/t/036_sequences.pl
index 8b02b24a7e9..b72860add7f 100644
--- a/src/test/subscription/t/036_sequences.pl
+++ b/src/test/subscription/t/036_sequences.pl
@@ -188,6 +188,57 @@ is($result, '1|f',
 	'REFRESH PUBLICATION will not sync newly published sequence with copy_data as false'
 );
 
+##########
+# Ensure that ALTER SUBSCRIPTION ... REFRESH SEQUENCES can still update
+# sequence values and mark the sequence as ready even when
+# default_transaction_read_only is enabled on the subscriber.
+##########
+
+$node_subscriber->safe_psql(
+	'postgres', qq(
+	ALTER SYSTEM SET default_transaction_read_only = on;
+	SELECT pg_reload_conf();
+));
+
+# Update the existing sequence 'regress_s3' on the publisher
+$node_publisher->safe_psql(
+	'postgres', qq(
+	INSERT INTO regress_seq_test SELECT nextval('regress_s3') FROM generate_series(1,100);
+));
+
+$node_subscriber->safe_psql(
+	'postgres', qq(
+	set default_transaction_read_only = off;
+	ALTER SUBSCRIPTION regress_seq_sub REFRESH SEQUENCES;
+));
+$node_subscriber->poll_query_until('postgres', $synced_query)
+  or die "Timed out while waiting for subscriber to synchronize data";
+
+# Check - sequence value is updated despite default_transaction_read_only
+# being enabled on the subscriber
+$result = $node_subscriber->safe_psql(
+	'postgres', qq(
+	SELECT last_value, is_called FROM regress_s3;
+));
+is($result, '200|t',
+	'REFRESH SEQUENCES updates sequence value with default_transaction_read_only enabled'
+);
+
+# Check - sequence is marked as ready ('r')
+$result = $node_subscriber->safe_psql(
+	'postgres', qq(
+	SELECT srsubstate FROM pg_subscription_rel WHERE srrelid = 'regress_s3'::regclass;
+));
+is($result, 'r',
+	'sequence is marked as ready after REFRESH SEQUENCES with default_transaction_read_only enabled'
+);
+
+$node_subscriber->safe_psql(
+	'postgres', qq(
+	ALTER SYSTEM SET default_transaction_read_only = off;
+	SELECT pg_reload_conf();
+));
+
 ##########
 # ALTER SUBSCRIPTION ... REFRESH PUBLICATION should report an error when:
 # a) sequence definitions differ between the publisher and subscriber, or
-- 
2.50.1 (Apple Git-155)

