Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/runtime.sgml,v
retrieving revision 1.132
diff -c -c -r1.132 runtime.sgml
*** doc/src/sgml/runtime.sgml	1 Sep 2002 23:26:06 -0000	1.132
--- doc/src/sgml/runtime.sgml	2 Sep 2002 05:35:45 -0000
***************
*** 942,948 ****
         </para>
        </listitem>
       </varlistentry>
- 
       <varlistentry>
        <term><varname>EXPLAIN_PRETTY_PRINT</varname> (<type>boolean</type>)</term>
        <listitem>
--- 942,947 ----
***************
*** 979,984 ****
--- 978,1005 ----
       </varlistentry>
  
       <varlistentry>
+       <term><varname>LOG_MIN_ERROR_STATEMENT</varname> (<type>string</type>)</term>
+       <listitem>
+        <para>
+         This controls which log messages are accompanied by the original
+         query which generated the message. All queries matching the setting
+         or which are of a higher severity than the setting are logged. The
+         default is <literal>ERROR</literal>. Valid values are
+         <literal>DEBUG5</literal>, <literal>DEBUG4</literal>, 
+         <literal>DEBUG3</literal>, <literal>DEBUG2</literal>, 
+         <literal>DEBUG1</literal>, <literal>INFO</literal>,
+         <literal>NOTICE</literal>, <literal>WARNING</literal>
+         and <literal>ERROR</literal>.
+        </para>
+        <para>
+         It is recommended you enable <literal>LOG_PID</literal> as well
+         so you can more easily match the error statement with the error
+         message.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
+      <varlistentry>
        <term><varname>LOG_PID</varname> (<type>boolean</type>)</term>
        <listitem>
         <para>
***************
*** 1005,1012 ****
        <listitem>
         <para>
          Prints the duration of every completed query.  To use this option, 
!         enable LOG_STATEMENT and LOG_PID so you can link the original query
!         to the duration using the process id.
         </para>
        </listitem>
       </varlistentry>
--- 1026,1033 ----
        <listitem>
         <para>
          Prints the duration of every completed query.  To use this option, 
!         enable <literal>LOG_STATEMENT</> and <literal>LOG_PID</> so you 
!         can link the original query to the duration using the process id.
         </para>
        </listitem>
       </varlistentry>
Index: src/backend/utils/error/elog.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/error/elog.c,v
retrieving revision 1.101
diff -c -c -r1.101 elog.c
*** src/backend/utils/error/elog.c	2 Sep 2002 02:47:05 -0000	1.101
--- src/backend/utils/error/elog.c	2 Sep 2002 05:35:51 -0000
***************
*** 33,49 ****
  #include "storage/proc.h"
  #include "tcop/tcopprot.h"
  #include "utils/memutils.h"
  
  #include "mb/pg_wchar.h"
  
- int			server_min_messages;
- char	   *server_min_messages_str = NULL;
- const char	server_min_messages_str_default[] = "notice";
- 
- int			client_min_messages;
- char	   *client_min_messages_str = NULL;
- const char	client_min_messages_str_default[] = "notice";
- 
  #ifdef HAVE_SYSLOG
  /*
   * 0 = only stdout/stderr
--- 33,42 ----
  #include "storage/proc.h"
  #include "tcop/tcopprot.h"
  #include "utils/memutils.h"
+ #include "utils/guc.h"
  
  #include "mb/pg_wchar.h"
  
  #ifdef HAVE_SYSLOG
  /*
   * 0 = only stdout/stderr
***************
*** 345,350 ****
--- 338,344 ----
  		}
  	}
  
+ 
  	/*
  	 * Message prepared; send it where it should go
  	 */
***************
*** 433,438 ****
--- 427,440 ----
  	if (msg_buf != msg_fixedbuf)
  		free(msg_buf);
  
+ 	/* If the user wants this elog() generating query logged,
+ 	 * do so. We only want to log if the query has been
+ 	 * written to debug_query_string. Also, avoid infinite loops.
+ 	 */
+ 
+ 	if(lev != LOG && lev >= log_min_error_statement && debug_query_string)
+ 		elog(LOG,"statement: %s",debug_query_string);
+ 
  	/*
  	 * Perform error recovery action as specified by lev.
  	 */
