From 7bd670d85c80fb3a71cbf7cb78b1a4897502e7b0 Mon Sep 17 00:00:00 2001 From: Soumya S Murali 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 --- .../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