psql: Catch and report errors while printing result table

Errors (for example I/O errors or disk full) while printing out result
tables were completely ignored, which could result in silently
truncated output in scripts, for example.  Fix by adding some basic
error checking and reporting.

Author: Daniel Verite <daniel@manitou-mail.org>
Author: David Zhang <david.zhang@highgo.ca>
Discussion: https://www.postgresql.org/message-id/flat/9a0b3c8d-ee14-4b1d-9d0a-2c993bdabacc@manitou-mail.org
This commit is contained in:
Peter Eisentraut 2020-03-20 16:04:15 +01:00
parent 85f6b49c2c
commit b03436994b
1 changed files with 14 additions and 1 deletions

View File

@ -708,6 +708,7 @@ static bool
PrintQueryTuples(const PGresult *results)
{
printQueryOpt my_popt = pset.popt;
bool result = true;
/* one-shot expanded output requested via \gx */
if (pset.g_expanded)
@ -725,6 +726,11 @@ PrintQueryTuples(const PGresult *results)
disable_sigpipe_trap();
printQuery(results, &my_popt, fout, false, pset.logfile);
if (ferror(fout))
{
pg_log_error("could not print result table: %m");
result = false;
}
if (is_pipe)
{
@ -735,9 +741,16 @@ PrintQueryTuples(const PGresult *results)
fclose(fout);
}
else
{
printQuery(results, &my_popt, pset.queryFout, false, pset.logfile);
if (ferror(pset.queryFout))
{
pg_log_error("could not print result table: %m");
result = false;
}
}
return true;
return result;
}