From ccdb6627ee07f4bad658905c8b0c56cd29731e43 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 2 Jan 2009 01:16:02 +0000 Subject: [PATCH] Tweak guc.c to allow underscores in the names of custom variable classes, and change auto_explain's custom GUC variables to be named auto_explain.xxx not just explain.xxx. Per discussion in connection with the pg_stat_statements patch, it seems like a good idea to have the convention that custom variable classes are named the same as their defining module. Committing separately since this should happen regardless of what happens with pg_stat_statements itself. --- contrib/auto_explain/auto_explain.c | 40 ++++++++++++++--------------- doc/src/sgml/auto-explain.sgml | 38 +++++++++++++-------------- src/backend/utils/misc/guc.c | 8 +++--- 3 files changed, 42 insertions(+), 44 deletions(-) diff --git a/contrib/auto_explain/auto_explain.c b/contrib/auto_explain/auto_explain.c index 7526396084..af9975da12 100644 --- a/contrib/auto_explain/auto_explain.c +++ b/contrib/auto_explain/auto_explain.c @@ -6,7 +6,7 @@ * Copyright (c) 2008-2009, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/auto_explain/auto_explain.c,v 1.2 2009/01/01 17:23:31 momjian Exp $ + * $PostgreSQL: pgsql/contrib/auto_explain/auto_explain.c,v 1.3 2009/01/02 01:16:02 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -18,13 +18,11 @@ PG_MODULE_MAGIC; -#define GUCNAME(name) ("explain." name) - /* GUC variables */ -static int explain_log_min_duration = -1; /* msec or -1 */ -static bool explain_log_analyze = false; -static bool explain_log_verbose = false; -static bool explain_log_nested = false; +static int auto_explain_log_min_duration = -1; /* msec or -1 */ +static bool auto_explain_log_analyze = false; +static bool auto_explain_log_verbose = false; +static bool auto_explain_log_nested_statements = false; /* Current nesting depth of ExecutorRun calls */ static int nesting_level = 0; @@ -35,8 +33,8 @@ static ExecutorRun_hook_type prev_ExecutorRun = NULL; static ExecutorEnd_hook_type prev_ExecutorEnd = NULL; #define auto_explain_enabled() \ - (explain_log_min_duration >= 0 && \ - (nesting_level == 0 || explain_log_nested)) + (auto_explain_log_min_duration >= 0 && \ + (nesting_level == 0 || auto_explain_log_nested_statements)) void _PG_init(void); void _PG_fini(void); @@ -55,10 +53,10 @@ void _PG_init(void) { /* Define custom GUC variables. */ - DefineCustomIntVariable(GUCNAME("log_min_duration"), + DefineCustomIntVariable("auto_explain.log_min_duration", "Sets the minimum execution time above which plans will be logged.", "Zero prints all plans. -1 turns this feature off.", - &explain_log_min_duration, + &auto_explain_log_min_duration, -1, -1, INT_MAX / 1000, PGC_SUSET, @@ -66,30 +64,30 @@ _PG_init(void) NULL, NULL); - DefineCustomBoolVariable(GUCNAME("log_analyze"), + DefineCustomBoolVariable("auto_explain.log_analyze", "Use EXPLAIN ANALYZE for plan logging.", NULL, - &explain_log_analyze, + &auto_explain_log_analyze, false, PGC_SUSET, 0, NULL, NULL); - DefineCustomBoolVariable(GUCNAME("log_verbose"), + DefineCustomBoolVariable("auto_explain.log_verbose", "Use EXPLAIN VERBOSE for plan logging.", NULL, - &explain_log_verbose, + &auto_explain_log_verbose, false, PGC_SUSET, 0, NULL, NULL); - DefineCustomBoolVariable(GUCNAME("log_nested_statements"), + DefineCustomBoolVariable("auto_explain.log_nested_statements", "Log nested statements.", NULL, - &explain_log_nested, + &auto_explain_log_nested_statements, false, PGC_SUSET, 0, @@ -126,7 +124,7 @@ explain_ExecutorStart(QueryDesc *queryDesc, int eflags) if (auto_explain_enabled()) { /* Enable per-node instrumentation iff log_analyze is required. */ - if (explain_log_analyze && (eflags & EXEC_FLAG_EXPLAIN_ONLY) == 0) + if (auto_explain_log_analyze && (eflags & EXEC_FLAG_EXPLAIN_ONLY) == 0) queryDesc->doInstrument = true; } @@ -194,14 +192,14 @@ explain_ExecutorEnd(QueryDesc *queryDesc) /* Log plan if duration is exceeded. */ msec = queryDesc->totaltime->total * 1000.0; - if (msec >= explain_log_min_duration) + if (msec >= auto_explain_log_min_duration) { StringInfoData buf; initStringInfo(&buf); ExplainPrintPlan(&buf, queryDesc, - queryDesc->doInstrument && explain_log_analyze, - explain_log_verbose); + queryDesc->doInstrument && auto_explain_log_analyze, + auto_explain_log_verbose); /* Remove last line break */ if (buf.len > 0 && buf.data[buf.len - 1] == '\n') diff --git a/doc/src/sgml/auto-explain.sgml b/doc/src/sgml/auto-explain.sgml index 1a6dce0e42..c1e85af10e 100644 --- a/doc/src/sgml/auto-explain.sgml +++ b/doc/src/sgml/auto-explain.sgml @@ -1,4 +1,4 @@ - + auto_explain @@ -38,20 +38,20 @@ LOAD 'auto_explain'; There are several configuration parameters that control the behavior of auto_explain. Note that the default behavior is to do nothing, so you must set at least - explain.log_min_duration if you want any results. + auto_explain.log_min_duration if you want any results. - explain.log_min_duration (integer) + auto_explain.log_min_duration (integer) - explain.log_min_duration configuration parameter + auto_explain.log_min_duration configuration parameter - explain.log_min_duration is the minimum statement + auto_explain.log_min_duration is the minimum statement execution time, in milliseconds, that will cause the statement's plan to be logged. Setting this to zero logs all plans. Minus-one (the default) disables logging of plans. For example, if you set it to @@ -63,14 +63,14 @@ LOAD 'auto_explain'; - explain.log_analyze (boolean) + auto_explain.log_analyze (boolean) - explain.log_analyze configuration parameter + auto_explain.log_analyze configuration parameter - explain.log_analyze causes EXPLAIN ANALYZE + auto_explain.log_analyze causes EXPLAIN ANALYZE output, rather than just EXPLAIN output, to be printed when an execution plan is logged. This parameter is off by default. Only superusers can change this setting. @@ -87,14 +87,14 @@ LOAD 'auto_explain'; - explain.log_verbose (boolean) + auto_explain.log_verbose (boolean) - explain.log_verbose configuration parameter + auto_explain.log_verbose configuration parameter - explain.log_verbose causes EXPLAIN VERBOSE + auto_explain.log_verbose causes EXPLAIN VERBOSE output, rather than just EXPLAIN output, to be printed when an execution plan is logged. This parameter is off by default. Only superusers can change this setting. @@ -104,14 +104,14 @@ LOAD 'auto_explain'; - explain.log_nested_statements (boolean) + auto_explain.log_nested_statements (boolean) - explain.log_nested_statements configuration parameter + auto_explain.log_nested_statements configuration parameter - explain.log_nested_statements causes nested + auto_explain.log_nested_statements causes nested statements (statements executed inside a function) to be considered for logging. When it is off, only top-level query plans are logged. This parameter is off by default. Only superusers can change this setting. @@ -122,16 +122,16 @@ LOAD 'auto_explain'; In order to set these parameters in your postgresql.conf file, - you will need to add explain in - custom_variable_classes. Typical usage might be: + you will need to add auto_explain to + . Typical usage might be: # postgresql.conf shared_preload_libraries = 'auto_explain' -custom_variable_classes = 'explain' -explain.log_min_duration = '3s' +custom_variable_classes = 'auto_explain' +auto_explain.log_min_duration = '3s' @@ -140,7 +140,7 @@ explain.log_min_duration = '3s' postgres=# LOAD 'auto_explain'; - postgres=# SET explain.log_min_duration = 0; + postgres=# SET auto_explain.log_min_duration = 0; postgres=# SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 57ccfe256e..62649b8ef4 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut . * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.484 2009/01/01 17:23:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.485 2009/01/02 01:16:02 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -7283,11 +7283,11 @@ assign_custom_variable_classes(const char *newval, bool doit, GucSource source) continue; } - if (hasSpaceAfterToken || !isalnum((unsigned char) c)) + if (hasSpaceAfterToken || !(isalnum((unsigned char) c) || c == '_')) { /* - * Syntax error due to token following space after token or non - * alpha numeric character + * Syntax error due to token following space after token or + * non-identifier character */ pfree(buf.data); return NULL;