diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index 2cc2400a5c5c322859c19f6340f12c28ec9dc1bf..3f6a2b350db9df0735dd822ebf7e12b71fbd6688 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.188 2003/06/27 18:20:50 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.189 2003/06/30 16:47:01 tgl Exp $
 -->
 
 <Chapter Id="runtime">
@@ -1513,7 +1513,7 @@ SET ENABLE_SEQSCAN TO OFF;
      <title>When To Log</title>
 
        <para>
-        Here is a list of the various message types:
+        Here is a list of the various message severity levels:
         <variablelist>
          <varlistentry>
           <term><literal>DEBUG[1-5]</literal></term>
@@ -1596,12 +1596,29 @@ SET ENABLE_SEQSCAN TO OFF;
 
      <variablelist>
 
+     <varlistentry>
+      <term><varname>CLIENT_MIN_MESSAGES</varname> (<type>string</type>)</term>
+      <listitem>
+       <para>
+        Controls which message levels are sent to the client.
+        Valid values are <literal>DEBUG5</>,
+        <literal>DEBUG4</>, <literal>DEBUG3</>, <literal>DEBUG2</>,
+        <literal>DEBUG1</>, <literal>LOG</>, <literal>NOTICE</>,
+        <literal>WARNING</>, and <literal>ERROR</>.  Each level
+        includes all the levels that follow it.  The later the level,
+        the fewer messages are sent.  The default is
+        <literal>NOTICE</>.  Note that <literal>LOG</> has a different
+        rank here than in <literal>LOG_MIN_MESSAGES</>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><varname>LOG_MIN_MESSAGES</varname> (<type>string</type>)</term>
       <listitem>
        <para>
-        This controls which message levels are written to the server
-        log.  Valid values are <literal>DEBUG5</>, <literal>DEBUG4</>,
+        Controls which message levels are written to the server log.
+	Valid values are <literal>DEBUG5</>, <literal>DEBUG4</>,
         <literal>DEBUG3</>, <literal>DEBUG2</>, <literal>DEBUG1</>,
         <literal>INFO</>, <literal>NOTICE</>, <literal>WARNING</>,
         <literal>ERROR</>, <literal>LOG</>, <literal>FATAL</>, and
@@ -1609,30 +1626,22 @@ SET ENABLE_SEQSCAN TO OFF;
         follow it.  The later the level, the fewer messages are sent
         to the log.  The default is <literal>NOTICE</>.  Note that
         <literal>LOG</> has a different rank here than in
-        <literal>CLIENT_MIN_MESSAGES</>.  Also see that section for an
-        explanation of the various values.
+        <literal>CLIENT_MIN_MESSAGES</>.
        </para>
-
       </listitem>
      </varlistentry>
 
      <varlistentry>
-      <term><varname>CLIENT_MIN_MESSAGES</varname> (<type>string</type>)</term>
+      <term><varname>LOG_ERROR_VERBOSITY</varname> (<type>string</type>)</term>
       <listitem>
        <para>
-        This controls which message levels are send to the client.
-        client.  Valid values are <literal>DEBUG5</>,
-        <literal>DEBUG4</>, <literal>DEBUG3</>, <literal>DEBUG2</>,
-        <literal>DEBUG1</>, <literal>LOG</>, <literal>NOTICE</>,
-        <literal>WARNING</>, and <literal>ERROR</>.  Each level
-        includes all the levels that follow it.  The later the level,
-        the fewer messages are sent.  The default is
-        <literal>NOTICE</>.  Note that <literal>LOG</> has a different
-        rank here than in <literal>LOG_MIN_MESSAGES</>.
+        Controls the amount of detail written in the server log for each
+	message that is logged.  Valid values are <literal>TERSE</>,
+	<literal>DEFAULT</>, and <literal>VERBOSE</>, each adding more
+	fields to displayed messages.
        </para>
       </listitem>
      </varlistentry>
-     
 
      <varlistentry>
       <term><varname>LOG_MIN_ERROR_STATEMENT</varname> (<type>string</type>)</term>