***************
*** 835,905 ****
  }
  
  
- /*
-  * GUC support routines
-  */
- const char *
- assign_server_min_messages(const char *newval,
- 						   bool doit, bool interactive)
- {
- 	if (strcasecmp(newval, "debug") == 0)
- 		{ if (doit) server_min_messages = DEBUG1; }
- 	else if (strcasecmp(newval, "debug5") == 0)
- 		{ if (doit) server_min_messages = DEBUG5; }
- 	else if (strcasecmp(newval, "debug4") == 0)
- 		{ if (doit) server_min_messages = DEBUG4; }
- 	else if (strcasecmp(newval, "debug3") == 0)
- 		{ if (doit) server_min_messages = DEBUG3; }
- 	else if (strcasecmp(newval, "debug2") == 0)
- 		{ if (doit) server_min_messages = DEBUG2; }
- 	else if (strcasecmp(newval, "debug1") == 0)
- 		{ if (doit) server_min_messages = DEBUG1; }
- 	else if (strcasecmp(newval, "info") == 0)
- 		{ if (doit) server_min_messages = INFO; }
- 	else if (strcasecmp(newval, "notice") == 0)
- 		{ if (doit) server_min_messages = NOTICE; }
- 	else if (strcasecmp(newval, "warning") == 0)
- 		{ if (doit) server_min_messages = WARNING; }
- 	else if (strcasecmp(newval, "error") == 0)
- 		{ if (doit) server_min_messages = ERROR; }
- 	else if (strcasecmp(newval, "log") == 0)
- 		{ if (doit) server_min_messages = LOG; }
- 	else if (strcasecmp(newval, "fatal") == 0)
- 		{ if (doit) server_min_messages = FATAL; }
- 	else if (strcasecmp(newval, "panic") == 0)
- 		{ if (doit) server_min_messages = PANIC; }
- 	else
- 		return NULL;			/* fail */
- 	return newval;				/* OK */
- }
  
- const char *
- assign_client_min_messages(const char *newval,
- 						   bool doit, bool interactive)
- {
- 	if (strcasecmp(newval, "debug") == 0)
- 		{ if (doit) client_min_messages = DEBUG1; }
- 	else if (strcasecmp(newval, "debug5") == 0)
- 		{ if (doit) client_min_messages = DEBUG5; }
- 	else if (strcasecmp(newval, "debug4") == 0)
- 		{ if (doit) client_min_messages = DEBUG4; }
- 	else if (strcasecmp(newval, "debug3") == 0)
- 		{ if (doit) client_min_messages = DEBUG3; }
- 	else if (strcasecmp(newval, "debug2") == 0)
- 		{ if (doit) client_min_messages = DEBUG2; }
- 	else if (strcasecmp(newval, "debug1") == 0)
- 		{ if (doit) client_min_messages = DEBUG1; }
- 	else if (strcasecmp(newval, "log") == 0)
- 		{ if (doit) client_min_messages = LOG; }
- 	else if (strcasecmp(newval, "info") == 0)
- 		{ if (doit) client_min_messages = INFO; }
- 	else if (strcasecmp(newval, "notice") == 0)
- 		{ if (doit) client_min_messages = NOTICE; }
- 	else if (strcasecmp(newval, "warning") == 0)
- 		{ if (doit) client_min_messages = WARNING; }
- 	else if (strcasecmp(newval, "error") == 0)
- 		{ if (doit) client_min_messages = ERROR; }
- 	else
- 		return NULL;			/* fail */
- 	return newval;				/* OK */
- }
--- 837,840 ----
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.91
diff -c -c -r1.91 guc.c
*** src/backend/utils/misc/guc.c	2 Sep 2002 01:05:06 -0000	1.91
--- src/backend/utils/misc/guc.c	2 Sep 2002 05:35:59 -0000
***************
*** 71,76 ****
--- 71,79 ----
  								   bool doit, bool interactive);
  #endif
  
