# 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();
