@ -7,6 +7,7 @@ use warnings;
use PostgresNode ;
use PostgresNode ;
use TestLib ;
use TestLib ;
use Test::More tests = > 2 ;
use Test::More tests = > 2 ;
use Time::HiRes qw( usleep ) ;
my $ tempdir = TestLib:: tempdir ;
my $ tempdir = TestLib:: tempdir ;
@ -28,19 +29,37 @@ SKIP: {
my ( $ stdin , $ stdout , $ stderr ) ;
my ( $ stdin , $ stdout , $ stderr ) ;
# Test whether shell supports $PPID. It's part of POSIX, but some
# Test whether shell supports $PPID. It's part of POSIX, but some
# pre-/non-POSIX shells don't support it (e.g., NetBSD, Solaris ).
# pre-/non-POSIX shells don't support it (e.g., NetBSD).
$ stdin = "\\! echo \$PPID" ;
$ stdin = "\\! echo \$PPID" ;
IPC::Run:: run ( [ 'psql' , '-X' , '-v' , 'ON_ERROR_STOP=1' ] , '<' , \ $ stdin , '>' , \ $ stdout , '2>' , \ $ stderr ) ;
IPC::Run:: run ( [ 'psql' , '-X' , '-v' , 'ON_ERROR_STOP=1' ] , '<' , \ $ stdin , '>' , \ $ stdout , '2>' , \ $ stderr ) ;
$ stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID" , 2 ;
$ stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID" , 2 ;
local $ SIG { ALRM } = sub {
# Now start the real test
my $ psql_pid = TestLib:: slurp_file ( "$tempdir/psql.pid" ) ;
my $ h = IPC::Run:: start ( [ 'psql' , '-X' , '-v' , 'ON_ERROR_STOP=1' ] , \ $ stdin , \ $ stdout , \ $ stderr ) ;
kill 'INT' , $ psql_pid ;
} ;
alarm 1 ;
$ stdin = "\\! echo \$PPID >$tempdir/psql.pid\nselect pg_sleep(3);" ;
# Get the PID
my $ result = IPC::Run:: run ( [ 'psql' , '-X' , '-v' , 'ON_ERROR_STOP=1' ] , '<' , \ $ stdin , '>' , \ $ stdout , '2>' , \ $ stderr ) ;
$ stdout = '' ;
$ stderr = '' ;
$ stdin = "\\! echo \$PPID >$tempdir/psql.pid\n" ;
pump $ h while length $ stdin ;
my $ count ;
my $ psql_pid ;
until ( - s "$tempdir/psql.pid" and ( $ psql_pid = TestLib:: slurp_file ( "$tempdir/psql.pid" ) ) =~ /^\d+\n/s )
{
( $ count + + < 180 * 100 ) or die "pid file did not appear" ;
usleep ( 10_000 )
}
# Send sleep command and wait until the server has registered it
$ stdin = "select pg_sleep(180);\n" ;
pump $ h while length $ stdin ;
$ node - > poll_query_until ( 'postgres' , q{ SELECT (SELECT count(*) FROM pg_stat_activity WHERE query ~ 'pg_sleep') > 0; } )
or die "timed out" ;
# Send cancel request
kill 'INT' , $ psql_pid ;
my $ result = finish $ h ;
ok ( ! $ result , 'query failed as expected' ) ;
ok ( ! $ result , 'query failed as expected' ) ;
like ( $ stderr , qr/canceling statement due to user request/ , 'query was canceled' ) ;
like ( $ stderr , qr/canceling statement due to user request/ , 'query was canceled' ) ;