+ static const char *assign_msglvl(int *var, const char *newval,
+ 									bool doit, bool interactive);
+ 
  /*
   * Debugging options
   */
***************
*** 99,104 ****
--- 102,120 ----
  
  bool		Password_encryption = true;
  
+ int			log_min_error_statement;
+ char		*log_min_error_statement_str = NULL;
+ const char	log_min_error_statement_str_default[] = "error";
+ 
+ int         server_min_messages;
+ char       *server_min_messages_str = NULL;
+ const char  server_min_messages_str_default[] = "notice";
+ 
+ int         client_min_messages;
+ char       *client_min_messages_str = NULL;
+ const char  client_min_messages_str_default[] = "notice";
+ 
+ 
  #ifndef PG_KRB_SRVTAB
  #define PG_KRB_SRVTAB ""
  #endif
***************
*** 727,732 ****
--- 743,753 ----
  	},
  
  	{
+ 		{ "log_min_error_statement", PGC_USERSET }, &log_min_error_statement_str,
+ 		log_min_error_statement_str_default, assign_min_error_statement, NULL
+ 	},
+ 
+ 	{
  		{ "DateStyle", PGC_USERSET, GUC_LIST_INPUT }, &datestyle_string,
  		"ISO, US", assign_datestyle, show_datestyle
  	},
***************
*** 2877,2879 ****
--- 2898,2951 ----
  
  	return newarray;
  }
+ 
+ const char *
+ assign_server_min_messages(const char *newval,
+ 						   bool doit, bool interactive)
+ {
+ 	return(assign_msglvl(&server_min_messages,newval,doit,interactive));
+ }
+ 
+ const char *
+ assign_client_min_messages(const char *newval,
+ 						   bool doit, bool interactive)
+ {
+ 	return(assign_msglvl(&client_min_messages,newval,doit,interactive));
+ }
+ 
+ const char *
+ assign_min_error_statement(const char *newval, bool doit, bool interactive)
+ {
+ 	return(assign_msglvl(&log_min_error_statement,newval,doit,interactive));
+ }
+ 
+ static const char *
+ assign_msglvl(int *var, const char *newval, bool doit, bool interactive)
+ {
+ 	if (strcasecmp(newval, "debug") == 0)
+ 		{ if (doit) (*var) = DEBUG1; }
+ 	else if (strcasecmp(newval, "debug5") == 0)
+ 		{ if (doit) (*var) = DEBUG5; }
+ 	else if (strcasecmp(newval, "debug4") == 0)
+ 		{ if (doit) (*var) = DEBUG4; }
+ 	else if (strcasecmp(newval, "debug3") == 0)
+ 		{ if (doit) (*var) = DEBUG3; }
+ 	else if (strcasecmp(newval, "debug2") == 0)
+ 		{ if (doit) (*var) = DEBUG2; }
+ 	else if (strcasecmp(newval, "debug1") == 0)
+ 		{ if (doit) (*var) = DEBUG1; }
+ 	else if (strcasecmp(newval, "log") == 0)
+ 		{ if (doit) (*var) = LOG; }
+ 	else if (strcasecmp(newval, "info") == 0)
+ 		{ if (doit) (*var) = INFO; }
+ 	else if (strcasecmp(newval, "notice") == 0)
+ 		{ if (doit) (*var) = NOTICE; }
+ 	else if (strcasecmp(newval, "warning") == 0)
+ 		{ if (doit) (*var) = WARNING; }
+ 	else if (strcasecmp(newval, "error") == 0)
+ 		{ if (doit) (*var) = ERROR; }
+ 	else
+ 		return NULL;			/* fail */
+ 	return newval;				/* OK */
+ }
+ 
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.51
diff -c -c -r1.51 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample	1 Sep 2002 23:26:06 -0000	1.51
--- src/backend/utils/misc/postgresql.conf.sample	2 Sep 2002 05:36:00 -0000
***************
*** 127,132 ****
--- 127,135 ----
  #log_duration = false
  #log_timestamp = false
  
