On Wed, Dec 14, 2011 at 10:57:25AM -0500, Robert Haas wrote:
> On Wed, Dec 14, 2011 at 4:45 AM, Magnus Hagander <[email protected]> wrote:
> >>> * There are a number of things that are always written to stdout, that
> >>> there is no way to redirect. In some cases it's interactive prompts -
> >>> makes sense - but also for example the output of \timing goes to
> >>> stdout always. Is there some specific logic behind what/when this
> >>> should be done?
> >>
> >> Everything that is not an error goes to stdout, no? Except the query
> >> output, if you change it.
> >>
> >> Maybe the way to do what you want is to invent a new setting that
> >> temporarily changes stdout.
> >
> > Yeah, that might be it. Or I need separate settings for "put errors in
> > the query output stream" and "put non-query-output-but-also-non-errors
> > in the query output stream". The effect would be the same, I guess...
>
> That seems an awful lot harder (and messier) than just changing the
> all the call sites to use the same error-reporting function.
I have done as you suggested with the attached patch.
--
Bruce Momjian <[email protected]> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ It's impossible for everything to be true. +
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
new file mode 100644
index 205bb50..dc04399
*** a/src/bin/psql/command.c
--- b/src/bin/psql/command.c
*************** HandleSlashCmds(PsqlScanState scan_state
*** 110,116 ****
if (status == PSQL_CMD_UNKNOWN)
{
if (pset.cur_cmd_interactive)
! fprintf(stderr, _("Invalid command \\%s. Try \\? for help.\n"), cmd);
else
psql_error("invalid command \\%s\n", cmd);
status = PSQL_CMD_ERROR;
--- 110,116 ----
if (status == PSQL_CMD_UNKNOWN)
{
if (pset.cur_cmd_interactive)
! psql_error("Invalid command \\%s. Try \\? for help.\n", cmd);
else
psql_error("invalid command \\%s\n", cmd);
status = PSQL_CMD_ERROR;
*************** exec_command(const char *cmd,
*** 904,910 ****
if (strcmp(pw1, pw2) != 0)
{
! fprintf(stderr, _("Passwords didn't match.\n"));
success = false;
}
else
--- 904,910 ----
if (strcmp(pw1, pw2) != 0)
{
! psql_error("Passwords didn't match.\n");
success = false;
}
else
*************** exec_command(const char *cmd,
*** 922,928 ****
if (!encrypted_password)
{
! fprintf(stderr, _("Password encryption failed.\n"));
success = false;
}
else
--- 922,928 ----
if (!encrypted_password)
{
! psql_error("Password encryption failed.\n");
success = false;
}
else
*************** exec_command(const char *cmd,
*** 1441,1447 ****
while ((value = psql_scan_slash_option(scan_state,
OT_NORMAL, NULL, true)))
{
! fprintf(stderr, "+ opt(%d) = |%s|\n", i++, value);
free(value);
}
}
--- 1441,1447 ----
while ((value = psql_scan_slash_option(scan_state,
OT_NORMAL, NULL, true)))
{
! psql_error("+ opt(%d) = |%s|\n", i++, value);
free(value);
}
}
*************** do_connect(char *dbname, char *user, cha
*** 1519,1525 ****
* to connect to the wrong database by using defaults, so require
* all parameters to be specified.
*/
! fputs(_("All connection parameters must be supplied because no database connection exists\n"), stderr);
return false;
}
--- 1519,1526 ----
* to connect to the wrong database by using defaults, so require
* all parameters to be specified.
*/
! psql_error("All connection parameters must be supplied because no "
! "database connection exists\n");
return false;
}
*************** do_connect(char *dbname, char *user, cha
*** 1608,1614 ****
/* pset.db is left unmodified */
if (o_conn)
! fputs(_("Previous connection kept\n"), stderr);
}
else
{
--- 1609,1615 ----
/* pset.db is left unmodified */
if (o_conn)
! psql_error("Previous connection kept\n");
}
else
{
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
new file mode 100644
index 330d5ce..f5bd0f6
*** a/src/bin/psql/common.c
--- b/src/bin/psql/common.c
*************** pg_strdup(const char *string)
*** 42,48 ****
if (!string)
{
! fprintf(stderr, _("%s: pg_strdup: cannot duplicate null pointer (internal error)\n"),
pset.progname);
exit(EXIT_FAILURE);
}
--- 42,48 ----
if (!string)
{
! psql_error("%s: pg_strdup: cannot duplicate null pointer (internal error)\n",
pset.progname);
exit(EXIT_FAILURE);
}
*************** psql_error(const char *fmt,...)
*** 161,167 ****
va_list ap;
fflush(stdout);
! if (pset.queryFout != stdout)
fflush(pset.queryFout);
if (pset.inputfile)
--- 161,167 ----
va_list ap;
fflush(stdout);
! if (pset.queryFout && pset.queryFout != stdout)
fflush(pset.queryFout);
if (pset.inputfile)
*************** static PGcancel *volatile cancelConn = N
*** 219,224 ****
--- 219,225 ----
static CRITICAL_SECTION cancelConnLock;
#endif
+ /* Used from signal handlers, no buffering */
#define write_stderr(str) write(fileno(stderr), str, strlen(str))
*************** CheckConnection(void)
*** 350,368 ****
exit(EXIT_BADCONN);
}
! fputs(_("The connection to the server was lost. Attempting reset: "), stderr);
PQreset(pset.db);
OK = ConnectionUp();
if (!OK)
{
! fputs(_("Failed.\n"), stderr);
PQfinish(pset.db);
pset.db = NULL;
ResetCancelConn();
UnsyncVariables();
}
else
! fputs(_("Succeeded.\n"), stderr);
}
return OK;
--- 351,369 ----
exit(EXIT_BADCONN);
}
! psql_error("The connection to the server was lost. Attempting reset: ");
PQreset(pset.db);
OK = ConnectionUp();
if (!OK)
{
! psql_error("Failed.\n");
PQfinish(pset.db);
pset.db = NULL;
ResetCancelConn();
UnsyncVariables();
}
else
! psql_error("Succeeded.\n");
}
return OK;
*************** SendQuery(const char *query)
*** 910,916 ****
{
if (on_error_rollback_warning == false && pset.sversion < 80000)
{
! fprintf(stderr, _("The server (version %d.%d) does not support savepoints for ON_ERROR_ROLLBACK.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
on_error_rollback_warning = true;
}
--- 911,917 ----
{
if (on_error_rollback_warning == false && pset.sversion < 80000)
{
! psql_error("The server (version %d.%d) does not support savepoints for ON_ERROR_ROLLBACK.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
on_error_rollback_warning = true;
}
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
new file mode 100644
index 14985ba..c2bcc5a
*** a/src/bin/psql/describe.c
--- b/src/bin/psql/describe.c
*************** describeTablespaces(const char *pattern,
*** 132,138 ****
if (pset.sversion < 80000)
{
! fprintf(stderr, _("The server (version %d.%d) does not support tablespaces.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 132,138 ----
if (pset.sversion < 80000)
{
! psql_error("The server (version %d.%d) does not support tablespaces.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** describeFunctions(const char *functypes,
*** 219,231 ****
if (strlen(functypes) != strspn(functypes, "antwS+"))
{
! fprintf(stderr, _("\\df only takes [antwS+] as options\n"));
return true;
}
if (showWindow && pset.sversion < 80400)
{
! fprintf(stderr, _("\\df does not take a \"w\" option with server version %d.%d\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 219,231 ----
if (strlen(functypes) != strspn(functypes, "antwS+"))
{
! psql_error("\\df only takes [antwS+] as options\n");
return true;
}
if (showWindow && pset.sversion < 80400)
{
! psql_error("\\df does not take a \"w\" option with server version %d.%d\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listDefaultACLs(const char *pattern)
*** 786,792 ****
if (pset.sversion < 90000)
{
! fprintf(stderr, _("The server (version %d.%d) does not support altering default privileges.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 786,792 ----
if (pset.sversion < 90000)
{
! psql_error("The server (version %d.%d) does not support altering default privileges.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** describeTableDetails(const char *pattern
*** 1052,1058 ****
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! fprintf(stderr, _("Did not find any relation named \"%s\".\n"),
pattern);
PQclear(res);
return false;
--- 1052,1058 ----
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! psql_error("Did not find any relation named \"%s\".\n",
pattern);
PQclear(res);
return false;
*************** describeOneTableDetails(const char *sche
*** 1225,1232 ****
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! fprintf(stderr, _("Did not find any relation with OID %s.\n"),
! oid);
goto error_return;
}
--- 1225,1231 ----
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! psql_error("Did not find any relation with OID %s.\n", oid);
goto error_return;
}
*************** listCollations(const char *pattern, bool
*** 3126,3132 ****
if (pset.sversion < 90100)
{
! fprintf(stderr, _("The server (version %d.%d) does not support collations.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3125,3131 ----
if (pset.sversion < 90100)
{
! psql_error("The server (version %d.%d) does not support collations.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listTSParsers(const char *pattern, bool
*** 3257,3263 ****
if (pset.sversion < 80300)
{
! fprintf(stderr, _("The server (version %d.%d) does not support full text search.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3256,3262 ----
if (pset.sversion < 80300)
{
! psql_error("The server (version %d.%d) does not support full text search.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listTSParsersVerbose(const char *pattern
*** 3334,3340 ****
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! fprintf(stderr, _("Did not find any text search parser named \"%s\".\n"),
pattern);
PQclear(res);
return false;
--- 3333,3339 ----
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! psql_error("Did not find any text search parser named \"%s\".\n",
pattern);
PQclear(res);
return false;
*************** listTSDictionaries(const char *pattern,
*** 3490,3496 ****
if (pset.sversion < 80300)
{
! fprintf(stderr, _("The server (version %d.%d) does not support full text search.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3489,3495 ----
if (pset.sversion < 80300)
{
! psql_error("The server (version %d.%d) does not support full text search.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listTSTemplates(const char *pattern, boo
*** 3558,3564 ****
if (pset.sversion < 80300)
{
! fprintf(stderr, _("The server (version %d.%d) does not support full text search.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3557,3563 ----
if (pset.sversion < 80300)
{
! psql_error("The server (version %d.%d) does not support full text search.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listTSConfigs(const char *pattern, bool
*** 3626,3632 ****
if (pset.sversion < 80300)
{
! fprintf(stderr, _("The server (version %d.%d) does not support full text search.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3625,3631 ----
if (pset.sversion < 80300)
{
! psql_error("The server (version %d.%d) does not support full text search.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listTSConfigsVerbose(const char *pattern
*** 3704,3710 ****
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! fprintf(stderr, _("Did not find any text search configuration named \"%s\".\n"),
pattern);
PQclear(res);
return false;
--- 3703,3709 ----
if (PQntuples(res) == 0)
{
if (!pset.quiet)
! psql_error("Did not find any text search configuration named \"%s\".\n",
pattern);
PQclear(res);
return false;
*************** listForeignDataWrappers(const char *patt
*** 3824,3830 ****
if (pset.sversion < 80400)
{
! fprintf(stderr, _("The server (version %d.%d) does not support foreign-data wrappers.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3823,3829 ----
if (pset.sversion < 80400)
{
! psql_error("The server (version %d.%d) does not support foreign-data wrappers.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listForeignServers(const char *pattern,
*** 3904,3910 ****
if (pset.sversion < 80400)
{
! fprintf(stderr, _("The server (version %d.%d) does not support foreign servers.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3903,3909 ----
if (pset.sversion < 80400)
{
! psql_error("The server (version %d.%d) does not support foreign servers.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listUserMappings(const char *pattern, bo
*** 3983,3989 ****
if (pset.sversion < 80400)
{
! fprintf(stderr, _("The server (version %d.%d) does not support user mappings.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 3982,3988 ----
if (pset.sversion < 80400)
{
! psql_error("The server (version %d.%d) does not support user mappings.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listForeignTables(const char *pattern, b
*** 4041,4047 ****
if (pset.sversion < 90100)
{
! fprintf(stderr, _("The server (version %d.%d) does not support foreign tables.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 4040,4046 ----
if (pset.sversion < 90100)
{
! psql_error("The server (version %d.%d) does not support foreign tables.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listExtensions(const char *pattern)
*** 4115,4121 ****
if (pset.sversion < 90100)
{
! fprintf(stderr, _("The server (version %d.%d) does not support extensions.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 4114,4120 ----
if (pset.sversion < 90100)
{
! psql_error("The server (version %d.%d) does not support extensions.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listExtensionContents(const char *patter
*** 4169,4175 ****
if (pset.sversion < 90100)
{
! fprintf(stderr, _("The server (version %d.%d) does not support extensions.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
--- 4168,4174 ----
if (pset.sversion < 90100)
{
! psql_error("The server (version %d.%d) does not support extensions.\n",
pset.sversion / 10000, (pset.sversion / 100) % 100);
return true;
}
*************** listExtensionContents(const char *patter
*** 4196,4205 ****
if (!pset.quiet)
{
if (pattern)
! fprintf(stderr, _("Did not find any extension named \"%s\".\n"),
pattern);
else
! fprintf(stderr, _("Did not find any extensions.\n"));
}
PQclear(res);
return false;
--- 4195,4204 ----
if (!pset.quiet)
{
if (pattern)
! psql_error("Did not find any extension named \"%s\".\n",
pattern);
else
! psql_error("Did not find any extensions.\n");
}
PQclear(res);
return false;
diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c
new file mode 100644
index ea95be1..dc6ff37
*** a/src/bin/psql/large_obj.c
--- b/src/bin/psql/large_obj.c
*************** do_lo_export(const char *loid_arg, const
*** 155,161 ****
/* of course this status is documented nowhere :( */
if (status != 1)
{
! fputs(PQerrorMessage(pset.db), stderr);
return fail_lo_xact("\\lo_export", own_transaction);
}
--- 155,161 ----
/* of course this status is documented nowhere :( */
if (status != 1)
{
! psql_error("%s", PQerrorMessage(pset.db));
return fail_lo_xact("\\lo_export", own_transaction);
}
*************** do_lo_import(const char *filename_arg, c
*** 190,196 ****
if (loid == InvalidOid)
{
! fputs(PQerrorMessage(pset.db), stderr);
return fail_lo_xact("\\lo_import", own_transaction);
}
--- 190,196 ----
if (loid == InvalidOid)
{
! psql_error("%s", PQerrorMessage(pset.db));
return fail_lo_xact("\\lo_import", own_transaction);
}
*************** do_lo_unlink(const char *loid_arg)
*** 252,258 ****
if (status == -1)
{
! fputs(PQerrorMessage(pset.db), stderr);
return fail_lo_xact("\\lo_unlink", own_transaction);
}
--- 252,258 ----
if (status == -1)
{
! psql_error("%s", PQerrorMessage(pset.db));
return fail_lo_xact("\\lo_unlink", own_transaction);
}
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers