Add a new ereport auxiliary function errdetail_log(), which works the same as
authorTom Lane
Mon, 24 Mar 2008 18:08:47 +0000 (18:08 +0000)
committerTom Lane
Mon, 24 Mar 2008 18:08:47 +0000 (18:08 +0000)
errdetail except the string goes only to the server log, replacing the normal
errdetail there.  This provides a reasonably clean way of dealing with error
details that are too security-sensitive or too bulky to send to the client.

This commit just adds the infrastructure --- actual uses to follow.

doc/src/sgml/sources.sgml
src/backend/nls.mk
src/backend/port/ipc_test.c
src/backend/utils/error/elog.c
src/include/utils/elog.h

index 65652dd3053b6525607f817ad01d83dd1d3ef8f2..78d60bb5ae408ea843a3966fdba462b7fe7d0cb6 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
  
   PostgreSQL Coding Conventions
@@ -158,6 +158,17 @@ ereport(ERROR,
      errmsg.
     
    
+   
+    
+     errdetail_log(const char *msg, ...) is the same as
+     errdetail except that this string goes only to the server
+     log, never to the client.  If both errdetail and
+     errdetail_log are used then one string goes to the client
+     and the other to the log.  This is useful for error details that are
+     too security-sensitive or too bulky to include in the report
+     sent to the client.
+    
+   
    
     
      errhint(const char *msg, ...) supplies an optional
index c336d60d7e19ecf56b859477b0a38cc28bb0b28e..99e7e9f90a852deab9673bf77d087924977653d2 100644 (file)
@@ -1,10 +1,10 @@
-# $PostgreSQL: pgsql/src/backend/nls.mk,v 1.21 2008/01/30 11:05:37 petere Exp $
+# $PostgreSQL: pgsql/src/backend/nls.mk,v 1.22 2008/03/24 18:08:47 tgl Exp $
 CATALOG_NAME   := postgres
 AVAIL_LANGUAGES    := af cs de es fr hr hu it ko nb nl pt_BR ro ru sk sl sv tr zh_CN zh_TW
 GETTEXT_FILES  := + gettext-files
 # you can add "elog:2" and "errmsg_internal" to this list if you want to
 # include internal messages in the translation list.
-GETTEXT_TRIGGERS:= _ errmsg errdetail errhint errcontext write_stderr yyerror
+GETTEXT_TRIGGERS:= _ errmsg errdetail errdetail_log errhint errcontext write_stderr yyerror
 
 gettext-files: distprep
    find $(srcdir)/ $(srcdir)/../port/ -name '*.c' -print >$@
index fa5066fd7e8a09d03a0e03d1cbeb909d2a0500f4..c4a6f487db5cc2aa8a8780ea2fd9d6365cad3fd8 100644 (file)
@@ -21,7 +21,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/port/ipc_test.c,v 1.23 2008/01/01 19:45:51 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/port/ipc_test.c,v 1.24 2008/03/24 18:08:47 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -185,6 +185,13 @@ errdetail(const char *fmt,...)
    return 0;                   /* return value does not matter */
 }
 
+int
+errdetail_log(const char *fmt,...)
+{
+   fprintf(stderr, "DETAIL: %s\n", fmt);
+   return 0;                   /* return value does not matter */
+}
+
 int
 errhint(const char *fmt,...)
 {
index 8ff4c2fb67850a24a2a72cb562fac8a125038215..d21ca068b0b92d2ae84e87767c576aeb5e82dfdf 100644 (file)
@@ -42,7 +42,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.202 2008/03/10 12:55:13 mha Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.203 2008/03/24 18:08:47 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -382,6 +382,8 @@ errfinish(int dummy,...)
        pfree(edata->message);
    if (edata->detail)
        pfree(edata->detail);
+   if (edata->detail_log)
+       pfree(edata->detail_log);
    if (edata->hint)
        pfree(edata->hint);
    if (edata->context)
@@ -700,6 +702,27 @@ errdetail(const char *fmt,...)
 }
 
 
