<para>
If successfully created, a named portal object lasts till the end of the
current transaction, unless explicitly destroyed. An unnamed portal is
- destroyed at the end of the transaction, or as soon as the next Bind
- statement specifying the unnamed portal as destination is issued. (Note
+ destroyed at the end of the transaction, or as soon as the statement
+ specifying the unnamed portal as destination is processed to completion. (Note
that a simple Query message also destroys the unnamed portal.) Named
portals must be explicitly closed before they can be redefined by another
Bind message, but this is not required for the unnamed portal.
* 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 */
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{
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;
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{
\\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;