On 2/1/16 5:25 PM, Alvaro Herrera wrote:
> David Steele wrote:

>> 2) There would be two different ways to suppress client messages but I was
>> hoping to only have one.
> 
> I think they are two different things actually.

Fair enough - that was my initial reaction as well but then I thought
the other way would be better.

> I'm closing this as returned with feedback.

I have attached a patch that adds an ereport() macro to suppress client
output for a single report call (applies cleanly on 1d0c3b3).  I'll also
move it to the next CF.

Thanks!
-- 
-David
da...@pgmasters.net
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 9005b26..c53ef95 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -1091,6 +1091,23 @@ errhidecontext(bool hide_ctx)
        return 0;                                       /* return value does 
not matter */
 }
 
+/*
+ * errhidefromclient --- optionally suppress output of message to client
+ *
+ * Only log levels below ERROR can be hidden from the client.
+ */
+int
+errhidefromclient(bool hide_from_client)
+{
+       ErrorData  *edata = &errordata[errordata_stack_depth];
+
+       /* we don't bother incrementing recursion_depth */
+       CHECK_STACK_DEPTH();
+
+       edata->hide_from_client = hide_from_client;
+
+       return 0;                                       /* return value does 
not matter */
+}
 
 /*
  * errfunction --- add reporting function name to the current error
@@ -1467,7 +1484,7 @@ EmitErrorReport(void)
                send_message_to_server_log(edata);
 
        /* Send to client, if enabled */
-       if (edata->output_to_client)
+       if (edata->output_to_client && !edata->hide_from_client)
                send_message_to_frontend(edata);
 
        MemoryContextSwitchTo(oldcontext);
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index 326896f..14b87b7 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -179,6 +179,7 @@ extern int  errcontext_msg(const char *fmt,...) 
pg_attribute_printf(1, 2);
 
 extern int     errhidestmt(bool hide_stmt);
 extern int     errhidecontext(bool hide_ctx);
+extern int     errhidefromclient(bool hide_from_client);
 
 extern int     errfunction(const char *funcname);
 extern int     errposition(int cursorpos);
@@ -343,6 +344,7 @@ typedef struct ErrorData
        bool            show_funcname;  /* true to force funcname inclusion */
        bool            hide_stmt;              /* true to prevent STATEMENT: 
inclusion */
        bool            hide_ctx;               /* true to prevent CONTEXT: 
inclusion */
+       bool            hide_from_client;       /* true to prevent client 
output */
        const char *filename;           /* __FILE__ of ereport() call */
        int                     lineno;                 /* __LINE__ of 
ereport() call */
        const char *funcname;           /* __func__ of ereport() call */

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to