Save source of GUC settings, allowing different sources to be processed in
authorPeter Eisentraut
Sat, 23 Feb 2002 01:31:37 +0000 (01:31 +0000)
committerPeter Eisentraut
Sat, 23 Feb 2002 01:31:37 +0000 (01:31 +0000)
any order without affecting results.

src/backend/bootstrap/bootstrap.c
src/backend/commands/variable.c
src/backend/postmaster/postmaster.c
src/backend/tcop/postgres.c
src/backend/utils/misc/guc-file.l
src/backend/utils/misc/guc.c
src/include/utils/guc.h

index cd118d30d74272cb5fd27d5bb4f5d318961c798c..48cbf570e83c47fb2f6de914f6f56aec7c688977 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.120 2002/01/10 01:11:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.121 2002/02/23 01:31:34 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -262,7 +262,7 @@ BootstrapMain(int argc, char *argv[])
                                         * parsing */
                break;
            case 'F':
-               SetConfigOption("fsync", "false", PGC_POSTMASTER, true);
+               SetConfigOption("fsync", "false", PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'o':
                StrNCpy(OutputFileName, optarg, MAXPGPATH);
@@ -274,7 +274,7 @@ BootstrapMain(int argc, char *argv[])
                /* indicates fork from postmaster */
                break;
            case 'B':
-               SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
            default:
                usage();
index 7d6300f4a911704daf9760fb6006859dd62e265d..1723733799ae7a36880fc673e50d6f35d9e8bc44 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.57 2001/12/09 04:37:50 thomas Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.58 2002/02/23 01:31:35 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -780,7 +780,7 @@ SetPGVariable(const char *name, List *args)
        if (strcasecmp(name, "session_authorization") == 0)
            SetSessionAuthorization(value);
        else
-           SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET, false);
+           SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET, PGC_S_SESSION);
    }
    return;
 }
@@ -846,5 +846,5 @@ ResetPGVariable(const char *name)
    else
        SetConfigOption(name, NULL,
                        superuser() ? PGC_SUSET : PGC_USERSET,
-                       false);
+                       PGC_S_SESSION);
 }
index 6fe2cdd61bbbc5e1740f8e18215b2b43b3009a43..6bd43cae144a3e8835ed8916a8b4ba8f11a10853 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.266 2002/02/19 20:45:04 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.267 2002/02/23 01:31:35 petere Exp $
  *
  * NOTES
  *
@@ -396,6 +396,8 @@ PostmasterMain(int argc, char *argv[])
                                              ALLOCSET_DEFAULT_MAXSIZE);
    MemoryContextSwitchTo(PostmasterContext);
 
+   IgnoreSystemIndexes(false);
+
    /*
     * Options setup
     */
@@ -403,60 +405,12 @@ PostmasterMain(int argc, char *argv[])
 
    /* PGPORT environment variable, if set, overrides GUC setting */
    if (getenv("PGPORT"))
-       SetConfigOption("port", getenv("PGPORT"), PGC_POSTMASTER, true);
+       SetConfigOption("port", getenv("PGPORT"),
+                       PGC_POSTMASTER, PGC_S_ARGV/*sortof*/);
 
    potential_DataDir = getenv("PGDATA");       /* default value */
 
-   /*
-    * First we must scan for a -D argument to get the data dir. Then read
-    * the config file. Finally, scan all the other arguments. (Command
-    * line switches override config file.)
-    *
-    * Note: The two lists of options must be exactly the same, even though
-    * perhaps the first one would only have to be "D:" with opterr turned
-    * off. But some versions of getopt (notably GNU) are going to
-    * arbitrarily permute some "non-options" (according to the local
-    * world view) which will result in some switches being associated
-    * with the wrong argument. Death and destruction will occur.
-    */
    opterr = 1;
