diff --git a/contrib/auto_explain/auto_explain.c b/contrib/auto_explain/auto_explain.c
index 7526396084c7acb674014c8d7d7a342822cd268a..af9975da1251e3769afd4f53f182213e484050e4 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 1a6dce0e427e93259fb35a09e91c21360bffe9df..c1e85af10e0f275152ad627e7d806704b8ad4298 100644
--- a/doc/src/sgml/auto-explain.sgml
+++ b/doc/src/sgml/auto-explain.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/auto-explain.sgml,v 1.2 2008/12/07 23:46:39 alvherre Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/auto-explain.sgml,v 1.3 2009/01/02 01:16:02 tgl Exp $ -->
 
 <sect1 id="auto-explain">
  <title>auto_explain</title>
@@ -38,20 +38,20 @@ LOAD 'auto_explain';
   There are several configuration parameters that control the behavior of
   <filename>auto_explain</filename>.  Note that the default behavior is
   to do nothing, so you must set at least
-  <varname>explain.log_min_duration</varname> if you want any results.
+  <varname>auto_explain.log_min_duration</varname> if you want any results.
  </para>
 
   <variablelist>
    <varlistentry>
     <term>
-     <varname>explain.log_min_duration</varname> (<type>integer</type>)
+     <varname>auto_explain.log_min_duration</varname> (<type>integer</type>)
     </term>
     <indexterm>
-     <primary><varname>explain.log_min_duration</> configuration parameter</primary>
+     <primary><varname>auto_explain.log_min_duration</> configuration parameter</primary>
     </indexterm>
     <listitem>
      <para>
-      <varname>explain.log_min_duration</varname> is the minimum statement
+      <varname>auto_explain.log_min_duration</varname> 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';
 
    <varlistentry>
     <term>
-     <varname>explain.log_analyze</varname> (<type>boolean</type>)
+     <varname>auto_explain.log_analyze</varname> (<type>boolean</type>)
     </term>
     <indexterm>
-     <primary><varname>explain.log_analyze</> configuration parameter</primary>
+     <primary><varname>auto_explain.log_analyze</> configuration parameter</primary>
     </indexterm>
     <listitem>
      <para>
-      <varname>explain.log_analyze</varname> causes <command>EXPLAIN ANALYZE</>
+      <varname>auto_explain.log_analyze</varname> causes <command>EXPLAIN ANALYZE</>
       output, rather than just <command>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';
 
    <varlistentry>
     <term>
-     <varname>explain.log_verbose</varname> (<type>boolean</type>)
+     <varname>auto_explain.log_verbose</varname> (<type>boolean</type>)
     </term>
     <indexterm>
-     <primary><varname>explain.log_verbose</> configuration parameter</primary>
+     <primary><varname>auto_explain.log_verbose</> configuration parameter</primary>
     </indexterm>
     <listitem>
      <para>
-      <varname>explain.log_verbose</varname> causes <command>EXPLAIN VERBOSE</>
+      <varname>auto_explain.log_verbose</varname> causes <command>EXPLAIN VERBOSE</>
       output, rather than just <command>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';
 
    <varlistentry>
     <term>
-     <varname>explain.log_nested_statements</varname> (<type>boolean</type>)
+     <varname>auto_explain.log_nested_statements</varname> (<type>boolean</type>)
     </term>
     <indexterm>
-     <primary><varname>explain.log_nested_statements</> configuration parameter</primary>
+     <primary><varname>auto_explain.log_nested_statements</> configuration parameter</primary>
     </indexterm>
     <listitem>
      <para>
-      <varname>explain.log_nested_statements</varname> causes nested
+      <varname>auto_explain.log_nested_statements</varname> 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';
 
   <para>
    In order to set these parameters in your <filename>postgresql.conf</> file,
-   you will need to add <literal>explain</> in
-   <varname>custom_variable_classes</>.  Typical usage might be:
+   you will need to add <literal>auto_explain</> to
+   <xref linkend="guc-custom-variable-classes">.  Typical usage might be:
   </para>
 
   <programlisting>
 # 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'
   </programlisting>
  </sect2>
 
@@ -140,7 +140,7 @@ explain.log_min_duration = '3s'
 
   <programlisting>
   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 57ccfe256e6fb6f7ee78e40360b354b7e38fa854..62649b8ef42da7ccfcab623cf167b5325149632d 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
- *	  $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;