From 4eed90c39041f34f4d0cb4db40d876faa4b1d1b0 Mon Sep 17 00:00:00 2001
From: Vignesh C <vignesh21@gmail.com>
Date: Thu, 6 Nov 2025 10:24:31 +0530
Subject: [PATCH v2] Fix tap test failure with verbose log output and quoting
 issue in sequence queries

The tap test failed on buildfarm member prion because it runs with
log_error_verbosity = verbose, which adds an extra LOCATION: line between
the WARNING and ERROR messages. Update the test to check only for the
WARNING message to make it independent of verbosity settings.

Also fix an issue where sequences with quotes in their names failed during
remote information fetch, as quote_literal_cstr() was not used when
querying sequence information.
---
 src/backend/replication/logical/sequencesync.c | 11 +++++++++--
 src/test/subscription/t/036_sequences.pl       | 14 ++++++++++++--
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/backend/replication/logical/sequencesync.c b/src/backend/replication/logical/sequencesync.c
index 717c82328f2..a8a39bec508 100644
--- a/src/backend/replication/logical/sequencesync.c
+++ b/src/backend/replication/logical/sequencesync.c
@@ -60,6 +60,7 @@
 #include "replication/logicalworker.h"
 #include "replication/worker_internal.h"
 #include "utils/acl.h"
+#include "utils/builtins.h"
 #include "utils/fmgroids.h"
 #include "utils/guc.h"
 #include "utils/inval.h"
@@ -407,14 +408,20 @@ copy_sequences(WalReceiverConn *conn)
 
 		for (int idx = cur_batch_base_index; idx < n_seqinfos; idx++)
 		{
+			char	   *nspname_literal;
+			char	   *seqname_literal;
+
 			LogicalRepSequenceInfo *seqinfo =
 				(LogicalRepSequenceInfo *) list_nth(seqinfos, idx);
 
 			if (seqstr->len > 0)
 				appendStringInfoString(seqstr, ", ");
 
-			appendStringInfo(seqstr, "(\'%s\', \'%s\', %d)",
-							 seqinfo->nspname, seqinfo->seqname, idx);
+			nspname_literal = quote_literal_cstr(seqinfo->nspname);
+			seqname_literal = quote_literal_cstr(seqinfo->seqname);
+
+			appendStringInfo(seqstr, "(%s, %s, %d)",
+							 nspname_literal, seqname_literal, idx);
 
 			if (++batch_size == MAX_SEQUENCES_SYNC_PER_BATCH)
 				break;
diff --git a/src/test/subscription/t/036_sequences.pl b/src/test/subscription/t/036_sequences.pl
index d34b0e4ae2f..9d6c9e8b200 100644
--- a/src/test/subscription/t/036_sequences.pl
+++ b/src/test/subscription/t/036_sequences.pl
@@ -22,6 +22,7 @@ $node_subscriber->start;
 my $ddl = qq(
 	CREATE TABLE regress_seq_test (v BIGINT);
 	CREATE SEQUENCE regress_s1;
+	CREATE SEQUENCE "regress'quote";
 );
 $node_publisher->safe_psql('postgres', $ddl);
 
@@ -32,6 +33,7 @@ $ddl = qq(
 	CREATE SEQUENCE regress_s1;
 	CREATE SEQUENCE regress_s2;
 	CREATE SEQUENCE regress_s3;
+	CREATE SEQUENCE "regress'quote";
 );
 $node_subscriber->safe_psql('postgres', $ddl);
 
@@ -40,6 +42,7 @@ $node_publisher->safe_psql(
 	'postgres', qq(
 	-- generate a number of values using the sequence
 	INSERT INTO regress_seq_test SELECT nextval('regress_s1') FROM generate_series(1,100);
+	INSERT INTO regress_seq_test SELECT nextval('"regress''quote"') FROM generate_series(1,100);
 ));
 
 # Setup logical replication pub/sub
@@ -63,6 +66,13 @@ my $result = $node_subscriber->safe_psql(
 ));
 is($result, '100|t', 'initial test data replicated');
 
+$result = $node_subscriber->safe_psql(
+	'postgres', qq(
+	SELECT last_value, is_called FROM "regress'quote";
+));
+is($result, '100|t',
+	'initial test data replicated for sequence name having quotes');
+
 ##########
 ## ALTER SUBSCRIPTION ... REFRESH PUBLICATION should cause sync of new
 # sequences of the publisher, but changes to existing sequences should
@@ -201,14 +211,14 @@ $node_subscriber->safe_psql('postgres',
 # Verify that an error is logged for parameter differences on sequence
 # ('regress_s4').
 $node_subscriber->wait_for_log(
-	qr/WARNING: ( [A-Z0-9]+:)? mismatched or renamed sequence on subscriber \("public.regress_s4"\)\n.*ERROR: ( [A-Z0-9]+:)? logical replication sequence synchronization failed for subscription "regress_seq_sub"/,
+	qr/WARNING: ( [A-Z0-9]+:)? mismatched or renamed sequence on subscriber \("public.regress_s4"\)/,
 	$log_offset);
 
 # Verify that an error is logged for the missing sequence ('regress_s4').
 $node_publisher->safe_psql('postgres', qq(DROP SEQUENCE regress_s4;));
 
 $node_subscriber->wait_for_log(
-	qr/WARNING: ( [A-Z0-9]+:)? missing sequence on publisher \("public.regress_s4"\)\n.*ERROR: ( [A-Z0-9]+:)? logical replication sequence synchronization failed for subscription "regress_seq_sub"/,
+	qr/WARNING: ( [A-Z0-9]+:)? missing sequence on publisher \("public.regress_s4"\)/,
 	$log_offset);
 
 done_testing();
-- 
2.43.0

