From 57f1ba7070d83c8680969c9475f20be1de827260 Mon Sep 17 00:00:00 2001 From: Jelte Fennema-Nio Date: Mon, 26 Jan 2026 09:32:15 +0100 Subject: [PATCH v4 3/5] perl tap: Show die reason in TAP output In our Perl tests the most commonly used function is probably safe_psql. But if that call failed you would get this totally useless output in the meson output: Tests were run but no plan was declared and done_testing() was not seen. Looks like your test exited with 29 just after 21. With this change you get the actual failure reason too: die: error running SQL: 'psql::2: ERROR: unterminated quoted string at or near "'" LINE 1: GRANT ALL ON sysuser_data TO scram_role ' ^' while running 'psql --no-psqlrc --no-align --tuples-only --quiet --dbname port=17335 host=/tmp/y9KX6JADha dbname='postgres' --file - --variable ON_ERROR_STOP=1' with sql 'CREATE TABLE sysuser_data (n) AS SELECT NULL FROM generate_series(1, 10); GRANT ALL ON sysuser_data TO scram_role '' at /home/jelte/work/postgres-3/src/test/perl/PostgreSQL/Test/Cluster.pm line 2300. Looks like your test exited with 29 just after 21. Discussion: https://www.postgresql.org/message-id/20220222181924.eehi7o4pmneeb4hm%40alap3.anarazel.de Discussion: https://www.postgresql.org/message-id/flat/DFYFWM053WHS.10K8ZPJ605UFK@jeltef.nl --- src/test/perl/PostgreSQL/Test/Utils.pm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 04e4a4692b3..22c9078daa9 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -244,6 +244,24 @@ INIT autoflush STDOUT 1; autoflush STDERR 1; autoflush $testlog 1; + + # Because of the above redirection the tap output wouldn't contain + # information about tests failing due to die etc. Fix that by also + # printing the failure to the original stderr. + $SIG{__DIE__} = sub { + # Ignore dies because of syntax errors, those will be displayed + # correctly anyway. + return if !defined $^S; + + # Ignore dies inside evals + return if $^S == 1; + + diag("die: $_[0]"); + # Also call done_testing() to avoid the confusing "no plan was declared" + # message in TAP output when a test dies. + eval { done_testing(); } + }; + } END -- 2.53.0