On Mon, Dec 3, 2018 at 5:51 PM Tom Lane <t...@sss.pgh.pa.us> wrote: > No, it's in libpq, so you'd have to touch that not the server. libpq, not as bad as the server but nonetheless maybe a bit too much for this. Is adding value in library contract?
Anyway. attached a POC adding a new value to VERBOSITY (hopefully nobody is using it).
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 2e9fe760eb..e0c3a4fb9f 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -411,7 +411,7 @@ helpVariables(unsigned short int pager) fprintf(output, _(" USER\n" " the currently connected database user\n")); fprintf(output, _(" VERBOSITY\n" - " controls verbosity of error reports [default, verbose, terse]\n")); + " controls verbosity of error reports [default, verbose, terse, sqlstate]\n")); fprintf(output, _(" VERSION\n" " VERSION_NAME\n" " VERSION_NUM\n" diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index e7536a8a06..293ffcc5ef 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -1088,9 +1088,11 @@ verbosity_hook(const char *newval) pset.verbosity = PQERRORS_TERSE; else if (pg_strcasecmp(newval, "verbose") == 0) pset.verbosity = PQERRORS_VERBOSE; + else if (pg_strcasecmp(newval, "sqlstate") == 0) + pset.verbosity = PQERRORS_SQLSTATE; else { - PsqlVarEnumError("VERBOSITY", newval, "default, terse, verbose"); + PsqlVarEnumError("VERBOSITY", newval, "default, terse, sqlstate, verbose"); return false; } diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index fa44b2820b..3f0ad5192a 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -3571,7 +3571,7 @@ psql_completion(const char *text, int start, int end) else if (TailMatchesCS("SHOW_CONTEXT")) COMPLETE_WITH_CS("never", "errors", "always"); else if (TailMatchesCS("VERBOSITY")) - COMPLETE_WITH_CS("default", "verbose", "terse"); + COMPLETE_WITH_CS("default", "verbose", "terse", "sqlstate"); } else if (TailMatchesCS("\\sf*")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines, NULL); diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 8345faface..c58eabcd10 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -1017,6 +1017,15 @@ pqBuildErrorMessage3(PQExpBuffer msg, const PGresult *res, val = PQresultErrorField(res, PG_DIAG_SEVERITY); if (val) appendPQExpBuffer(msg, "%s: ", val); + if (verbosity == PQERRORS_SQLSTATE) + { + val = PQresultErrorField(res, PG_DIAG_SQLSTATE); + if (val) + appendPQExpBuffer(msg, "%s", val); + appendPQExpBufferChar(msg, '\n'); + return; + } + if (verbosity == PQERRORS_VERBOSE) { val = PQresultErrorField(res, PG_DIAG_SQLSTATE); diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index 3f13ddf092..f280a19b5a 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -111,7 +111,8 @@ typedef enum { PQERRORS_TERSE, /* single-line error messages */ PQERRORS_DEFAULT, /* recommended style */ - PQERRORS_VERBOSE /* all the facts, ma'am */ + PQERRORS_VERBOSE, /* all the facts, ma'am */ + PQERRORS_SQLSTATE /* single-line SQLSTATE error */ } PGVerbosity; typedef enum