+ #log_min_error_statement = error		# Values in order of increasing severity:
+ 									# debug5, debug4, debug3, debug2, debug1,
+ 					                # info, notice, warning, error
  #debug_print_parse = false
  #debug_print_rewritten = false
  #debug_print_plan = false
Index: src/bin/psql/tab-complete.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/tab-complete.c,v
retrieving revision 1.61
diff -c -c -r1.61 tab-complete.c
*** src/bin/psql/tab-complete.c	1 Sep 2002 23:26:06 -0000	1.61
--- src/bin/psql/tab-complete.c	2 Sep 2002 05:36:05 -0000
***************
*** 271,277 ****
  		"default_transaction_isolation",
  		"search_path",
  		"statement_timeout",
! 
  		NULL
  	};
  
--- 271,277 ----
  		"default_transaction_isolation",
  		"search_path",
  		"statement_timeout",
! 		"log_min_error_statement",
  		NULL
  	};
  
Index: src/include/utils/elog.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/utils/elog.h,v
retrieving revision 1.38
diff -c -c -r1.38 elog.h
*** src/include/utils/elog.h	20 Jun 2002 20:29:52 -0000	1.38
--- src/include/utils/elog.h	2 Sep 2002 05:36:06 -0000
***************
*** 47,68 ****
  extern bool Log_timestamp;
  extern bool Log_pid;
  
- extern char	   *server_min_messages_str;
- extern char	   *client_min_messages_str;
- extern const char server_min_messages_str_default[];
- extern const char client_min_messages_str_default[];
- 
  extern void
  elog(int lev, const char *fmt,...)
  /* This extension allows gcc to check the format string for consistency with
     the supplied arguments. */
  __attribute__((format(printf, 2, 3)));
  
! extern int	DebugFileOpen(void);
! 
! extern const char *assign_server_min_messages(const char *newval,
! 											  bool doit, bool interactive);
! extern const char *assign_client_min_messages(const char *newval,
! 											  bool doit, bool interactive);
  
  #endif   /* ELOG_H */
--- 47,58 ----
  extern bool Log_timestamp;
  extern bool Log_pid;
  
  extern void
  elog(int lev, const char *fmt,...)
  /* This extension allows gcc to check the format string for consistency with
     the supplied arguments. */
  __attribute__((format(printf, 2, 3)));
  
! extern int  DebugFileOpen(void);
  
  #endif   /* ELOG_H */
Index: src/include/utils/guc.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/utils/guc.h,v
retrieving revision 1.21
diff -c -c -r1.21 guc.h
*** src/include/utils/guc.h	1 Sep 2002 23:26:06 -0000	1.21
--- src/include/utils/guc.h	2 Sep 2002 05:36:07 -0000
***************
*** 100,105 ****
--- 100,112 ----
  extern ArrayType *GUCArrayAdd(ArrayType *array, const char *name, const char *value);
  extern ArrayType *GUCArrayDelete(ArrayType *array, const char *name);
  
+ extern const char *assign_min_error_statement(const char *newval, bool doit,
+ 			bool interactive);
+ 
+ extern const char *assign_server_min_messages(const char *newval,
+                                               bool doit, bool interactive);
+ extern const char *assign_client_min_messages(const char *newval,
+                                               bool doit, bool interactive);
  extern bool Log_statement;
  extern bool Log_duration;
  extern bool Debug_print_plan;
***************
*** 117,121 ****
--- 124,143 ----
  
  extern bool SQL_inheritance;
  extern bool Australian_timezones;
+ 
+ extern char *debug_query_string;
+ 
+ extern int	log_min_error_statement;
+ extern char *log_min_error_statement_str;
+ extern const char log_min_error_statement_str_default[];
+ 
+ extern int	server_min_messages;
+ extern char    *server_min_messages_str;
+ extern const char server_min_messages_str_default[];
+ 
+ extern int client_min_messages;
+ extern char    *client_min_messages_str;
+ 
+ extern const char client_min_messages_str_default[];
  
  #endif   /* GUC_H */
