008_log_temp_files.pl
application/x-perl
Filename: 008_log_temp_files.pl
Type: application/x-perl
Part: 0
# Copyright (c) 2025, PostgreSQL Global Development Group
# Verify that temp files are logged with the right statement.
use strict;
use warnings FATAL => 'all';
use PostgreSQL::Test::Cluster;
use PostgreSQL::Test::Utils;
use Test::More;
sub check_log
{
my $node = shift;
my $offset = shift;
if ($node->log_contains('STATEMENT: SELECT 1', $offset))
{
ok(0, "The wrong query has been logged");
}
elsif ($node->log_contains('STATEMENT: SELECT a FROM foo ORDER BY a', $offset))
{
ok(1, "The right query has been logged");
}
else
{
ok(0, "No query has been logged");
}
}
my $offset = 0;
my $node = PostgreSQL::Test::Cluster->new('primary');
$node->init();
$node->append_conf(
'postgresql.conf', qq(
work_mem = 64kB
log_temp_files = 0
));
$node->start;
$node->safe_psql("postgres", qq{
CREATE UNLOGGED TABLE foo(a int);
INSERT INTO foo(a) SELECT * FROM generate_series(1, 5000);
VACUUM ANALYZE foo;
});
$offset = -s $node->logfile;
# The following sequence used to logged the second query instead of the first one
$node->safe_psql("postgres", qq{
BEGIN;
SELECT a FROM foo ORDER BY a OFFSET \$1 \\bind 4999 \\g
SELECT 1;
COMMIT;
});
check_log($node, $offset);
$offset = -s $node->logfile;
# The following sequence used to log no query at all
$node->safe_psql("postgres", qq{
SELECT a FROM foo ORDER BY a OFFSET \$1 \\bind 4999 \\g
SELECT 1;
});
check_log($node, $offset);
$offset = -s $node->logfile;
# The following pipelined sequence used to logged the second query instead of the first one
$node->safe_psql("postgres", qq{
\\startpipeline
SELECT a FROM foo ORDER BY a OFFSET \$1 \\bind 4999 \\sendpipeline
SELECT 1;
\\endpipeline
});
check_log($node, $offset);
$node->stop('fast');
done_testing();