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

Reply via email to