From 150b0bc845f7aab9629cc169a3a73f3338d6ab7f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Sat, 13 Feb 2010 22:21:15 +0100
Subject: [PATCH 1/2] Support transporting flags in the 'elevel' argument of ereport(). The
 reason is the wish to support avoiding the error to the client which
 was only possible using the COMERROR level - which is not a error but
 just a log message.
 The only supported flag till now is LOG_NO_CLIENT which does what
 COMERROR did for all error levels

---
 src/backend/utils/error/elog.c |    6 ++++--
 src/include/utils/elog.h       |   29 ++++++++++++++++++++---------
 2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index e321b99..5fc21b4 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -214,7 +214,8 @@ errstart(int elevel, const char *filename, int lineno,
 	bool		output_to_server;
 	bool		output_to_client = false;
 	int			i;
-
+	int			eflags = elevel & LOG_FLAG_MASK;
+	elevel = elevel & ~LOG_FLAG_MASK;
 	/*
 	 * Check some cases in which we want to promote an error into a more
 	 * severe error.  None of this logic applies for non-error messages.
@@ -274,7 +275,7 @@ errstart(int elevel, const char *filename, int lineno,
 		output_to_server = (elevel >= log_min_messages);
 
 	/* Determine whether message is enabled for client output */
-	if (whereToSendOutput == DestRemote && elevel != COMMERROR)
+	if (whereToSendOutput == DestRemote && !(eflags & LOG_NO_CLIENT))
 	{
 		/*
 		 * client_min_messages is honored only after we complete the
@@ -333,6 +334,7 @@ errstart(int elevel, const char *filename, int lineno,
 	edata = &errordata[errordata_stack_depth];
 	MemSet(edata, 0, sizeof(ErrorData));
 	edata->elevel = elevel;
+	edata->eflags = eflags;
 	edata->output_to_server = output_to_server;
 	edata->output_to_client = output_to_client;
 	edata->filename = filename;
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index 92641ba..1853e1d 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -16,6 +16,13 @@
 
 #include <setjmp.h>
 
+#define LOG_FLAG_MASK ((~0)<<20)
+
+/* logging flags */
+#define LOG_NO_CLIENT (2<<30)   /* Don't send to the client. Helpfull
+                                 * if it would confuse the client at
+                                 * that moment */
+
 /* Error level codes */
 #define DEBUG5		10			/* Debugging messages, in categories of
 								 * decreasing detail. */
@@ -25,30 +32,33 @@
 #define DEBUG1		14			/* used by GUC debug_* variables */
 #define LOG			15			/* Server operational messages; sent only to
 								 * server log by default. */
-#define COMMERROR	16			/* Client communication problems; same as LOG
+#define COMMERROR	(LOG|LOG_NO_CLIENT)/* Client communication problems; same as LOG
 								 * for server reporting, but never sent to
-								 * client. */
-#define INFO		17			/* Messages specifically requested by user (eg
+								 * client. For backward compatibility this is
+								 * is available without explicitly specifying
+								 * LOG_NO_CLIENT.*/
+#define INFO		16			/* Messages specifically requested by user (eg
 								 * VACUUM VERBOSE output); always sent to
 								 * client regardless of client_min_messages,
 								 * but by default not sent to server log. */
-#define NOTICE		18			/* Helpful messages to users about query
+#define NOTICE		17			/* Helpful messages to users about query
 								 * operation; sent to client and server log by
 								 * default. */
-#define WARNING		19			/* Warnings.  NOTICE is for expected messages
+#define WARNING		18			/* Warnings.  NOTICE is for expected messages
 								 * like implicit sequence creation by SERIAL.
 								 * WARNING is for unexpected messages. */
-#define ERROR		20			/* user error - abort transaction; return to
+#define ERROR		19			/* user error - abort transaction; return to
 								 * known state */
 /* Save ERROR value in PGERROR so it can be restored when Win32 includes
  * modify it.  We have to use a constant rather than ERROR because macros
  * are expanded only when referenced outside macros.
  */
 #ifdef WIN32
-#define PGERROR		20
+#define PGERROR		19
 #endif
-#define FATAL		21			/* fatal error - abort process */
-#define PANIC		22			/* take down the other backends with me */
+#define FATAL		20			/* fatal error - abort process */
+#define PANIC		21			/* take down the other backends with me */
+
 
  /* #define DEBUG DEBUG1 */	/* Backward compatibility with pre-7.3 */
 
@@ -291,6 +301,7 @@ extern PGDLLIMPORT sigjmp_buf *PG_exception_stack;
 typedef struct ErrorData
 {
 	int			elevel;			/* error level */
+	int			eflags;			/* error flags */
 	bool		output_to_server;		/* will report to server log? */
 	bool		output_to_client;		/* will report to client? */
 	bool		show_funcname;	/* true to force funcname inclusion */
-- 
1.7.3.rc1.5.g73aa2

