agora inbox for pgsql-hackers@postgresql.org
help / color / mirror / Atom feed[PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
477+ messages / 2 participants
[nested] [flat]
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows
@ 2025-02-13 15:09 Andres Freund <andres@anarazel.de>
0 siblings, 0 replies; 477+ messages in thread
From: Andres Freund @ 2025-02-13 15:09 UTC (permalink / raw)
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
.../perl/PostgreSQL/Test/BackgroundPsql.pm | 55 +++++++++++++++----
1 file changed, 43 insertions(+), 12 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index dbfd82e4fac..7e76845307d 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -89,7 +89,8 @@ sub new
'stdin' => '',
'stdout' => '',
'stderr' => '',
- 'query_timer_restart' => undef
+ 'query_timer_restart' => undef,
+ 'query_cnt' => 1,
};
my $run;
@@ -219,27 +220,57 @@ sub query
my ($self, $query) = @_;
my $ret;
my $output;
+ my $query_cnt = $self->{query_cnt}++;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
- note "issuing query via background psql: $query";
+ note "issuing query $query_cnt via background psql: $query";
$self->{timeout}->start() if (defined($self->{query_timer_restart}));
# Feed the query to psql's stdin, followed by \n (so psql processes the
# line), by a ; (so that psql issues the query, if it doesn't include a ;
- # itself), and a separator echoed with \echo, that we can wait on.
- my $banner = "background_psql: QUERY_SEPARATOR";
- $self->{stdin} .= "$query\n;\n\\echo $banner\n";
-
- pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
+ # itself), and a separator echoed both with \echo and \warn, that we can
+ # wait on.
+ #
+ # To avoid somehow confusing the separator from separately issued queries,
+ # and to make it easier to debug, we include a per-psql query counter in
+ # the separator.
+ #
+ # We need both \echo (printing to stdout) and \warn (printing to stderr),
+ # because on windows we can get data on stdout before seeing data on
+ # stderr (or vice versa), even if psql printed them in the opposite
+ # order. We therefore wait on both.
+ #
+ # We need to match for the newline, because we try to remove it below, and
+ # it's possible to consume just the input *without* the newline. In
+ # interactive psql we emit \r\n, so we need to allow for that. Also need
+ # 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/;
+ $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n";
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stdout}, qr/$banner_match/);
+ pump_until(
+ $self->{run}, $self->{timeout},
+ \$self->{stderr}, qr/$banner_match/);
die "psql query timed out" if $self->{timeout}->is_expired;
+
+ note "query returned:\n",
+ explain {
+ stdout => $self->{stdout},
+ stderr => $self->{stderr},
+ };
+
+ # Remove banner from stdout and stderr, our caller doesn't care. The
+ # first newline is optional, as there would not be one if consuming an
+ # empty query result.
$output = $self->{stdout};
-
- # Remove banner again, our caller doesn't care. The first newline is
- # optional, as there would not be one if consuming an empty query
- # result.
- $output =~ s/\n?$banner\n$//s;
+ $output =~ s/$banner_match//;
+ $self->{stderr} =~ s/$banner_match//;
# clear out output for the next query
$self->{stdout} = '';
--
2.48.1.76.g4e746b1a31.dirty
--sno7qfndt3qie53q--
^ permalink raw reply [nested|flat] 477+ messages in thread
* [PATCH v1 1/1] remove switch statement in vector8_shift_{left,right}
@ 2026-07-02 00:30 Nathan Bossart <nathan@postgresql.org>
0 siblings, 0 replies; 477+ messages in thread
From: Nathan Bossart @ 2026-07-02 00:30 UTC (permalink / raw)
---
src/include/port/simd.h | 29 +++--------------------------
1 file changed, 3 insertions(+), 26 deletions(-)
diff --git a/src/include/port/simd.h b/src/include/port/simd.h
index 50615aec7f4..25a26c81cce 100644
--- a/src/include/port/simd.h
+++ b/src/include/port/simd.h
@@ -548,10 +548,6 @@ vector8_pack_16(const Vector8 v1, const Vector8 v2)
/*
* Unsigned shift left of each 32-bit element in the vector by "i" bits.
- *
- * XXX AArch64 requires an integer literal, so we have to list all expected
- * values of "i" from all callers in a switch statement. If you add a new
- * caller, be sure your expected values of "i" are handled.
*/
#ifndef USE_NO_SIMD
static inline Vector8
@@ -560,24 +556,13 @@ vector8_shift_left(const Vector8 v1, int i)
#ifdef USE_SSE2
return _mm_slli_epi32(v1, i);
#elif defined(USE_NEON)
- switch (i)
- {
- case 4:
- return (Vector8) vshlq_n_u32((Vector32) v1, 4);
- default:
- Assert(false);
- return vector8_broadcast(0);
- }
+ return (Vector8) vshlq_u32((Vector32) v1, vdupq_n_s32(i));
#endif
}
#endif /* ! USE_NO_SIMD */
/*
* Unsigned shift right of each 32-bit element in the vector by "i" bits.
- *
- * XXX AArch64 requires an integer literal, so we have to list all expected
- * values of "i" from all callers in a switch statement. If you add a new
- * caller, be sure your expected values of "i" are handled.
*/
#ifndef USE_NO_SIMD
static inline Vector8
@@ -586,16 +571,8 @@ vector8_shift_right(const Vector8 v1, int i)
#ifdef USE_SSE2
return _mm_srli_epi32(v1, i);
#elif defined(USE_NEON)
- switch (i)
- {
- case 4:
- return (Vector8) vshrq_n_u32((Vector32) v1, 4);
- case 8:
- return (Vector8) vshrq_n_u32((Vector32) v1, 8);
- default:
- Assert(false);
- return vector8_broadcast(0);
- }
+ /* negative shift count means right shift */
+ return (Vector8) vshlq_u32((Vector32) v1, vdupq_n_s32(-i));
#endif
}
#endif /* ! USE_NO_SIMD */
--
2.50.1 (Apple Git-155)
--9YipY07vKHAnXga/--
^ permalink raw reply [nested|flat] 477+ messages in thread
end of thread, other threads:[~2026-07-02 00:30 UTC | newest]
Thread overview: 477+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2025-02-13 15:09 [PATCH v1] BackgroundPsql: Fix potential for lost errors on windows Andres Freund <andres@anarazel.de>
2026-07-02 00:30 [PATCH v1 1/1] remove switch statement in vector8_shift_{left,right} Nathan Bossart <nathan@postgresql.org>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox