Support transporting flags in the 'elevel' argument of ereport(). The
authorAndres Freund <[email protected]>
Sat, 13 Feb 2010 21:21:15 +0000 (22:21 +0100)
committerAndres Freund <[email protected]>
Wed, 27 Oct 2010 18:49:05 +0000 (20:49 +0200)
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
src/include/utils/elog.h

index e321b99249339bdcaf61e8706cc91a94131f98ed..6e174d86ec6e219be8354b27e4685d5283e3de19 100644 (file)
@@ -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)
    {
        /*
         * 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;
@@ -1168,7 +1170,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->eflags & LOG_NO_CLIENT))
        send_message_to_frontend(edata);
 
    MemoryContextSwitchTo(oldcontext);
index 92641ba1846da749ae6bde2755ff4137e81643ef..1853e1dfeb5ebb425d8e9fbf73d9f1bd06130b41 100644 (file)
 
 #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. */
 #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 */