Re: Alternative to \copy in psql modelled after \g
Fabien COELHO <coelho@cri.ensmp.fr>
From: Fabien COELHO <coelho@cri.ensmp.fr>
To: Daniel Verite <daniel@manitou-mail.org>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>,
"David G. Johnston" <david.g.johnston@gmail.com>
Date: 2018-12-25T15:38:39Z
Lists: pgsql-hackers
Bonjour Daniel, >> But the copy-workflow and non-copy-workflow are different, and in >> order to know which one to start, \g would need to analyze the query > > It turns out I was wrong on this. The workflows are different but when > psql receives the first PGresult, it's still time to handle the I/O > redirection. It just differs from \copy in the case of an error: > \copy won't even send a command to the server if the local output > stream can't be opened, whereas COPY \g would send the command, and > will have to deal with the client-side error afterwards. > > Well, except that up to now, COPY ... TO STDOUT \g file or \g |command > has been ignoring "file" or "|command", which is arguably a bug as Tom > puts it in another discussion in [1]. > > So as a replacement for the \copyto I was proposing earlier, PFA a patch > for COPY TO STDOUT to make use of the argument to \g. Patch applies cleanly, compiles, make check is ok. However, it does not contain any tests (bad:-) nor documentation (hmmm... maybe none needed, though). Is this just kind of a bug fix? Beforehand the documentation says "\g fn" sends to file, but that was not happening with COPY, and now it does as it says? A question: if opening the output file fails, should not the query be cancelled and an error be reported? Maybe it is too late for that. It seems that "SELECT pg_sleep(10) \g /bad/file" fails but executes the query nevertheless. ISTM that overriding copystream on open failures is not necessary, because its value is already NULL in this case. I'd suggest that is_pipe should be initialized to false, otherwise it is unclear from the code when it is set before use, and some compilers may complain. -- Fabien.
Commits
-
Fix psql's "\g target" meta-command to work with COPY TO STDOUT.
- cda1e27fb706 9.5.16 landed
- ae4c7d5ab886 9.6.12 landed
- 8e97a97b3206 10.7 landed
- 6d3ede5f1c65 12.0 landed
- 2c50c9f23d1d 11.2 landed