-   while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Fh:ik:lm:MN:no:p:Ss-:")) != -1)
-   {
-       switch (opt)
-       {
-           case 'D':
-               potential_DataDir = optarg;
-               break;
-
-           case '?':
-               fprintf(stderr, gettext("Try '%s --help' for more information.\n"), progname);
-               ExitPostmaster(1);
-       }
-   }
-
-   /*
-    * Postmaster accepts no non-option switch arguments.
-    */
-   if (optind < argc)
-   {
-       postmaster_error("invalid argument -- %s", argv[optind]);
-       fprintf(stderr, gettext("Try '%s --help' for more information.\n"),
-               progname);
-       ExitPostmaster(1);
-   }
-
-   checkDataDir(potential_DataDir);    /* issues error messages */
-   SetDataDir(potential_DataDir);
-
-   ProcessConfigFile(PGC_POSTMASTER);
-
-   IgnoreSystemIndexes(false);
-
-   /* reset getopt(3) to rescan arguments */
-   optind = 1;
-#ifdef HAVE_INT_OPTRESET
-   optreset = 1;               /* some systems need this too */
-#endif
 
    while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Fh:ik:lm:MN:no:p:Ss-:")) != -1)
    {
@@ -464,7 +418,7 @@ PostmasterMain(int argc, char *argv[])
        {
            case 'A':
 #ifdef USE_ASSERT_CHECKING
-               SetConfigOption("debug_assertions", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("debug_assertions", optarg, PGC_POSTMASTER, PGC_S_ARGV);
 #else
                postmaster_error("Assert checking is not compiled in.");
 #endif
@@ -473,13 +427,13 @@ PostmasterMain(int argc, char *argv[])
                /* Can no longer set authentication method. */
                break;
            case 'B':
-               SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'b':
                /* Can no longer set the backend executable file to use. */
                break;
            case 'D':
-               /* already done above */
+               potential_DataDir = optarg;
                break;
            case 'd':
 
@@ -487,23 +441,23 @@ PostmasterMain(int argc, char *argv[])
                 * Turn on debugging for the postmaster and the backend
                 * servers descended from it.
                 */
-               SetConfigOption("debug_level", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("debug_level", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'F':
-               SetConfigOption("fsync", "false", PGC_POSTMASTER, true);
+               SetConfigOption("fsync", "false", PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'h':
-               SetConfigOption("virtual_host", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("virtual_host", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'i':
-               SetConfigOption("tcpip_socket", "true", PGC_POSTMASTER, true);
+               SetConfigOption("tcpip_socket", "true", PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'k':
-               SetConfigOption("unix_socket_directory", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("unix_socket_directory", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
 #ifdef USE_SSL
            case 'l':
-               SetConfigOption("ssl", "true", PGC_POSTMASTER, true);
+               SetConfigOption("ssl", "true", PGC_POSTMASTER, PGC_S_ARGV);
                break;
 #endif
            case 'm':
@@ -519,7 +473,7 @@ PostmasterMain(int argc, char *argv[])
                break;
            case 'N':
                /* The max number of backends to start. */
-               SetConfigOption("max_connections", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("max_connections", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'n':
                /* Don't reinit shared mem after abnormal exit */
@@ -536,7 +490,7 @@ PostmasterMain(int argc, char *argv[])
                strcpy(original_extraoptions, optarg);
                break;
            case 'p':
-               SetConfigOption("port", optarg, PGC_POSTMASTER, true);
+               SetConfigOption("port", optarg, PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 'S':
 
@@ -546,7 +500,7 @@ PostmasterMain(int argc, char *argv[])
                 * it's most badly needed on SysV-derived systems like
                 * SVR4 and HP-UX.
                 */
-               SetConfigOption("silent_mode", "true", PGC_POSTMASTER, true);
+               SetConfigOption("silent_mode", "true", PGC_POSTMASTER, PGC_S_ARGV);
                break;
            case 's':
 
@@ -573,7 +527,7 @@ PostmasterMain(int argc, char *argv[])
                            elog(ERROR, "-c %s requires argument", optarg);
                    }
 
-                   SetConfigOption(name, value, PGC_POSTMASTER, true);
+                   SetConfigOption(name, value, PGC_POSTMASTER, PGC_S_ARGV);
                    free(name);
                    if (value)
                        free(value);
@@ -581,12 +535,22 @@ PostmasterMain(int argc, char *argv[])
                }
 
            default:
-               /* shouldn't get here */
                fprintf(stderr, gettext("Try '%s --help' for more information.\n"), progname);
                ExitPostmaster(1);
        }
    }
 
+   /*
+    * Postmaster accepts no non-option switch arguments.
+    */
+   if (optind < argc)
+   {
+       postmaster_error("invalid argument -- %s", argv[optind]);
+       fprintf(stderr, gettext("Try '%s --help' for more information.\n"),
+               progname);
+       ExitPostmaster(1);
+   }
+
    /*
     * Check for invalid combinations of switches
     */
@@ -601,6 +565,11 @@ PostmasterMain(int argc, char *argv[])
        ExitPostmaster(1);
    }
 
+   checkDataDir(potential_DataDir);    /* issues error messages */
+   SetDataDir(potential_DataDir);
+
+   ProcessConfigFile(PGC_POSTMASTER);
+
    /*
     * Now that we are done processing the postmaster arguments, reset
     * getopt(3) library so that it will work correctly in subprocesses.
index e1357670cb8ab75930ab63aa214d55801a113de9..976b434655f307f2313930d55f8b56473f8d9387 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.246 2002/02/19 19:54:43 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.247 2002/02/23 01:31:36 petere Exp $
  *
  * NOTES
  *   this is the "main" module of the postgres backend and
@@ -1089,6 +1089,7 @@ PostgresMain(int argc, char *argv[], const char *username)
    bool        secure;
    int         errs = 0;
    GucContext  ctx;
+   GucSource   gucsource;
    char       *tmp;
 
    int         firstchar;
@@ -1164,13 +1165,14 @@ PostgresMain(int argc, char *argv[], const char *username)
    /* all options are allowed until '-p' */
    secure = true;
    ctx = PGC_POSTMASTER;
+   gucsource = PGC_S_ARGV;     /* initial switches came from command line */
 
    while ((flag = getopt(argc, argv, "A:B:c:CD:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != -1)
        switch (flag)
        {
            case 'A':
 #ifdef USE_ASSERT_CHECKING
-               SetConfigOption("debug_assertions", optarg, ctx, true);
+               SetConfigOption("debug_assertions", optarg, ctx, gucsource);
 #else
                elog(NOTICE, "Assert checking is not compiled in");
 #endif
@@ -1181,7 +1183,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                /*
                 * specify the size of buffer pool
                 */
-               SetConfigOption("shared_buffers", optarg, ctx, true);
+               SetConfigOption("shared_buffers", optarg, ctx, gucsource);
                break;
 
            case 'C':
@@ -1198,17 +1200,17 @@ PostgresMain(int argc, char *argv[], const char *username)
                break;
 
            case 'd':           /* debug level */
-               SetConfigOption("debug_level", optarg, ctx, true);
+               SetConfigOption("debug_level", optarg, ctx, gucsource);
                if (DebugLvl >= 1)
-                   SetConfigOption("log_connections", "true", ctx, true);
+                   SetConfigOption("log_connections", "true", ctx, gucsource);
                if (DebugLvl >= 2)
-                   SetConfigOption("debug_print_query", "true", ctx, true);
+                   SetConfigOption("debug_print_query", "true", ctx, gucsource);
                if (DebugLvl >= 3)
-                   SetConfigOption("debug_print_parse", "true", ctx, true);
+                   SetConfigOption("debug_print_parse", "true", ctx, gucsource);
                if (DebugLvl >= 4)
-                   SetConfigOption("debug_print_plan", "true", ctx, true);
+                   SetConfigOption("debug_print_plan", "true", ctx, gucsource);
                if (DebugLvl >= 5)
-                   SetConfigOption("debug_print_rewritten", "true", ctx, true);
+                   SetConfigOption("debug_print_rewritten", "true", ctx, gucsource);
                break;
 
            case 'E':
@@ -1232,7 +1234,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                /*
                 * turn off fsync
                 */
-               SetConfigOption("fsync", "false", ctx, true);
+               SetConfigOption("fsync", "false", ctx, gucsource);
                break;
 
            case 'f':
@@ -1265,7 +1267,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                        errs++;
                }
                if (tmp)
-                   SetConfigOption(tmp, "false", ctx, true);
+                   SetConfigOption(tmp, "false", ctx, gucsource);
                break;
 
            case 'i':
@@ -1319,6 +1321,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                    secure = false;     /* subsequent switches are NOT
                                         * secure */
                    ctx = PGC_BACKEND;
+                   gucsource = PGC_S_CLIENT;
                }
                break;
 
@@ -1327,7 +1330,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                /*
                 * S - amount of sort memory to use in 1k bytes
                 */
-               SetConfigOption("sort_mem", optarg, ctx, true);
+               SetConfigOption("sort_mem", optarg, ctx, gucsource);
                break;
 
            case 's':
@@ -1335,7 +1338,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                /*
                 * s - report usage statistics (timings) after each query
                 */
-               SetConfigOption("show_query_stats", "true", ctx, true);
+               SetConfigOption("show_query_stats", "true", ctx, gucsource);
                break;
 
            case 't':
@@ -1368,7 +1371,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                        break;
                }
                if (tmp)
-                   SetConfigOption(tmp, "true", ctx, true);
+                   SetConfigOption(tmp, "true", ctx, gucsource);
                break;
 
            case 'v':
@@ -1432,7 +1435,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                            elog(ERROR, "-c %s requires argument", optarg);
                    }
 
-                   SetConfigOption(name, value, ctx, true);
+                   SetConfigOption(name, value, ctx, gucsource);
                    free(name);
                    if (value)
                        free(value);
@@ -1451,7 +1454,7 @@ PostgresMain(int argc, char *argv[], const char *username)
        (Show_parser_stats || Show_planner_stats || Show_executor_stats))
    {
        elog(NOTICE, "Query statistics are disabled because parser, planner, or executor statistics are on.");
-       SetConfigOption("show_query_stats", "false", ctx, true);
+       SetConfigOption("show_query_stats", "false", ctx, gucsource);
    }
 
    if (!IsUnderPostmaster)
@@ -1623,7 +1626,7 @@ PostgresMain(int argc, char *argv[], const char *username)
    if (!IsUnderPostmaster)
    {
        puts("\nPOSTGRES backend interactive interface ");
-       puts("$Revision: 1.246 $ $Date: 2002/02/19 19:54:43 $\n");
+       puts("$Revision: 1.247 $ $Date: 2002/02/23 01:31:36 $\n");
    }
 
    /*
index c6d96f5ac8a73abcdde7d29853e2c8f01ad13f1e..b4fffd72529998075080eae6f7b5966da6202d8d 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v 1.9 2001/08/06 13:45:15 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v 1.10 2002/02/23 01:31:36 petere Exp $
  */
 
 %{
@@ -240,13 +240,15 @@ ProcessConfigFile(GucContext context)
     */
     for(item = head; item; item=item->next)
    {
-       if (!set_config_option(item->name, item->value, context, false, false))
+       if (!set_config_option(item->name, item->value, context,
+                              false, PGC_S_INFINITY))
            goto cleanup_exit;
    }
 
     /* If we got here all the options parsed okay. */
    for(item = head; item; item=item->next)
-       set_config_option(item->name, item->value, context, true, true);
+       set_config_option(item->name, item->value, context,
+                         true, PGC_S_FILE);
 
  cleanup_exit:
    free_name_value_list(head);
index c2e697417481eaf2f37cb3a86f236ace230b90a1..6e112caa43c65990ebcb2a3a6c2d3ce27a8a6f2c 100644 (file)
@@ -4,7 +4,7 @@
  * Support for grand unified configuration scheme, including SET
  * command, configuration file, and command line options.
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.58 2001/10/30 05:38:56 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.59 2002/02/23 01:31:36 petere Exp $
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  * Written by Peter Eisentraut .
@@ -107,6 +107,7 @@ struct config_generic
 {
    const char *name;
    GucContext  context;
+   GucSource   source;
    void       *variable;
 };
 
@@ -115,6 +116,7 @@ struct config_bool
 {
    const char *name;
    GucContext  context;
+   GucSource   source;
    bool       *variable;
    bool        default_val;
    /* No need for parse_hook ... presumably both values are legal */
@@ -126,6 +128,7 @@ struct config_int
 {
    const char *name;
    GucContext  context;
+   GucSource   source;
    int        *variable;
    int         default_val;
    int         min;
@@ -139,6 +142,7 @@ struct config_real
 {
    const char *name;
    GucContext  context;
+   GucSource   source;
    double     *variable;
    double      default_val;
    double      min;
@@ -157,6 +161,7 @@ struct config_string
 {
    const char *name;
    GucContext  context;
+   GucSource   source;
    char      **variable;
    const char *boot_default_val;
    bool        (*parse_hook) (const char *proposed);
@@ -193,157 +198,157 @@ static struct config_bool
            ConfigureNamesBool[] =
 {
    {
-       "enable_seqscan", PGC_USERSET, &enable_seqscan, true, NULL
+       "enable_seqscan", PGC_USERSET, PGC_S_DEFAULT, &enable_seqscan, true, NULL
    },
    {
-       "enable_indexscan", PGC_USERSET, &enable_indexscan, true, NULL
+       "enable_indexscan", PGC_USERSET, PGC_S_DEFAULT, &enable_indexscan, true, NULL
    },
    {
-       "enable_tidscan", PGC_USERSET, &enable_tidscan, true, NULL
+       "enable_tidscan", PGC_USERSET, PGC_S_DEFAULT, &enable_tidscan, true, NULL
    },
    {
-       "enable_sort", PGC_USERSET, &enable_sort, true, NULL
+       "enable_sort", PGC_USERSET, PGC_S_DEFAULT, &enable_sort, true, NULL
    },
    {
-       "enable_nestloop", PGC_USERSET, &enable_nestloop, true, NULL
+       "enable_nestloop", PGC_USERSET, PGC_S_DEFAULT, &enable_nestloop, true, NULL
    },
    {
-       "enable_mergejoin", PGC_USERSET, &enable_mergejoin, true, NULL
+       "enable_mergejoin", PGC_USERSET, PGC_S_DEFAULT, &enable_mergejoin, true, NULL
    },
    {
-       "enable_hashjoin", PGC_USERSET, &enable_hashjoin, true, NULL
+       "enable_hashjoin", PGC_USERSET, PGC_S_DEFAULT, &enable_hashjoin, true, NULL
    },
 
    {
-       "ksqo", PGC_USERSET, &_use_keyset_query_optimizer, false, NULL
+       "ksqo", PGC_USERSET, PGC_S_DEFAULT, &_use_keyset_query_optimizer, false, NULL
    },
    {
-       "geqo", PGC_USERSET, &enable_geqo, true, NULL
+       "geqo", PGC_USERSET, PGC_S_DEFAULT, &enable_geqo, true, NULL
    },
 
    {
-       "tcpip_socket", PGC_POSTMASTER, &NetServer, false, NULL
+       "tcpip_socket", PGC_POSTMASTER, PGC_S_DEFAULT, &NetServer, false, NULL
    },
    {
-       "ssl", PGC_POSTMASTER, &EnableSSL, false, NULL
+       "ssl", PGC_POSTMASTER, PGC_S_DEFAULT, &EnableSSL, false, NULL
    },
    {
-       "fsync", PGC_SIGHUP, &enableFsync, true, NULL
+       "fsync", PGC_SIGHUP, PGC_S_DEFAULT, &enableFsync, true, NULL
    },
    {
-       "silent_mode", PGC_POSTMASTER, &SilentMode, false, NULL
+       "silent_mode", PGC_POSTMASTER, PGC_S_DEFAULT, &SilentMode, false, NULL
    },
 
    {
-       "log_connections", PGC_BACKEND, &Log_connections, false, NULL
+       "log_connections", PGC_BACKEND, PGC_S_DEFAULT, &Log_connections, false, NULL
    },
    {
-       "log_timestamp", PGC_SIGHUP, &Log_timestamp, false, NULL
+       "log_timestamp", PGC_SIGHUP, PGC_S_DEFAULT, &Log_timestamp, false, NULL
    },
    {
-       "log_pid", PGC_SIGHUP, &Log_pid, false, NULL
+       "log_pid", PGC_SIGHUP, PGC_S_DEFAULT, &Log_pid, false, NULL
    },
 
 #ifdef USE_ASSERT_CHECKING
    {
-       "debug_assertions", PGC_USERSET, &assert_enabled, true, NULL
+       "debug_assertions", PGC_USERSET, PGC_S_DEFAULT, &assert_enabled, true, NULL
    },
 #endif
 
    {
-       "debug_print_query", PGC_USERSET, &Debug_print_query, false, NULL
+       "debug_print_query", PGC_USERSET, PGC_S_DEFAULT, &Debug_print_query, false, NULL
    },
    {
-       "debug_print_parse", PGC_USERSET, &Debug_print_parse, false, NULL
+       "debug_print_parse", PGC_USERSET, PGC_S_DEFAULT, &Debug_print_parse, false, NULL
    },
    {
-       "debug_print_rewritten", PGC_USERSET, &Debug_print_rewritten, false, NULL
+       "debug_print_rewritten", PGC_USERSET, PGC_S_DEFAULT, &Debug_print_rewritten, false, NULL
    },
    {
-       "debug_print_plan", PGC_USERSET, &Debug_print_plan, false, NULL
+       "debug_print_plan", PGC_USERSET, PGC_S_DEFAULT, &Debug_print_plan, false, NULL
    },
    {
-       "debug_pretty_print", PGC_USERSET, &Debug_pretty_print, false, NULL
+       "debug_pretty_print", PGC_USERSET, PGC_S_DEFAULT, &Debug_pretty_print, false, NULL
    },
 
    {
-       "show_parser_stats", PGC_USERSET, &Show_parser_stats, false, NULL
+       "show_parser_stats", PGC_USERSET, PGC_S_DEFAULT, &Show_parser_stats, false, NULL
    },
    {
-       "show_planner_stats", PGC_USERSET, &Show_planner_stats, false, NULL
+       "show_planner_stats", PGC_USERSET, PGC_S_DEFAULT, &Show_planner_stats, false, NULL
    },
    {
-       "show_executor_stats", PGC_USERSET, &Show_executor_stats, false, NULL
+       "show_executor_stats", PGC_USERSET, PGC_S_DEFAULT, &Show_executor_stats, false, NULL
    },
    {
-       "show_query_stats", PGC_USERSET, &Show_query_stats, false, NULL
+       "show_query_stats", PGC_USERSET, PGC_S_DEFAULT, &Show_query_stats, false, NULL
    },
 #ifdef BTREE_BUILD_STATS
    {
-       "show_btree_build_stats", PGC_SUSET, &Show_btree_build_stats, false, NULL
+       "show_btree_build_stats", PGC_SUSET, PGC_S_DEFAULT, &Show_btree_build_stats, false, NULL
    },
 #endif
 
    {
-       "stats_start_collector", PGC_POSTMASTER, &pgstat_collect_startcollector, true, NULL
+       "stats_start_collector", PGC_POSTMASTER, PGC_S_DEFAULT, &pgstat_collect_startcollector, true, NULL
    },
    {
-       "stats_reset_on_server_start", PGC_POSTMASTER, &pgstat_collect_resetonpmstart, true, NULL
+       "stats_reset_on_server_start", PGC_POSTMASTER, PGC_S_DEFAULT, &pgstat_collect_resetonpmstart, true, NULL
    },
    {
-       "stats_command_string", PGC_SUSET, &pgstat_collect_querystring, false, NULL
+       "stats_command_string", PGC_SUSET, PGC_S_DEFAULT, &pgstat_collect_querystring, false, NULL
    },
    {
-       "stats_row_level", PGC_SUSET, &pgstat_collect_tuplelevel, false, NULL
+       "stats_row_level", PGC_SUSET, PGC_S_DEFAULT, &pgstat_collect_tuplelevel, false, NULL
    },
    {
-       "stats_block_level", PGC_SUSET, &pgstat_collect_blocklevel, false, NULL
+       "stats_block_level", PGC_SUSET, PGC_S_DEFAULT, &pgstat_collect_blocklevel, false, NULL
    },
 
    {
-       "trace_notify", PGC_USERSET, &Trace_notify, false, NULL
+       "trace_notify", PGC_USERSET, PGC_S_DEFAULT, &Trace_notify, false, NULL
    },
 
 #ifdef LOCK_DEBUG
    {
-       "trace_locks", PGC_SUSET, &Trace_locks, false, NULL
+       "trace_locks", PGC_SUSET, PGC_S_DEFAULT, &Trace_locks, false, NULL
    },
    {
-       "trace_userlocks", PGC_SUSET, &Trace_userlocks, false, NULL
+       "trace_userlocks", PGC_SUSET, PGC_S_DEFAULT, &Trace_userlocks, false, NULL
    },
    {
-       "trace_lwlocks", PGC_SUSET, &Trace_lwlocks, false, NULL
+       "trace_lwlocks", PGC_SUSET, PGC_S_DEFAULT, &Trace_lwlocks, false, NULL
    },
    {
-       "debug_deadlocks", PGC_SUSET, &Debug_deadlocks, false, NULL
+       "debug_deadlocks", PGC_SUSET, PGC_S_DEFAULT, &Debug_deadlocks, false, NULL
    },
 #endif
 
    {
-       "hostname_lookup", PGC_SIGHUP, &HostnameLookup, false, NULL
+       "hostname_lookup", PGC_SIGHUP, PGC_S_DEFAULT, &HostnameLookup, false, NULL
    },
    {
-       "show_source_port", PGC_SIGHUP, &ShowPortNumber, false, NULL
+       "show_source_port", PGC_SIGHUP, PGC_S_DEFAULT, &ShowPortNumber, false, NULL
    },
 
    {
-       "sql_inheritance", PGC_USERSET, &SQL_inheritance, true, NULL
+       "sql_inheritance", PGC_USERSET, PGC_S_DEFAULT, &SQL_inheritance, true, NULL
    },
    {
-       "australian_timezones", PGC_USERSET, &Australian_timezones, false, ClearDateCache
+       "australian_timezones", PGC_USERSET, PGC_S_DEFAULT, &Australian_timezones, false, ClearDateCache
    },
    {
-       "fixbtree", PGC_POSTMASTER, &FixBTree, true, NULL
+       "fixbtree", PGC_POSTMASTER, PGC_S_DEFAULT, &FixBTree, true, NULL
    },
    {
-       "password_encryption", PGC_USERSET, &Password_encryption, false, NULL
+       "password_encryption", PGC_USERSET, PGC_S_DEFAULT, &Password_encryption, false, NULL
    },
    {
-       "transform_null_equals", PGC_USERSET, &Transform_null_equals, false, NULL
+       "transform_null_equals", PGC_USERSET, PGC_S_DEFAULT, &Transform_null_equals, false, NULL
    },
 
    {
-       NULL, 0, NULL, false, NULL
+       NULL, 0, 0, NULL, false, NULL
    }
 };
 
@@ -352,34 +357,34 @@ static struct config_int
            ConfigureNamesInt[] =
 {
    {
-       "geqo_threshold", PGC_USERSET, &geqo_rels,
+       "geqo_threshold", PGC_USERSET, PGC_S_DEFAULT, &geqo_rels,
        DEFAULT_GEQO_RELS, 2, INT_MAX, NULL, NULL
    },
    {
-       "geqo_pool_size", PGC_USERSET, &Geqo_pool_size,
+       "geqo_pool_size", PGC_USERSET, PGC_S_DEFAULT, &Geqo_pool_size,
        DEFAULT_GEQO_POOL_SIZE, 0, MAX_GEQO_POOL_SIZE, NULL, NULL
    },
    {
-       "geqo_effort", PGC_USERSET, &Geqo_effort,
+       "geqo_effort", PGC_USERSET, PGC_S_DEFAULT, &Geqo_effort,
        1, 1, INT_MAX, NULL, NULL
    },
    {
-       "geqo_generations", PGC_USERSET, &Geqo_generations,
+       "geqo_generations", PGC_USERSET, PGC_S_DEFAULT, &Geqo_generations,
        0, 0, INT_MAX, NULL, NULL
    },
    {
-       "geqo_random_seed", PGC_USERSET, &Geqo_random_seed,
+       "geqo_random_seed", PGC_USERSET, PGC_S_DEFAULT, &Geqo_random_seed,
        -1, INT_MIN, INT_MAX, NULL, NULL
    },
 
    {
-       "deadlock_timeout", PGC_POSTMASTER, &DeadlockTimeout,
+       "deadlock_timeout", PGC_POSTMASTER, PGC_S_DEFAULT, &DeadlockTimeout,
        1000, 0, INT_MAX, NULL, NULL
    },
 
 #ifdef ENABLE_SYSLOG
    {
-       "syslog", PGC_SIGHUP, &Use_syslog,
+       "syslog", PGC_SIGHUP, PGC_S_DEFAULT, &Use_syslog,
        0, 0, 2, NULL, NULL
    },
 #endif
@@ -390,121 +395,121 @@ static struct config_int
     * constraints here are partially unused.
     */
    {
-       "max_connections", PGC_POSTMASTER, &MaxBackends,
+       "max_connections", PGC_POSTMASTER, PGC_S_DEFAULT, &MaxBackends,
        DEF_MAXBACKENDS, 1, INT_MAX, NULL, NULL
    },
 
    {
-       "shared_buffers", PGC_POSTMASTER, &NBuffers,
+       "shared_buffers", PGC_POSTMASTER, PGC_S_DEFAULT, &NBuffers,
        DEF_NBUFFERS, 16, INT_MAX, NULL, NULL
    },
 
    {
-       "port", PGC_POSTMASTER, &PostPortNumber,
+       "port", PGC_POSTMASTER, PGC_S_DEFAULT, &PostPortNumber,
        DEF_PGPORT, 1, 65535, NULL, NULL
    },
 
    {
-       "unix_socket_permissions", PGC_POSTMASTER, &Unix_socket_permissions,
+       "unix_socket_permissions", PGC_POSTMASTER, PGC_S_DEFAULT, &Unix_socket_permissions,
        0777, 0000, 0777, NULL, NULL
    },
 
    {
-       "sort_mem", PGC_USERSET, &SortMem,
+       "sort_mem", PGC_USERSET, PGC_S_DEFAULT, &SortMem,
        512, 4 * BLCKSZ / 1024, INT_MAX, NULL, NULL
    },
 
    {
-       "vacuum_mem", PGC_USERSET, &VacuumMem,
+       "vacuum_mem", PGC_USERSET, PGC_S_DEFAULT, &VacuumMem,
        8192, 1024, INT_MAX, NULL, NULL
    },
 
    {
-       "max_files_per_process", PGC_BACKEND, &max_files_per_process,
+       "max_files_per_process", PGC_BACKEND, PGC_S_DEFAULT, &max_files_per_process,
        1000, 25, INT_MAX, NULL, NULL
    },
 
    {
-       "debug_level", PGC_USERSET, &DebugLvl,
+       "debug_level", PGC_USERSET, PGC_S_DEFAULT, &DebugLvl,
        0, 0, 16, NULL, NULL
    },
 
 #ifdef LOCK_DEBUG
    {
-       "trace_lock_oidmin", PGC_SUSET, &Trace_lock_oidmin,
+       "trace_lock_oidmin", PGC_SUSET, PGC_S_DEFAULT, &Trace_lock_oidmin,
        BootstrapObjectIdData, 1, INT_MAX, NULL, NULL
    },
    {
-       "trace_lock_table", PGC_SUSET, &Trace_lock_table,
+       "trace_lock_table", PGC_SUSET, PGC_S_DEFAULT, &Trace_lock_table,
        0, 0, INT_MAX, NULL, NULL
    },
 #endif
    {
-       "max_expr_depth", PGC_USERSET, &max_expr_depth,
+       "max_expr_depth", PGC_USERSET, PGC_S_DEFAULT, &max_expr_depth,
        DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX, NULL, NULL
    },
 
    {
-       "max_fsm_relations", PGC_POSTMASTER, &MaxFSMRelations,
+       "max_fsm_relations", PGC_POSTMASTER, PGC_S_DEFAULT, &MaxFSMRelations,
        100, 10, INT_MAX, NULL, NULL
    },
    {
-       "max_fsm_pages", PGC_POSTMASTER, &MaxFSMPages,
+       "max_fsm_pages", PGC_POSTMASTER, PGC_S_DEFAULT, &MaxFSMPages,
        10000, 1000, INT_MAX, NULL, NULL
    },
 
    {
-       "max_locks_per_transaction", PGC_POSTMASTER, &max_locks_per_xact,
+       "max_locks_per_transaction", PGC_POSTMASTER, PGC_S_DEFAULT, &max_locks_per_xact,
        64, 10, INT_MAX, NULL, NULL
    },
 
    {
-       "authentication_timeout", PGC_SIGHUP, &AuthenticationTimeout,
+       "authentication_timeout", PGC_SIGHUP, PGC_S_DEFAULT, &AuthenticationTimeout,
        60, 1, 600, NULL, NULL
    },
 
    {
-       "pre_auth_delay", PGC_SIGHUP, &PreAuthDelay,
+       "pre_auth_delay", PGC_SIGHUP, PGC_S_DEFAULT, &PreAuthDelay,
        0, 0, 60, NULL, NULL
    },
 
    {
-       "checkpoint_segments", PGC_SIGHUP, &CheckPointSegments,
+       "checkpoint_segments", PGC_SIGHUP, PGC_S_DEFAULT, &CheckPointSegments,
        3, 1, INT_MAX, NULL, NULL
    },
 
    {
-       "checkpoint_timeout", PGC_SIGHUP, &CheckPointTimeout,
+       "checkpoint_timeout", PGC_SIGHUP, PGC_S_DEFAULT, &CheckPointTimeout,
        300, 30, 3600, NULL, NULL
    },
 
    {
-       "wal_buffers", PGC_POSTMASTER, &XLOGbuffers,
+       "wal_buffers", PGC_POSTMASTER, PGC_S_DEFAULT, &XLOGbuffers,
        8, 4, INT_MAX, NULL, NULL
    },
 
    {
-       "wal_files", PGC_SIGHUP, &XLOGfiles,
+       "wal_files", PGC_SIGHUP, PGC_S_DEFAULT, &XLOGfiles,
        0, 0, 64, NULL, NULL
    },
 
    {
-       "wal_debug", PGC_SUSET, &XLOG_DEBUG,
+       "wal_debug", PGC_SUSET, PGC_S_DEFAULT, &XLOG_DEBUG,
        0, 0, 16, NULL, NULL
    },
 
    {
-       "commit_delay", PGC_USERSET, &CommitDelay,
+       "commit_delay", PGC_USERSET, PGC_S_DEFAULT, &CommitDelay,
        0, 0, 100000, NULL, NULL
    },
 
    {
-       "commit_siblings", PGC_USERSET, &CommitSiblings,
+       "commit_siblings", PGC_USERSET, PGC_S_DEFAULT, &CommitSiblings,
        5, 1, 1000, NULL, NULL
    },
 
    {
-       NULL, 0, NULL, 0, 0, 0, NULL, NULL
+       NULL, 0, 0, NULL, 0, 0, 0, NULL, NULL
    }
 };
 
@@ -513,34 +518,34 @@ static struct config_real
            ConfigureNamesReal[] =
 {
    {
-       "effective_cache_size", PGC_USERSET, &effective_cache_size,
+       "effective_cache_size", PGC_USERSET, PGC_S_DEFAULT, &effective_cache_size,
        DEFAULT_EFFECTIVE_CACHE_SIZE, 0, DBL_MAX, NULL, NULL
    },
    {
-       "random_page_cost", PGC_USERSET, &random_page_cost,
+       "random_page_cost", PGC_USERSET, PGC_S_DEFAULT, &random_page_cost,
        DEFAULT_RANDOM_PAGE_COST, 0, DBL_MAX, NULL, NULL
    },
    {
-       "cpu_tuple_cost", PGC_USERSET, &cpu_tuple_cost,
+       "cpu_tuple_cost", PGC_USERSET, PGC_S_DEFAULT, &cpu_tuple_cost,
        DEFAULT_CPU_TUPLE_COST, 0, DBL_MAX, NULL, NULL
    },
    {
-       "cpu_index_tuple_cost", PGC_USERSET, &cpu_index_tuple_cost,
+       "cpu_index_tuple_cost", PGC_USERSET, PGC_S_DEFAULT, &cpu_index_tuple_cost,
        DEFAULT_CPU_INDEX_TUPLE_COST, 0, DBL_MAX, NULL, NULL
    },
    {
-       "cpu_operator_cost", PGC_USERSET, &cpu_operator_cost,
+       "cpu_operator_cost", PGC_USERSET, PGC_S_DEFAULT, &cpu_operator_cost,
        DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL
    },
 
    {
-       "geqo_selection_bias", PGC_USERSET, &Geqo_selection_bias,
+       "geqo_selection_bias", PGC_USERSET, PGC_S_DEFAULT, &Geqo_selection_bias,
        DEFAULT_GEQO_SELECTION_BIAS, MIN_GEQO_SELECTION_BIAS,
        MAX_GEQO_SELECTION_BIAS, NULL, NULL
    },
 
    {
-       NULL, 0, NULL, 0.0, 0.0, 0.0, NULL, NULL
+       NULL, 0, 0, NULL, 0.0, 0.0, 0.0, NULL, NULL
    }
 };
 
@@ -549,54 +554,54 @@ static struct config_string
            ConfigureNamesString[] =
 {
    {
-       "default_transaction_isolation", PGC_USERSET, &default_iso_level_string,
+       "default_transaction_isolation", PGC_USERSET, PGC_S_DEFAULT, &default_iso_level_string,
        "read committed", check_defaultxactisolevel, assign_defaultxactisolevel
    },
 
    {
-       "dynamic_library_path", PGC_SUSET, &Dynamic_library_path,
+       "dynamic_library_path", PGC_SUSET, PGC_S_DEFAULT, &Dynamic_library_path,
        "$libdir", NULL, NULL
    },
 
    {
-       "krb_server_keyfile", PGC_POSTMASTER, &pg_krb_server_keyfile,
+       "krb_server_keyfile", PGC_POSTMASTER, PGC_S_DEFAULT, &pg_krb_server_keyfile,
        PG_KRB_SRVTAB, NULL, NULL
    },
 
 #ifdef ENABLE_SYSLOG
    {
-       "syslog_facility", PGC_POSTMASTER, &Syslog_facility,
+       "syslog_facility", PGC_POSTMASTER, PGC_S_DEFAULT, &Syslog_facility,
        "LOCAL0", check_facility, NULL
    },
    {
-       "syslog_ident", PGC_POSTMASTER, &Syslog_ident,
+       "syslog_ident", PGC_POSTMASTER, PGC_S_DEFAULT, &Syslog_ident,
        "postgres", NULL, NULL
    },
 #endif
 
    {
-       "unix_socket_group", PGC_POSTMASTER, &Unix_socket_group,
+       "unix_socket_group", PGC_POSTMASTER, PGC_S_DEFAULT, &Unix_socket_group,
        "", NULL, NULL
    },
 
    {
-       "unix_socket_directory", PGC_POSTMASTER, &UnixSocketDir,
+       "unix_socket_directory", PGC_POSTMASTER, PGC_S_DEFAULT, &UnixSocketDir,
        "", NULL, NULL
    },
 
    {
-       "virtual_host", PGC_POSTMASTER, &VirtualHost,
+       "virtual_host", PGC_POSTMASTER, PGC_S_DEFAULT, &VirtualHost,
        "", NULL, NULL
    },
 
    {
-       "wal_sync_method", PGC_SIGHUP, &XLOG_sync_method,
+       "wal_sync_method", PGC_SIGHUP, PGC_S_DEFAULT, &XLOG_sync_method,
        XLOG_sync_method_default, check_xlog_sync_method,
        assign_xlog_sync_method
    },
 
    {
-       NULL, 0, NULL, NULL, NULL, NULL
+       NULL, 0, 0, NULL, NULL, NULL, NULL
    }
 };
 
@@ -870,11 +875,12 @@ parse_real(const char *value, double *result)
  */
 bool
 set_config_option(const char *name, const char *value,
-                 GucContext context, bool DoIt, bool makeDefault)
+                 GucContext context, bool DoIt, GucSource source)
 {
    struct config_generic *record;
    enum config_type type;
    int         elevel;
+   bool        makeDefault;
 
    elevel = (context == PGC_SIGHUP) ? DEBUG : ERROR;
 
@@ -885,6 +891,15 @@ set_config_option(const char *name, const char *value,
        return false;
    }
 
+   if (record->source > source)
+   {
+       if (DebugLvl > 1)
+           elog(DEBUG, "setting %s refused because previous source is higher",
+                name);
+       return false;
+   }
+   makeDefault = source < PGC_S_SESSION;
+
    /*
     * Check if the option can be set at this time. See guc.h for the
     * precise rules. Note that we don't want to throw errors if we're in
@@ -961,6 +976,7 @@ set_config_option(const char *name, const char *value,
                        *conf->variable = boolval;
                        if (makeDefault)
                            conf->default_val = boolval;
+                       conf->source = source;
                    }
                }
                else if (DoIt)
@@ -1005,6 +1021,7 @@ set_config_option(const char *name, const char *value,
                        *conf->variable = intval;
                        if (makeDefault)
                            conf->default_val = intval;
+                       conf->source = source;
                    }
                }
                else if (DoIt)
@@ -1049,6 +1066,7 @@ set_config_option(const char *name, const char *value,
                        *conf->variable = dval;
                        if (makeDefault)
                            conf->default_val = dval;
+                       conf->source = source;
                    }
                }
                else if (DoIt)
@@ -1099,6 +1117,7 @@ set_config_option(const char *name, const char *value,
                                free(conf->default_val);
                            conf->default_val = str;
                        }
+                       conf->source = source;
                    }
                }
                else if (DoIt)
@@ -1143,9 +1162,9 @@ set_config_option(const char *name, const char *value,
  */
 void
 SetConfigOption(const char *name, const char *value,
-               GucContext context, bool makeDefault)
+               GucContext context, GucSource source)
 {
-   (void) set_config_option(name, value, context, true, makeDefault);
+   (void) set_config_option(name, value, context, true, source);
 }
 
 
index c4e9a44a3e8ee01b645ecb1b42154eb6b2fa8f84..f7361dff47ebd19cf78478ef4d65b18e7b85ca64 100644 (file)
@@ -4,7 +4,7 @@
  * External declarations pertaining to backend/utils/misc/guc.c and
  * backend/utils/misc/guc-file.l
  *
- * $Id: guc.h,v 1.13 2001/11/05 17:46:36 momjian Exp $
+ * $Id: guc.h,v 1.14 2002/02/23 01:31:37 petere Exp $
  */
 #ifndef GUC_H
 #define GUC_H
@@ -46,15 +46,32 @@ typedef enum
    PGC_USERSET
 } GucContext;
 
+/*
+ * The following type records the source of the current setting.  A
+ * new setting can only take effect if the previous setting had the
+ * same or lower level.  (E.g, changing the config file doesn't
+ * override the postmaster command line.)
+ */
+typedef enum
+{
+   PGC_S_DEFAULT = 0,          /* wired-in default */
+   PGC_S_FILE = 1,             /* postgresql.conf */
+   PGC_S_ARGV = 2,             /* postmaster command line */
+   PGC_S_DATABASE = 3,         /* per-database setting */
+   PGC_S_USER = 4,             /* per-user setting */
+   PGC_S_CLIENT = 5,           /* from client (PGOPTIONS) */
+   PGC_S_SESSION = 6,          /* SET command */
+   PGC_S_INFINITY = 100        /* can be used to avoid checks */
+} GucSource;
 
 extern void SetConfigOption(const char *name, const char *value,
-               GucContext context, bool makeDefault);
+               GucContext context, GucSource source);
 extern const char *GetConfigOption(const char *name);
 extern void ProcessConfigFile(GucContext context);
 extern void ResetAllOptions(bool isStartup);
 extern void ParseLongOption(const char *string, char **name, char **value);
 extern bool set_config_option(const char *name, const char *value,
-                 GucContext context, bool DoIt, bool makeDefault);
+                 GucContext context, bool DoIt, GucSource source);
 extern void ShowAllGUCConfig(void);