]> granicus.if.org Git - postgresql/commitdiff
Save source of GUC settings, allowing different sources to be processed in
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 23 Feb 2002 01:31:37 +0000 (01:31 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
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 <peter_e@gmx.net>.
@@ -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);