Cluster.pm psql() undefined $$stderr

Oleg Tselebrovskiy <o.tselebrovskiy@postgrespro.ru>

From: Oleg Tselebrovskiy <o.tselebrovskiy@postgrespro.ru>
To: pgsql-hackers@postgresql.org
Date: 2025-06-04T14:01:54Z
Lists: pgsql-hackers

Attachments

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)

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

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)

Regards, Oleg Tselebrovskiy

Commits

  1. Avoid uninitialized value error in TAP tests' Cluster->psql