diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index cd118d30d7..48cbf570e8 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -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(); diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 7d6300f4a9..1723733799 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -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); } diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 6fe2cdd61b..6bd43cae14 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -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. diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index e1357670cb..976b434655 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -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"); } /* diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l index c6d96f5ac8..b4fffd7252 100644 --- a/src/backend/utils/misc/guc-file.l +++ b/src/backend/utils/misc/guc-file.l @@ -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); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index c2e6974174..6e112caa43 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -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); } diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index c4e9a44a3e..f7361dff47 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -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);