diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/backend/tcop/postgres.c | 10 | ||||
| -rw-r--r-- | src/test/modules/test_misc/t/009_log_temp_files.pl | 33 |
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; |