@@ -1643,7 +1652,7 @@ SET ENABLE_SEQSCAN TO OFF;
         statements that cause an error of the specified level, or a
         higher level, are logged.  The default is
         <literal>PANIC</literal> (effectively turning this feature
-        off). Valid values are <literal>DEBUG5</literal>,
+        off for normal use). Valid values are <literal>DEBUG5</literal>,
         <literal>DEBUG4</literal>, <literal>DEBUG3</literal>,
         <literal>DEBUG2</literal>, <literal>DEBUG1</literal>,
         <literal>INFO</literal>, <literal>NOTICE</literal>,
@@ -1654,12 +1663,6 @@ SET ENABLE_SEQSCAN TO OFF;
         logged. Enabling this option can be helpful in tracking down
         the source of any errors that appear in the server log.
        </para>
-
-       <para>
-        It is recommended you enable <varname>LOG_PID</varname> as well
-        so you can more easily match the error statement with the error
-        message.
-       </para>
       </listitem>
      </varlistentry>
      
@@ -1668,12 +1671,12 @@ SET ENABLE_SEQSCAN TO OFF;
        <listitem>
         <para>
          Sets a minimum statement execution time (in milliseconds)
-         above which a statement will be logged.  All SQL statements
+         above which a statement will be logged.  All SQL statements
          that run longer than the time specified will be logged together
-         with the duration, in seconds.  The default is <literal>0</literal>
-         (turning this feature off).  For example, if you set it
+         with their actual duration.  Setting this to zero (the default)
+	 disables time-based logging.  For example, if you set it
          to <literal>250</literal> then all SQL statements that run longer
-         than 250ms will be logged along with the duration.  Enabling this
+         than 250ms will be logged.  Enabling this
          option can be useful in tracking down unoptimized queries in
          your applications.
         </para>
@@ -1688,8 +1691,8 @@ SET ENABLE_SEQSCAN TO OFF;
         will automatically run in background and any controlling terminals
         are disassociated.  Thus, no messages are written to standard
         output or standard error (same effect as <command>postmaster</>'s <option>-S</option>
-        option). Unless some logging system such as
-        <application>syslog</> is enabled, using this option is
+        option). Unless
+        <application>syslog</> logging is enabled, using this option is
         discouraged since it makes it impossible to see error messages.
        </para>
       </listitem>
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 9d371a5a26d05c98f34e3bb59b2ab96c31eac02d..0660aaab9a9f82079e94e2a5d932e71f0c873c61 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.111 2003/05/28 18:19:09 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.112 2003/06/30 16:47:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -68,6 +68,7 @@
 ErrorContextCallback *error_context_stack = NULL;
 
 /* GUC parameters */
+PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
 bool		Log_timestamp;		/* show timestamps in stderr output */
 bool		Log_pid;			/* show PIDs in stderr output */
 
@@ -918,23 +919,52 @@ send_message_to_server_log(ErrorData *edata)
 
 	appendStringInfo(&buf, "%s:  ", error_severity(edata->elevel));
 
+	if (Log_error_verbosity >= PGERROR_VERBOSE)
+	{
+		/* unpack MAKE_SQLSTATE code */
+		char	tbuf[12];
+		int		ssval;
+		int		i;
+
+		ssval = edata->sqlerrcode;
+		for (i = 0; i < 5; i++)
+		{
+			tbuf[i] = PGUNSIXBIT(ssval);
+			ssval >>= 6;
+		}
+		tbuf[i] = '\0';
+		appendStringInfo(&buf, "%s: ", tbuf);
+	}
+
 	if (edata->message)
-		appendStringInfo(&buf, "%s\n", edata->message);
+		appendStringInfoString(&buf, edata->message);
 	else
-		appendStringInfoString(&buf, "missing error text\n");
+		appendStringInfoString(&buf, gettext("missing error text"));
 
-	/* XXX showing of additional info should perhaps be optional */
-	/* XXX ought to localize the label strings, probably */
+	if (edata->cursorpos > 0)
+		appendStringInfo(&buf, gettext(" at character %d"), edata->cursorpos);
 
