mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Prevent "\g filename" from affecting subsequent commands after an error.
In the previous coding, psql's state variable saying that output should go to a file was only reset after successful completion of a query returning tuples. Thus for example, regression=# select 1/0 regression-# \g somefile ERROR: division by zero regression=# select 1/2; regression=# ... huh, I wonder where that output went. Even more oddly, the state was not reset even if it's the file that's causing the failure: regression=# select 1/2 \g /foo /foo: Permission denied regression=# select 1/2; /foo: Permission denied regression=# select 1/2; /foo: Permission denied This seems to me not to satisfy the principle of least surprise. \g is certainly not documented in a way that suggests its effects are at all persistent. To fix, adjust the code so that the flag is reset at exit from SendQuery no matter what happened. Noted while reviewing the \gset patch, which had comparable issues. Arguably this is a bug fix, but I'll refrain from back-patching for now.
This commit is contained in:
@ -1608,9 +1608,13 @@ Tue Oct 26 21:40:57 CEST 1999
|
||||
optionally stores the query's output in <replaceable
|
||||
class="parameter">filename</replaceable> or pipes the output
|
||||
into a separate Unix shell executing <replaceable
|
||||
class="parameter">command</replaceable>. A bare
|
||||
<literal>\g</literal> is virtually equivalent to a semicolon. A
|
||||
<literal>\g</literal> with argument is a <quote>one-shot</quote>
|
||||
class="parameter">command</replaceable>. The file or command is
|
||||
written to only if the query successfully returns zero or more tuples,
|
||||
not if the query fails or is a non-data-returning SQL command.
|
||||
</para>
|
||||
<para>
|
||||
A bare <literal>\g</literal> is essentially equivalent to a semicolon.
|
||||
A <literal>\g</literal> with argument is a <quote>one-shot</quote>
|
||||
alternative to the <command>\o</command> command.
|
||||
</para>
|
||||
</listitem>
|
||||
|
Reference in New Issue
Block a user