On 2025-06-04 We 10:01 AM, Oleg Tselebrovskiy wrote:
Greetings, everyone!

If you call node->psql in not-array context, with on_error_die => 1,
but without passing stderr, you will get the following error
and the test will die, but not the way we expect:

    Use of uninitialized value in concatenation (.) or string at
    /path/to/source_code/src/test/perl/PostgreSQL/Test/Cluster.pm line 2258

This is because $$stderr is not defined in this case
and warnings became FATAL some time ago.

The code string in question for clarity:
    ...
    die
        "error running SQL: '$$stderr'\n..."
        if $ret == 3;

Minimal reproduction is:

    $node->psql('postgres', q{SELEC 1}, on_error_die => 1);

This can be reproduced at current master (30c15987)

Undefined $$stderr also should break dying on recieving a signal, here:

    # We always die on signal.
    if (defined $ret)
    {
        ... die (".... $$stderr ...");

One of the ways to fix this is to initialize $$stderr with some value
to avoid Perl error (Use of uninitialized value) and replace it with
existing error: "error running SQL: '$$stderr'\n ..."

With this approach we don't lose any useful error messages in regress_log_*

The proposed patch is attached (0001)


I think we need to do something slightly earlier than that. Attached is what I propose.



---------------------------------------------------------------------------

Another question I've stumbled upon when trying to fix the aforementioned
issue is the following: Does redirecting IPC::Run::run streams work with
Postgres Perl module SimpleTee? I've tried to use it to "tee" STDERR to
both $$stderr and to test's regress_log_* file. I'm not sure I'm doing
this right, but I have not found a way to use SimpleTee with IPC::Run::run

Is there a way to use them together?

I've tried something like (0002)



I think the short answer is no, we've already hijacked STDOUT/STDERR in Utils.pm to point to the log file, and you shouldn't mess with them. I don't think you're using SimpleTee correctly anyway, but it's really not meant for general use, only for the use in Utils.pm.


cheers


andrew


--
Andrew Dunstan
EDB: https://www.enterprisedb.com
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index 1c11750ac1d..773f291ac9b 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -2199,6 +2199,14 @@ sub psql
 			$ret = $?;
 		};
 		my $exc_save = $@;
+
+		# we need a dummy $stderr from hereon, if we didn't collect it
+		if (! defined $stderr)
+		{
+			my $errtxt = "<not collected>";
+			$stderr = \$errtxt;
+		}
+
 		if ($exc_save)
 		{
 

Reply via email to