From: | Andrew Dunstan <andrew(at)dunslane(dot)net> |
---|---|
To: | Oleg Tselebrovskiy <o(dot)tselebrovskiy(at)postgrespro(dot)ru>, pgsql-hackers(at)postgresql(dot)org |
Subject: | Re: Cluster.pm psql() undefined $$stderr |
Date: | 2025-06-13 14:53:50 |
Message-ID: | 3a142f7b-2da6-4171-9455-f95ca2f09bd7@dunslane.net |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
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
Attachment | Content-Type | Size |
---|---|---|
fix-cluster-stderr.patch | text/x-patch | 495 bytes |
From | Date | Subject | |
---|---|---|---|
Next Message | Rahila Syed | 2025-06-13 15:01:22 | Re: add function for creating/attaching hash table in DSM registry |
Previous Message | John Naylor | 2025-06-13 14:12:03 | Re: Vacuum ERRORs out considering freezing dead tuples from before OldestXmin |