summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/tcop/postgres.c10
-rw-r--r--src/test/modules/test_misc/t/009_log_temp_files.pl33
2 files changed, 27 insertions, 16 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 7dd75a490aa..2bd89102686 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -2327,6 +2327,16 @@ exec_execute_message(const char *portal_name, long max_rows)
* message. The next protocol message will start a fresh timeout.
*/
disable_statement_timeout();
+
+ /*
+ * We completed fetching from an unnamed portal. There is no need
+ * for it beyond this point, so drop it now rather than wait for
+ * the next Bind message to do this cleanup. This ensures that
+ * the correct statement is logged when cleaning up temporary file
+ * usage.
+ */
+ if (portal->name[0] == '\0')
+ PortalDrop(portal, false);
}
/* Send appropriate CommandComplete to client */
diff --git a/src/test/modules/test_misc/t/009_log_temp_files.pl b/src/test/modules/test_misc/t/009_log_temp_files.pl
index 462a949e411..7ecd301ae29 100644
--- a/src/test/modules/test_misc/t/009_log_temp_files.pl
+++ b/src/test/modules/test_misc/t/009_log_temp_files.pl
@@ -29,7 +29,7 @@ CREATE UNLOGGED TABLE foo(a int);
INSERT INTO foo(a) SELECT * FROM generate_series(1, 5000);
});
-note "unnamed portal: temporary file dropped under second SELECT query";
+note "unnamed portal: temporary file dropped under first SELECT query";
my $log_offset = -s $node->logfile;
$node->safe_psql(
"postgres", qq{
@@ -39,22 +39,23 @@ SELECT 'unnamed portal';
END;
});
ok( $node->log_contains(
- qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT 'unnamed portal'/s,
+ qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT a FROM foo ORDER BY a OFFSET \$1/s,
$log_offset),
"unnamed portal");
-note "bind and implicit transaction: temporary file dropped without query";
+note
+ "bind and implicit transaction: temporary file dropped under single query";
$log_offset = -s $node->logfile;
$node->safe_psql(
"postgres", qq{
SELECT a FROM foo ORDER BY a OFFSET \$1 \\bind 4991 \\g
});
-ok( $node->log_contains(qr/LOG:\s+temporary file:/s, $log_offset),
- "bind and implicit transaction, temporary file removed");
-ok( !$node->log_contains(qr/STATEMENT:/s, $log_offset),
- "bind and implicit transaction, no statement logged");
+ok( $node->log_contains(
+ qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT a FROM foo ORDER BY a OFFSET \$1/s,
+ $log_offset),
+ "bind and implicit transaction");
-note "named portal: temporary file dropped under second SELECT query";
+note "named portal: temporary file dropped under first SELECT query";
$node->safe_psql(
"postgres", qq{
BEGIN;
@@ -64,11 +65,11 @@ SELECT 'named portal';
END;
});
ok( $node->log_contains(
- qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT 'named portal'/s,
+ qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT a FROM foo ORDER BY a OFFSET \$1/s,
$log_offset),
"named portal");
-note "pipelined query: temporary file dropped under second SELECT query";
+note "pipelined query: temporary file dropped under first SELECT query";
$log_offset = -s $node->logfile;
$node->safe_psql(
"postgres", qq{
@@ -78,21 +79,21 @@ SELECT 'pipelined query';
\\endpipeline
});
ok( $node->log_contains(
- qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT 'pipelined query'/s,
+ qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT a FROM foo ORDER BY a OFFSET \$1/s,
$log_offset),
"pipelined query");
-note "parse and bind: temporary file dropped without query";
+note "parse and bind: temporary file dropped under SELECT query";
$log_offset = -s $node->logfile;
$node->safe_psql(
"postgres", qq{
SELECT a, a, a FROM foo ORDER BY a OFFSET \$1 \\parse p1
\\bind_named p1 4993 \\g
});
-ok($node->log_contains(qr/LOG:\s+temporary file:/s, $log_offset),
- "parse and bind, temporary file removed");
-ok(!$node->log_contains(qr/STATEMENT:/s, $log_offset),
- "bind and bind, no statement logged");
+ok( $node->log_contains(
+ qr/LOG:\s+temporary file: path.*\n.*\ STATEMENT:\s+SELECT a, a, a FROM foo ORDER BY a OFFSET \$1/s,
+ $log_offset),
+ "parse and bind");
note "simple query: temporary file dropped under SELECT query";
$log_offset = -s $node->logfile;