On 11/21/2014 02:44 PM, Tom Lane wrote:
Andrew Dunstan <and...@dunslane.net> writes:
Well, now we get things like this:
ERROR: more than one function named "abc"
LINE 1: SELECT 'abc'::pg_catalog.regproc::pg_catalog.oid
whereas minimal_error_message suppressed the second line. If we want to
preserve that older behaviour we'll have to abandon use of PSQLexec. But
it's not so complex that that would be a huge issue.
Yeah, the reason why we wrote that code to begin with was that there
were a bunch of user-facing error cases that would be reported by
regproc_in/regprocedure_in, and we didn't want to clutter those error
reports with the underlying queries.
I'm not sure how I feel about changing this. Making these queries subject
to ECHO_HIDDEN seems like we're exposing them to users to some extent
anyway, and maybe it's not worth dozens of lines of code (and duplicating
large parts of PSQLexec) to avoid the extra output. On the other hand
this output doesn't seem very nice from a fit-and-finish standpoint.
Here's a patch that I think does what you want. I didn't have to borrow
too much code from PSQLexec(). Sample session:
andrew=# \sf abc
ERROR: more than one function named "abc"
andrew=# \sf blurfl
ERROR: function "blurfl" does not exist
andrew=# \sf abc()
CREATE OR REPLACE FUNCTION public.abc()
RETURNS integer
LANGUAGE sql
AS $function$ select 1$function$
andrew=# \set ECHO_HIDDEN 1
andrew=# \sf abc()
********* QUERY **********
SELECT 'abc()'::pg_catalog.regprocedure::pg_catalog.oid
**************************
********* QUERY **********
SELECT pg_catalog.pg_get_functiondef(16385)
**************************
CREATE OR REPLACE FUNCTION public.abc()
RETURNS integer
LANGUAGE sql
AS $function$ select 1$function$
andrew=# \sf abc
********* QUERY **********
SELECT 'abc'::pg_catalog.regproc::pg_catalog.oid
**************************
ERROR: more than one function named "abc"
andrew=#
cheers
andrew
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 36d5e36..162fcf1 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -2925,6 +2925,34 @@ do_watch(PQExpBuffer query_buf, long sleep)
}
/*
+ * a little code borrowed from PSQLexec() to manage ECHO_HIDDEN output.
+ * returns true unless we have ECHO_HIDDEN_NOEXEC.
+ */
+static bool
+lookup_function_echo_hidden(char * query)
+{
+ if (pset.echo_hidden != PSQL_ECHO_HIDDEN_OFF)
+ {
+ printf(_("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(stdout);
+ if (pset.logfile)
+ {
+ fprintf(pset.logfile,
+ _("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(pset.logfile);
+ }
+
+ if (pset.echo_hidden == PSQL_ECHO_HIDDEN_NOEXEC)
+ return false;
+ }
+ return true;
+}
+
+/*
* This function takes a function description, e.g. "x" or "x(int)", and
* issues a query on the given connection to retrieve the function's OID
* using a cast to regproc or regprocedure (as appropriate). The result,
@@ -2945,8 +2973,9 @@ lookup_function_oid(const char *desc, Oid *foid)
appendStringLiteralConn(query, desc, pset.db);
appendPQExpBuffer(query, "::pg_catalog.%s::pg_catalog.oid",
strchr(desc, '(') ? "regprocedure" : "regproc");
-
- res = PSQLexec(query->data);
+ if (!lookup_function_echo_hidden(query->data))
+ return false;
+ res = PQexec(pset.db, query->data);
if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
*foid = atooid(PQgetvalue(res, 0, 0));
else
@@ -2975,7 +3004,9 @@ get_create_function_cmd(Oid oid, PQExpBuffer buf)
query = createPQExpBuffer();
printfPQExpBuffer(query, "SELECT pg_catalog.pg_get_functiondef(%u)", oid);
- res = PSQLexec(query->data);
+ if (!lookup_function_echo_hidden(query->data))
+ return false;
+ res = PQexec(pset.db, query->data);
if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
{
resetPQExpBuffer(buf);
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers