aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-03-24 18:08:47 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-03-24 18:08:47 +0000
commit05fc744b967d15fa07c484ad87dd8cc943ad839f (patch)
tree451fe0c2b9be3fe55ab69f9cbcb7f19eda3b6053 /src
parent7feabcbf7f2d140289d79b97ba99ff44711fcf72 (diff)
downloadpostgresql-05fc744b967d15fa07c484ad87dd8cc943ad839f.tar.gz
postgresql-05fc744b967d15fa07c484ad87dd8cc943ad839f.zip
Add a new ereport auxiliary function errdetail_log(), which works the same as
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/nls.mk4
-rw-r--r--src/backend/port/ipc_test.c9
-rw-r--r--src/backend/utils/error/elog.c49
-rw-r--r--src/include/utils/elog.h9
4 files changed, 63 insertions, 8 deletions
diff --git a/src/backend/nls.mk b/src/backend/nls.mk
index c336d60d7e1..99e7e9f90a8 100644
--- a/src/backend/nls.mk
+++ b/src/backend/nls.mk
@@ -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 >$@
diff --git a/src/backend/port/ipc_test.c b/src/backend/port/ipc_test.c
index fa5066fd7e8..c4a6f487db5 100644
--- a/src/backend/port/ipc_test.c
+++ b/src/backend/port/ipc_test.c
@@ -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 $
*
*-------------------------------------------------------------------------
*/
@@ -186,6 +186,13 @@ errdetail(const char *fmt,...)
}
int
+errdetail_log(const char *fmt,...)
+{
+ fprintf(stderr, "DETAIL: %s\n", fmt);
+ return 0; /* return value does not matter */
+}
+
+int
errhint(const char *fmt,...)
{
fprintf(stderr, "HINT: %s\n", fmt);
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 8ff4c2fb678..d21ca068b0b 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -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)
@@ -701,6 +703,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
*/
int
@@ -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);
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index 78939baa898..3b980cae79a 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -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 $
*
*-------------------------------------------------------------------------
*/
@@ -126,6 +126,12 @@ errdetail(const char *fmt,...)
__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
the supplied arguments. */
@@ -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 */