-	if (edata->detail)
-		appendStringInfo(&buf, "DETAIL:  %s\n", edata->detail);
-	if (edata->hint)
-		appendStringInfo(&buf, "HINT:  %s\n", edata->hint);
-	if (edata->context)
-		appendStringInfo(&buf, "CONTEXT:  %s\n", edata->context);
-	if (edata->funcname && edata->filename)
-		appendStringInfo(&buf, "IN:  %s (%s:%d)\n",
-						 edata->funcname, edata->filename, edata->lineno);
+	appendStringInfoChar(&buf, '\n');
+
+	if (Log_error_verbosity >= PGERROR_DEFAULT)
+	{
+		if (edata->detail)
+			appendStringInfo(&buf, gettext("DETAIL:  %s\n"), edata->detail);
+		if (edata->hint)
+			appendStringInfo(&buf, gettext("HINT:  %s\n"), edata->hint);
+		if (edata->context)
+			appendStringInfo(&buf, gettext("CONTEXT:  %s\n"), edata->context);
+		if (Log_error_verbosity >= PGERROR_VERBOSE)
+		{
+			if (edata->funcname && edata->filename)
+				appendStringInfo(&buf, gettext("LOCATION:  %s, %s:%d\n"),
+								 edata->funcname, edata->filename,
+								 edata->lineno);
+			else if (edata->filename)
+				appendStringInfo(&buf, gettext("LOCATION:  %s:%d\n"),
+								 edata->filename, edata->lineno);
+		}
+	}
 
 	/*
 	 * If the user wants the query that generated this error logged, do so.
@@ -942,7 +972,8 @@ send_message_to_server_log(ErrorData *edata)
 	 * for queries triggered by extended query protocol; how to improve?
 	 */
 	if (edata->elevel >= log_min_error_statement && debug_query_string != NULL)
-		appendStringInfo(&buf, "STATEMENT:  %s\n", debug_query_string);
+		appendStringInfo(&buf, gettext("STATEMENT:  %s\n"),
+						 debug_query_string);
 
 
 #ifdef HAVE_SYSLOG
@@ -992,11 +1023,10 @@ send_message_to_server_log(ErrorData *edata)
 		 * Timestamp and PID are only used for stderr output --- we assume
 		 * the syslog daemon will supply them for us in the other case.
 		 */
-		if (Log_timestamp)
-			fprintf(stderr, "%s", print_timestamp());
-		if (Log_pid)
-			fprintf(stderr, "%s", print_pid());
-		fprintf(stderr, "%s", buf.data);
+		fprintf(stderr, "%s%s%s",
+				Log_timestamp ? print_timestamp() : "",
+				Log_pid ? print_pid() : "",
+				buf.data);
 	}
 
 	pfree(buf.data);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index dfdc4f82e7fd67c6f76e6b4d7e089e8e2046fa07..6e0da5bbaabecf62bf975dfcea676d0b9bdc6d12 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.132 2003/06/27 19:08:38 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.133 2003/06/30 16:47:01 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -94,6 +94,8 @@ static const char *assign_min_error_statement(const char *newval, bool doit,
 						   bool interactive);
 static const char *assign_msglvl(int *var, const char *newval,
 			  bool doit, bool interactive);
+static const char *assign_log_error_verbosity(const char *newval, bool doit,
+											  bool interactive);
 static bool assign_phony_autocommit(bool newval, bool doit, bool interactive);
 
 
@@ -134,9 +136,10 @@ int			client_min_messages = NOTICE;
  * cases provide the value for SHOW to display.  The real state is elsewhere
  * and is kept in sync by assign_hooks.
  */
-static char *log_min_error_statement_str;
-static char *log_min_messages_str;
 static char *client_min_messages_str;
+static char *log_min_messages_str;
+static char *log_error_verbosity_str;
+static char *log_min_error_statement_str;
 static bool phony_autocommit;
 static bool session_auth_is_superuser;
 static double phony_random_seed;
@@ -820,6 +823,16 @@ static struct config_string
 		"notice", assign_client_min_messages, NULL
 	},
 
