Patch applied.  Thanks.

I made some small wording adjustments.  Patch attached.

---------------------------------------------------------------------------


Ed L. wrote:
> The attached patch forces queryless duration log statements to be turned off 
> in step with the log_statement directive.  Without this patch, and with 
> log_statement = 'mod' and log_duration = true, there is no way to silence 
> SELECT query duration logging when quieting the logging of SELECT queries.
> 
> Note this patch changes the semantics of log_duration from logging the 
> duration of "every completed statement" to "every completed statement that 
> satisfies log_statement directive".  I argue this semantic change is 
> justified given 1) the docs themselves recommend turning log_statement 
> sufficiently up to be able to make this mapping, and 2) I can see it being 
> quite common that folks only want to log queries (and durations) that 
> change the database, while I fail to see the usefulness of queryless 
> durations (and I'm trying to scratch my own itch with a small effort).  
> It's possible someone else feels strongly about their queryless durations 
> for reasons I cannot imagine.  If so, then another more conservative 
> approach may be in order.
> 
> Note also this patch is independent of queries and durations logged due to 
> the log_min_duration_statement directive.  If, for example, log_statement = 
> 'all', log_min_duration_statement = 1 (ms), and a SELECT query takes longer 
> than 1ms, it's duration will be logged twice, with the 2nd log entry 
> including the statement with the duration.
> 
> Ed

[ Attachment, skipping... ]

> 
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v
retrieving revision 1.287
diff -c -c -r1.287 runtime.sgml
*** doc/src/sgml/runtime.sgml   9 Oct 2004 23:12:53 -0000       1.287
--- doc/src/sgml/runtime.sgml   15 Oct 2004 16:47:40 -0000
***************
*** 2355,2367 ****
        <term><varname>log_duration</varname> (<type>boolean</type>)</term>
        <listitem>
         <para>
!         Causes the duration of every completed statement to be logged.
!         To use this option, it is recommended that you also enable
!         <varname>log_statement</> and if not using <application>syslog</>
!         log the PID using <varname>log_line_prefix</> so that you
!         can link the statement to the duration using the process
!         ID. The default is off.  Only superusers can turn off this
!         option if it is enabled by the administrator.
         </para>
        </listitem>
       </varlistentry>
--- 2355,2368 ----
        <term><varname>log_duration</varname> (<type>boolean</type>)</term>
        <listitem>
         <para>
!         Causes the duration of every completed statement which satisfies
!         <varname>log_statement</> to be logged.  When using this option, 
!         if you are not using <application>syslog</>, it is recommended 
!         that you log the PID or session ID using <varname>log_line_prefix</> 
!         or log the session ID so that you can link the statement to the 
!         duration using the process ID or session ID. The default is off.  
!         Only superusers can turn off this option if it is enabled by the 
!         administrator.
         </para>
        </listitem>
       </varlistentry>
Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/tcop/postgres.c,v
retrieving revision 1.435
diff -c -c -r1.435 postgres.c
*** src/backend/tcop/postgres.c 12 Oct 2004 21:54:40 -0000      1.435
--- src/backend/tcop/postgres.c 15 Oct 2004 16:47:52 -0000
***************
*** 81,86 ****
--- 81,89 ----
  
  LogStmtLevel log_statement = LOGSTMT_NONE;
  
+ /* flag indicating if the statement satisfies log_statement */
+ bool          statement_logged;
+ 
  /* GUC variable for maximum stack depth (measured in kilobytes) */
  int                   max_stack_depth = 2048;
  
***************
*** 463,471 ****
--- 466,478 ----
        List       *raw_parsetree_list;
        ListCell   *parsetree_item;
  
+       statement_logged = false;
        if (log_statement == LOGSTMT_ALL)
+       {
                ereport(LOG,
                                (errmsg("statement: %s", query_string)));
+               statement_logged = true;
+       }
  
        if (log_parser_stats)
                ResetUsage();
***************
*** 501,506 ****
--- 508,514 ----
                        {
                                ereport(LOG,
                                                (errmsg("statement: %s", 
query_string)));
+                               statement_logged = true;
                                break;
                        }
                        commandTag = CreateCommandTag(parsetree);
***************
*** 512,517 ****
--- 520,526 ----
                        {
                                ereport(LOG,
                                                (errmsg("statement: %s", 
query_string)));
+                               statement_logged = true;
                                break;
                        }
                }
***************
*** 1003,1009 ****
                }
                usecs = (long) (stop_t.tv_sec - start_t.tv_sec) * 1000000 + (long) 
(stop_t.tv_usec - start_t.tv_usec);
  
!               if (save_log_duration)
                        ereport(LOG,
                                        (errmsg("duration: %ld.%03ld ms",
                                                (long) ((stop_t.tv_sec - 
start_t.tv_sec) * 1000 +
--- 1012,1019 ----
                }
                usecs = (long) (stop_t.tv_sec - start_t.tv_sec) * 1000000 + (long) 
(stop_t.tv_usec - start_t.tv_usec);
  
!               /* Only print duration if we previously printed the statement. */
!               if (statement_logged && save_log_duration)
                        ereport(LOG,
                                        (errmsg("duration: %ld.%03ld ms",
                                                (long) ((stop_t.tv_sec - 
start_t.tv_sec) * 1000 +
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to