Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/runtime.sgml,v
retrieving revision 1.182
diff -c -c -r1.182 runtime.sgml
*** doc/src/sgml/runtime.sgml	27 May 2003 17:49:45 -0000	1.182
--- doc/src/sgml/runtime.sgml	11 Jun 2003 17:51:45 -0000
***************
*** 1052,1057 ****
--- 1052,1074 ----
       </varlistentry>
  
       <varlistentry>
+       <term><varname>LOG_MIN_DURATION_STATEMENT</varname> (<type>integer</type>)</term>
+       <listitem>
+        <para>
+         Sets a minimum statement execution time (in milliseconds)
+ 	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
+ 	to <literal>250</literal> then all SQL statements that run longer
+ 	than 250ms will be logged along with the duration.  Enabling this
+ 	option can be useful in tracking down unoptimized queries in
+ 	your applications.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
+      <varlistentry>
        <term><varname>LOG_MIN_ERROR_STATEMENT</varname> (<type>string</type>)</term>
        <listitem>
         <para>
Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/tcop/postgres.c,v
retrieving revision 1.346
diff -c -c -r1.346 postgres.c
*** src/backend/tcop/postgres.c	27 May 2003 17:49:46 -0000	1.346
--- src/backend/tcop/postgres.c	11 Jun 2003 17:51:48 -0000
***************
*** 663,668 ****
--- 663,669 ----
  	struct timeval start_t,
  				stop_t;
  	bool		save_log_duration = log_duration;
+ 	int			save_log_min_duration_statement = log_min_duration_statement;
  	bool		save_log_statement_stats = log_statement_stats;
  
  	/*
***************
*** 673,683 ****
  	pgstat_report_activity(query_string);
  
  	/*
! 	 * We use save_log_duration so "SET log_duration = true" doesn't
! 	 * report incorrect time because gettimeofday() wasn't called.
  	 * Similarly, log_statement_stats has to be captured once.
  	 */
! 	if (save_log_duration)
  		gettimeofday(&start_t, NULL);
  
  	if (save_log_statement_stats)
--- 674,685 ----
  	pgstat_report_activity(query_string);
  
  	/*
! 	 * We use save_log_* so "SET log_duration = true"  and
! 	 * "SET log_min_duration_statement = true" don't report incorrect
! 	 * time because gettimeofday() wasn't called.
  	 * Similarly, log_statement_stats has to be captured once.
  	 */
! 	if (save_log_duration || save_log_min_duration_statement > 0)
  		gettimeofday(&start_t, NULL);
  
  	if (save_log_statement_stats)
***************
*** 915,933 ****
  	QueryContext = NULL;
  
  	/*
! 	 * Finish up monitoring.
  	 */
! 	if (save_log_duration)
  	{
  		gettimeofday(&stop_t, NULL);
  		if (stop_t.tv_usec < start_t.tv_usec)
  		{
  			stop_t.tv_sec--;
  			stop_t.tv_usec += 1000000;
  		}
! 		elog(LOG, "duration: %ld.%06ld sec",
! 			 (long) (stop_t.tv_sec - start_t.tv_sec),
! 			 (long) (stop_t.tv_usec - start_t.tv_usec));
  	}
  
  	if (save_log_statement_stats)
--- 917,954 ----
  	QueryContext = NULL;
  
  	/*
! 	 * Combine processing here as we need to calculate the query
! 	 * duration in both instances.
  	 */
! 	if (save_log_duration || save_log_min_duration_statement > 0)
  	{
+ 		long usecs;
  		gettimeofday(&stop_t, NULL);
  		if (stop_t.tv_usec < start_t.tv_usec)
  		{
  			stop_t.tv_sec--;
  			stop_t.tv_usec += 1000000;
  		}
! 		usecs = (long) (stop_t.tv_sec - start_t.tv_sec) * 1000000 + (long) (stop_t.tv_usec - start_t.tv_usec);
! 
! 		/* 
! 		 * Output a duration_query to the log if the query has exceeded the
! 		 * min duration.
! 		 */
! 		if (usecs >= save_log_min_duration_statement * 1000)
! 			elog(LOG, "duration_statement: %ld.%06ld %s",
! 				(long) (stop_t.tv_sec - start_t.tv_sec),
! 				(long) (stop_t.tv_usec - start_t.tv_usec),
! 				query_string);
! 
! 		/* 
! 		 * If the user is requesting logging of all durations, then log
! 		 * that as well.
! 		 */
! 		if (save_log_duration)
! 			elog(LOG, "duration: %ld.%06ld sec",
! 				 (long) (stop_t.tv_sec - start_t.tv_sec),
! 				 (long) (stop_t.tv_usec - start_t.tv_usec));
  	}
  
  	if (save_log_statement_stats)
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.128
diff -c -c -r1.128 guc.c
*** src/backend/utils/misc/guc.c	11 Jun 2003 05:04:51 -0000	1.128
--- src/backend/utils/misc/guc.c	11 Jun 2003 17:51:52 -0000
***************
*** 55,60 ****
--- 55,62 ----
  #include "utils/pg_locale.h"
  #include "pgstat.h"
  
+ int			log_min_duration_statement = 0;
+ 
  
  #ifndef PG_KRB_SRVTAB
  #define PG_KRB_SRVTAB ""
***************
*** 733,738 ****
--- 735,745 ----
  	{
  		{"extra_float_digits", PGC_USERSET}, &extra_float_digits,
  		0, -15, 2, NULL, NULL
+ 	},
+ 
+ 	{
+ 		{"log_min_duration_statement", PGC_USERSET}, &log_min_duration_statement,
+ 		0, 0, INT_MAX / 1000, NULL, NULL
  	},
  
  	{
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.79
diff -c -c -r1.79 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample	11 Jun 2003 05:04:51 -0000	1.79
--- src/backend/utils/misc/postgresql.conf.sample	11 Jun 2003 17:51:52 -0000
***************
*** 140,145 ****
--- 140,149 ----
  				 #   debug5, debug4, debug3, debug2, debug1,
  				 #   info, notice, warning, error, panic(off)
  
+ #log_min_duration_statement = 0  # Log all statements whose
+ 				 # execution time exceeds the value, in
+ 				 # milliseconds.  Zero disables.
+ 
  #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.77
diff -c -c -r1.77 tab-complete.c
*** src/bin/psql/tab-complete.c	14 May 2003 03:26:02 -0000	1.77
--- src/bin/psql/tab-complete.c	11 Jun 2003 17:51:53 -0000
***************
*** 538,543 ****
--- 538,544 ----
  		"lc_time",
  		"log_duration",
  		"log_executor_stats",
+ 		"log_min_duration_statement",
  		"log_min_error_statement",
  		"log_min_messages",
  		"log_parser_stats",
Index: src/include/utils/guc.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/utils/guc.h,v
retrieving revision 1.31
diff -c -c -r1.31 guc.h
*** src/include/utils/guc.h	6 May 2003 20:26:28 -0000	1.31
--- src/include/utils/guc.h	11 Jun 2003 17:51:54 -0000
***************
*** 142,145 ****
--- 142,147 ----
  void read_nondefault_variables(void);
  #endif
  
+ extern int	log_min_duration_statement;
+ 
  #endif   /* GUC_H */