+	{
+		{"log_min_messages", PGC_SUSET}, &log_min_messages_str,
+		"notice", assign_log_min_messages, NULL
+	},
+
+	{
+		{"log_error_verbosity", PGC_SUSET}, &log_error_verbosity_str,
+		"default", assign_log_error_verbosity, NULL
+	},
+
 	{
 		{"log_min_error_statement", PGC_SUSET}, &log_min_error_statement_str,
 		"panic", assign_min_error_statement, NULL
@@ -909,11 +922,6 @@ static struct config_string
 		PG_VERSION, NULL, NULL
 	},
 
-	{
-		{"log_min_messages", PGC_SUSET}, &log_min_messages_str,
-		"notice", assign_log_min_messages, NULL
-	},
-
 	/* Not for general use --- used by SET SESSION AUTHORIZATION */
 	{
 		{"session_authorization", PGC_USERSET, GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL},
@@ -3468,6 +3476,29 @@ assign_msglvl(int *var, const char *newval, bool doit, bool interactive)
 	return newval;				/* OK */
 }
 
+static const char *
+assign_log_error_verbosity(const char *newval, bool doit, bool interactive)
+{
+	if (strcasecmp(newval, "terse") == 0)
+	{
+		if (doit)
+			Log_error_verbosity = PGERROR_TERSE;
+	}
+	else if (strcasecmp(newval, "default") == 0)
+	{
+		if (doit)
+			Log_error_verbosity = PGERROR_DEFAULT;
+	}
+	else if (strcasecmp(newval, "verbose") == 0)
+	{
+		if (doit)
+			Log_error_verbosity = PGERROR_VERBOSE;
+	}
+	else
+		return NULL;			/* fail */
+	return newval;				/* OK */
+}
+
 static bool
 assign_phony_autocommit(bool newval, bool doit, bool interactive)
 {
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 594c230a7693508bfd07eb0b6d0553e33b67f311..57c6e55cb22d35f1bf9ef09101c6ba933d2073a5 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -119,13 +119,16 @@
 #
 #	Message display
 #
+#client_min_messages = notice	# Values, in order of decreasing detail:
+				#   debug5, debug4, debug3, debug2, debug1,
+				#   log, info, notice, warning, error
 #log_min_messages = notice	# Values, in order of decreasing detail:
 				#   debug5, debug4, debug3, debug2, debug1,
 				#   info, notice, warning, error, log, fatal,
 				#   panic
-#client_min_messages = notice	# Values, in order of decreasing detail:
-				#   debug5, debug4, debug3, debug2, debug1,
-				#   log, info, notice, warning, error
+
+#log_error_verbosity = default	# terse, default, or verbose messages
+
 #silent_mode = false
 
 #log_connections = false
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index f0de8f6c0e674f29b040b6dd5005cef86fc48731..8f70c25e761dccc16874268686cadcb765b25337 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3,7 +3,7 @@
  *
  * Copyright 2000-2002 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.80 2003/06/12 01:38:08 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.81 2003/06/30 16:47:01 tgl Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -543,6 +543,7 @@ psql_completion(char *text, int start, int end)
 		"lc_numeric",
 		"lc_time",
 		"log_duration",
+		"log_error_verbosity",
 		"log_executor_stats",
 		"log_min_duration_statement",
 		"log_min_error_statement",
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index f10a15db65ba3ef8d7f415285ab112a8778d47bf..b92bc8393374048ef0c1a3ed294c4af3e97cd460 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: elog.h,v 1.44 2003/05/27 17:49:46 momjian Exp $
+ * $Id: elog.h,v 1.45 2003/06/30 16:47:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -268,6 +268,15 @@ extern DLLIMPORT ErrorContextCallback *error_context_stack;
 
 
 /* GUC-configurable parameters */
+
+typedef enum
+{
+	PGERROR_TERSE,				/* single-line error messages */
+	PGERROR_DEFAULT,			/* recommended style */
+	PGERROR_VERBOSE				/* all the facts, ma'am */
+} PGErrorVerbosity;
+
+extern PGErrorVerbosity Log_error_verbosity;
 extern bool Log_timestamp;
 extern bool Log_pid;
 #ifdef HAVE_SYSLOG