+/*
+ * errdetail_log --- add a detail_log error message text to the current error
+ */
+int
+errdetail_log(const char *fmt,...)
+{
+   ErrorData  *edata = &errordata[errordata_stack_depth];
+   MemoryContext oldcontext;
+
+   recursion_depth++;
+   CHECK_STACK_DEPTH();
+   oldcontext = MemoryContextSwitchTo(ErrorContext);
+
+   EVALUATE_MESSAGE(detail_log, false);
+
+   MemoryContextSwitchTo(oldcontext);
+   recursion_depth--;
+   return 0;                   /* return value does not matter */
+}
+
+
 /*
  * errhint --- add a hint error message text to the current error
  */
@@ -1010,6 +1033,8 @@ CopyErrorData(void)
        newedata->message = pstrdup(newedata->message);
    if (newedata->detail)
        newedata->detail = pstrdup(newedata->detail);
+   if (newedata->detail_log)
+       newedata->detail_log = pstrdup(newedata->detail_log);
    if (newedata->hint)
        newedata->hint = pstrdup(newedata->hint);
    if (newedata->context)
@@ -1033,6 +1058,8 @@ FreeErrorData(ErrorData *edata)
        pfree(edata->message);
    if (edata->detail)
        pfree(edata->detail);
+   if (edata->detail_log)
+       pfree(edata->detail_log);
    if (edata->hint)
        pfree(edata->hint);
    if (edata->context)
@@ -1103,6 +1130,8 @@ ReThrowError(ErrorData *edata)
        newedata->message = pstrdup(newedata->message);
    if (newedata->detail)
        newedata->detail = pstrdup(newedata->detail);
+   if (newedata->detail_log)
+       newedata->detail_log = pstrdup(newedata->detail_log);
    if (newedata->hint)
        newedata->hint = pstrdup(newedata->hint);
    if (newedata->context)
@@ -1790,8 +1819,11 @@ write_csvlog(ErrorData *edata)
    appendCSVLiteral(&buf, edata->message);
    appendStringInfoCharMacro(&buf, ',');
 
-   /* errdetail */
-   appendCSVLiteral(&buf, edata->detail);
+   /* errdetail or errdetail_log */
+   if (edata->detail_log)
+       appendCSVLiteral(&buf, edata->detail_log);
+   else
+       appendCSVLiteral(&buf, edata->detail);
    appendStringInfoCharMacro(&buf, ',');
 
    /* errhint */
@@ -1907,7 +1939,14 @@ send_message_to_server_log(ErrorData *edata)
 
    if (Log_error_verbosity >= PGERROR_DEFAULT)
    {
-       if (edata->detail)
+       if (edata->detail_log)
+       {
+           log_line_prefix(&buf);
+           appendStringInfoString(&buf, _("DETAIL:  "));
+           append_with_tabs(&buf, edata->detail_log);
+           appendStringInfoChar(&buf, '\n');
+       }
+       else if (edata->detail)
        {
            log_line_prefix(&buf);
            appendStringInfoString(&buf, _("DETAIL:  "));
@@ -2157,6 +2196,8 @@ send_message_to_frontend(ErrorData *edata)
            pq_sendstring(&msgbuf, edata->detail);
        }
 
+       /* detail_log is intentionally not used here */
+
        if (edata->hint)
        {
            pq_sendbyte(&msgbuf, PG_DIAG_MESSAGE_HINT);
index 78939baa8987fbc7f5be4d862a4b8ae634b02a2b..3b980cae79a462f1d7b0d3419fa2738c4c6a3833 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.91 2008/03/10 12:55:13 mha Exp $
+ * $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.92 2008/03/24 18:08:47 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -125,6 +125,12 @@ errdetail(const char *fmt,...)
    the supplied arguments. */
 __attribute__((format(printf, 1, 2)));
 
+extern int
+errdetail_log(const char *fmt,...)
+/* This extension allows gcc to check the format string for consistency with
+   the supplied arguments. */
+__attribute__((format(printf, 1, 2)));
+
 extern int
 errhint(const char *fmt,...)
 /* This extension allows gcc to check the format string for consistency with
@@ -258,6 +264,7 @@ typedef struct ErrorData
    int         sqlerrcode;     /* encoded ERRSTATE */
    char       *message;        /* primary error message */
    char       *detail;         /* detail error message */
+   char       *detail_log;     /* detail error message for server log only */
    char       *hint;           /* hint message */
    char       *context;        /* context message */
    int         cursorpos;      /* cursor index into query string */