Fix psql's behavior with \g for a multiple-command string.
authorTom Lane <[email protected]>
Mon, 3 Oct 2022 19:07:10 +0000 (15:07 -0400)
committerTom Lane <[email protected]>
Mon, 3 Oct 2022 19:07:10 +0000 (15:07 -0400)
commit595580aa1243df5f199516ff11a27ba9680e6904
tree067acbc5736f933f26f5c2e7b5b3bb4c38a8a941
parentb1c73e1cf1ffdfedeed4f2cd7f34247dcad308bf
Fix psql's behavior with \g for a multiple-command string.

The pre-v15 behavior was to discard all but the last result,
but with the new behavior of printing all results by default,
we will send each such result to the \g file.  However,
we're still opening and closing the \g file for each result,
so you lose all but the last result anyway.  Move the output-file
state up to ExecQueryAndProcessResults so that we open/close the
\g file only once per command string.

To support this without changing other behavior, we must
adjust PrintQueryResult to have separate FILE * arguments
for query and status output (since status output has never
gone to the \g file).  That in turn makes it a good idea
to push the responsibility for fflush'ing output down to
PrintQueryTuples and PrintQueryStatus.

Also fix an infinite loop if COPY IN/OUT is attempted in \watch.
We used to reject that, but that error exit path got broken
somewhere along the line in v15.  There seems no real reason
to reject it anyway as the code now stands, so just remove
the error exit and make sure that COPY OUT data goes to the
right place.

Also remove PrintQueryResult's unused is_watch parameter,
and make some other cosmetic cleanups (adjust obsolete
comments, break some overly-long lines).

Daniel Vérité and Tom Lane

Discussion: https://postgr.es/m/4333844c-2244-4d6e-a49a-1d483fbe304f@manitou-mail.org
src/bin/psql/common.c