]> granicus.if.org Git - postgresql/commitdiff
Add a new ereport auxiliary function errdetail_log(), which works the same as
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 24 Mar 2008 18:08:47 +0000 (18:08 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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: pgsql/doc/src/sgml/sources.sgml,v 2.29 2007/11/07 13:12:21 petere Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/sources.sgml,v 2.30 2008/03/24 18:08:47 tgl Exp $ -->
 
  <chapter id="source">
   <title>PostgreSQL Coding Conventions</title>
@@ -158,6 +158,17 @@ ereport(ERROR,
      <function>errmsg</>.
     </para>
    </listitem>
+   <listitem>
+    <para>
+     <function>errdetail_log(const char *msg, ...)</function> is the same as
+     <function>errdetail</> except that this string goes only to the server
+     log, never to the client.  If both <function>errdetail</> and
+     <function>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.
+    </para>
+   </listitem>
    <listitem>
     <para>
      <function>errhint(const char *msg, ...)</function> 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 */