aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/misc/guc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r--src/backend/utils/misc/guc.c132
1 files changed, 82 insertions, 50 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 300bb19b60a..f2cbe3651d3 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.3 2000/06/15 04:10:30 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.4 2000/06/22 22:31:21 petere Exp $
*
* Copyright 2000 by PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
@@ -49,6 +49,7 @@ bool Show_executor_stats = false;
bool Show_query_stats = false; /* this is sort of all three above together */
bool Show_btree_build_stats = false;
+bool SQL_inheritance;
enum config_type
@@ -115,6 +116,23 @@ struct config_string
};
+/*
+ * TO ADD AN OPTION:
+ *
+ * 1. Declare a global variable of type bool, int, double, or char*
+ * and make use of it.
+ *
+ * 2. Decide at what times it's safe to set the option. See guc.h for
+ * details.
+ *
+ * 3. Decide on a name, a default value, upper and lower bounds (if
+ * applicable), etc.
+ *
+ * 4. Add a record below.
+ *
+ * 5. Don't forget to document that option.
+ */
+
/******** option names follow ********/
@@ -133,27 +151,27 @@ ConfigureNamesBool[] =
{"geqo", PGC_USERSET, &enable_geqo, true},
{"net_server", PGC_POSTMASTER, &NetServer, false},
- {"fsync", PGC_BACKEND, &enableFsync, true},
-
- {"log_connections", PGC_POSTMASTER, &Log_connections, false},
- {"log_timestamp", PGC_BACKEND, &Log_timestamp, false},
- {"log_pid", PGC_BACKEND, &Log_pid, false},
-
- {"debug_print_query", PGC_SUSET, &Debug_print_query, false},
- {"debug_print_parse", PGC_SUSET, &Debug_print_parse, false},
- {"debug_print_rewritten", PGC_SUSET, &Debug_print_rewritten, false},
- {"debug_print_plan", PGC_SUSET, &Debug_print_plan, false},
- {"debug_pretty_print", PGC_SUSET, &Debug_pretty_print, false},
-
- {"show_parser_stats", PGC_SUSET, &Show_parser_stats, false},
- {"show_planner_stats", PGC_SUSET, &Show_planner_stats, false},
- {"show_executor_stats", PGC_SUSET, &Show_executor_stats, false},
- {"show_query_stats", PGC_SUSET, &Show_query_stats, false},
+ {"fsync", PGC_USERSET, &enableFsync, true},
+
+ {"log_connections", PGC_SIGHUP, &Log_connections, false},
+ {"log_timestamp", PGC_SIGHUP, &Log_timestamp, false},
+ {"log_pid", PGC_SIGHUP, &Log_pid, false},
+
+ {"debug_print_query", PGC_USERSET, &Debug_print_query, false},
+ {"debug_print_parse", PGC_USERSET, &Debug_print_parse, false},
+ {"debug_print_rewritten", PGC_USERSET, &Debug_print_rewritten, false},
+ {"debug_print_plan", PGC_USERSET, &Debug_print_plan, false},
+ {"debug_pretty_print", PGC_USERSET, &Debug_pretty_print, false},
+
+ {"show_parser_stats", PGC_USERSET, &Show_parser_stats, false},
+ {"show_planner_stats", PGC_USERSET, &Show_planner_stats, false},
+ {"show_executor_stats", PGC_USERSET, &Show_executor_stats, false},
+ {"show_query_stats", PGC_USERSET, &Show_query_stats, false},
#ifdef BTREE_BUILD_STATS
{"show_btree_build_stats", PGC_SUSET, &Show_btree_build_stats, false},
#endif
- {"trace_notify", PGC_SUSET, &Trace_notify, false},
+ {"trace_notify", PGC_USERSET, &Trace_notify, false},
#ifdef LOCK_DEBUG
{"trace_locks", PGC_SUSET, &Trace_locks, false},
@@ -162,8 +180,10 @@ ConfigureNamesBool[] =
{"debug_deadlocks", PGC_SUSET, &Debug_deadlocks, false},
#endif
- {"hostlookup", PGC_POSTMASTER, &HostnameLookup, false},
- {"showportnumber", PGC_POSTMASTER, &ShowPortNumber, false},
+ {"hostlookup", PGC_SIGHUP, &HostnameLookup, false},
+ {"showportnumber", PGC_SIGHUP, &ShowPortNumber, false},
+
+ {"sql_inheritance", PGC_USERSET, &SQL_inheritance, true},
{NULL, 0, NULL, false}
};
@@ -187,7 +207,7 @@ ConfigureNamesInt[] =
1000, 0, INT_MAX},
#ifdef ENABLE_SYSLOG
- {"syslog", PGC_POSTMASTER, &Use_syslog,
+ {"syslog", PGC_SIGHUP, &Use_syslog,
0, 0, 2},
#endif
@@ -203,11 +223,10 @@ ConfigureNamesInt[] =
{"port", PGC_POSTMASTER, &PostPortName,
DEF_PGPORT, 1, 65535},
- /* XXX Is this really changeable at runtime? */
- {"sort_mem", PGC_SUSET, &SortMem,
+ {"sort_mem", PGC_USERSET, &SortMem,
512, 1, INT_MAX},
- {"debug_level", PGC_SUSET, &DebugLvl,
+ {"debug_level", PGC_USERSET, &DebugLvl,
0, 0, 16},
#ifdef LOCK_DEBUG
@@ -217,7 +236,7 @@ ConfigureNamesInt[] =
0, 0, INT_MAX},
#endif
{"max_expr_depth", PGC_USERSET, &max_expr_depth,
- DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX},
+ DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX},
{NULL, 0, NULL, 0, 0, 0}
};
@@ -483,29 +502,45 @@ set_config_option(const char * name, const char * value, GucContext
return false;
}
- if (record->context < context)
+ /*
+ * 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 the SIGHUP context. In that case we just ignore the attempt.
+ */
+ if (record->context == PGC_POSTMASTER && context != PGC_POSTMASTER)
{
- /* can't set option right now */
- switch (context)
- {
- case PGC_USERSET:
- elog(ERROR, "permission denied");
- /*NORETURN*/
- case PGC_SUSET:
- elog(ERROR, "%s can only be set at startup", name);
- /*NORETURN*/
- case PGC_SIGHUP:
- /* ignore the option */
- return true;
- case PGC_BACKEND:
- /* ignore; is this the right thing to do? */
- return true;
- default:
- elog(FATAL, "%s:%d: internal error", __FILE__, __LINE__);
- /*NORETURN*/
- }
+ if (context != PGC_SIGHUP)
+ elog(ERROR, "%s cannot be changed after server start", name);
+ else
+ return true;
}
+ else if (record->context == PGC_SIGHUP && context != PGC_SIGHUP &&
+ context != PGC_POSTMASTER)
+ {
+ elog(ERROR, "%s cannot be changed now", name);
+ /* Hmm, the idea of the SIGHUP context is "ought to be global,
+ * but can be changed after postmaster start". But there's
+ * nothing that prevents a crafty administrator from sending
+ * SIGHUP signals to individual backends only. */
+ }
+ else if (record->context == PGC_BACKEND && context != PGC_BACKEND
+ && context != PGC_POSTMASTER)
+ {
+ if (context != PGC_SIGHUP)
+ elog(ERROR, "%s cannot be set after connection start", name);
+ else
+ return true;
+ }
+ else if (record->context == PGC_SUSET && (context == PGC_USERSET
+ || context == PGC_BACKEND))
+ {
+ elog(ERROR, "permission denied");
+ }
+
+ /*
+ * Evaluate value and set variable
+ */
switch(type)
{
case PGC_BOOL:
@@ -652,7 +687,7 @@ SetConfigOption(const char * name, const char * value, GucContext
* valid until the next call to configuration related functions.
*/
const char *
-GetConfigOption(const char * name, bool issuper)
+GetConfigOption(const char * name)
{
struct config_generic * record;
static char buffer[256];
@@ -662,13 +697,10 @@ GetConfigOption(const char * name, bool issuper)
if (opttype == PGC_NONE)
elog(ERROR, "not a valid option name: %s", name);
- if (record->context < PGC_USERSET && !issuper)
- elog(ERROR, "permission denied");
-
switch(opttype)
{
case PGC_BOOL:
- return *((struct config_bool *)record)->variable ? "true" : "false";
+ return *((struct config_bool *)record)->variable ? "on" : "off";
case PGC_INT:
snprintf(buffer, 256, "%d", *((struct config_int *)record)->variable);