From 7bd670d85c80fb3a71cbf7cb78b1a4897502e7b0 Mon Sep 17 00:00:00 2001
From: Soumya S Murali <soumyamurali.work@gmail.com>
Date: Fri, 2 Jan 2026 15:21:13 +0530
Subject: [PATCH] Fix authentication test failure with or without readline

Signed-off-by: Soumya S Murali <soumyamurali.work@gmail.com>
---
 .../perl/PostgreSQL/Test/BackgroundPsql.pm    | 28 ++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index 60bbd5dd445..549032c07a1 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -155,11 +155,12 @@ sub wait_connect
 	#
 	# See query() for details about why/how the banner is used.
 	my $banner = "background_psql: ready";
-	my $banner_match = qr/(^|\n)$banner\r?\n/;
+	my $banner_match = qr/\Q$banner\E/;
+
 	$self->{stdin} .= "\\echo $banner\n\\warn $banner\n";
 	$self->{run}->pump()
 	  until ($self->{stdout} =~ /$banner_match/
-		  && $self->{stderr} =~ /$banner\r?\n/)
+		  && $self->{stderr} =~ /(^|\n)\Q$banner\E\r?\n/)
 	  || $self->{timeout}->is_expired;
 
 	note "connect output:\n",
@@ -265,14 +266,18 @@ sub query
 	# to be careful that we don't e.g. match the echoed \echo command, rather
 	# than its output.
 	my $banner = "background_psql: QUERY_SEPARATOR $query_cnt:";
-	my $banner_match = qr/(^|\n)$banner\r?\n/;
+	my $banner_detect_stdout = qr/\Q$banner\E/;
+	my $banner_detect_stderr = qr/(^|\n)\Q$banner\E\r?\n/;
+	# strict cleanup regex (must be line-based)
+	my $banner_cleanup = $banner_detect_stderr;
+	
 	$self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
 	pump_until(
 		$self->{run}, $self->{timeout},
-		\$self->{stdout}, qr/$banner_match/);
+		\$self->{stdout}, $banner_detect_stdout);
 	pump_until(
 		$self->{run}, $self->{timeout},
-		\$self->{stderr}, qr/$banner_match/);
+		\$self->{stderr}, $banner_detect_stderr);
 
 	die "psql query timed out" if $self->{timeout}->is_expired;
 
@@ -286,8 +291,17 @@ sub query
 	# first newline is optional, as there would not be one if consuming an
 	# empty query result.
 	$output = $self->{stdout};
-	$output =~ s/$banner_match//;
-	$self->{stderr} =~ s/$banner_match//;
+	if ($output =~ s/$banner_detect_stderr//)
+	{
+		# cleaned via strict match
+	}
+	else
+	{
+		# fallback for non-readline output where banner may be inline
+		$output =~ s/\Q$banner\E//;
+	}
+
+	$self->{stderr} =~ s/$banner_detect_stderr//;
 
 	# clear out output for the next query
 	$self->{stdout} = '';
-- 
2.34.1

