diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2000-05-31 00:28:42 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2000-05-31 00:28:42 +0000 |
commit | 6a68f42648f54690ad5b5ae6fb9104e86e15f0f1 (patch) | |
tree | 4b6742f51fb2160dbe2ce090273fd430dc2b2499 /src/backend/commands/variable.c | |
parent | 5e4d554bae6a7177903cdb99bf5d41b695519a45 (diff) | |
download | postgresql-6a68f42648f54690ad5b5ae6fb9104e86e15f0f1.tar.gz postgresql-6a68f42648f54690ad5b5ae6fb9104e86e15f0f1.zip |
The heralded `Grand Unified Configuration scheme' (GUC)
That means you can now set your options in either or all of $PGDATA/configuration,
some postmaster option (--enable-fsync=off), or set a SET command. The list of
options is in backend/utils/misc/guc.c, documentation will be written post haste.
pg_options is gone, so is that pq_geqo config file. Also removed were backend -K,
-Q, and -T options (no longer applicable, although -d0 does the same as -Q).
Added to configure an --enable-syslog option.
changed all callers from TPRINTF to elog(DEBUG)
Diffstat (limited to 'src/backend/commands/variable.c')
-rw-r--r-- | src/backend/commands/variable.c | 792 |
1 files changed, 64 insertions, 728 deletions
diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 367b17aa64c..18b39d66aac 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.34 2000/04/12 17:15:00 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.35 2000/05/31 00:28:15 petere Exp $ * *------------------------------------------------------------------------- */ @@ -27,17 +27,14 @@ #include "optimizer/paths.h" #include "parser/parse_expr.h" #include "utils/builtins.h" +#include "utils/guc.h" #include "utils/tqual.h" -#include "utils/trace.h" #ifdef MULTIBYTE #include "mb/pg_wchar.h" #endif -/* XXX should be in a header file */ -extern bool _use_keyset_query_optimizer; - static bool show_date(void); static bool reset_date(void); @@ -45,51 +42,7 @@ static bool parse_date(char *); static bool show_timezone(void); static bool reset_timezone(void); static bool parse_timezone(char *); -static bool show_effective_cache_size(void); -static bool reset_effective_cache_size(void); -static bool parse_effective_cache_size(char *); -static bool show_random_page_cost(void); -static bool reset_random_page_cost(void); -static bool parse_random_page_cost(char *); -static bool show_cpu_tuple_cost(void); -static bool reset_cpu_tuple_cost(void); -static bool parse_cpu_tuple_cost(char *); -static bool show_cpu_index_tuple_cost(void); -static bool reset_cpu_index_tuple_cost(void); -static bool parse_cpu_index_tuple_cost(char *); -static bool show_cpu_operator_cost(void); -static bool reset_cpu_operator_cost(void); -static bool parse_cpu_operator_cost(char *); -static bool reset_enable_seqscan(void); -static bool show_enable_seqscan(void); -static bool parse_enable_seqscan(char *); -static bool reset_enable_indexscan(void); -static bool show_enable_indexscan(void); -static bool parse_enable_indexscan(char *); -static bool reset_enable_tidscan(void); -static bool show_enable_tidscan(void); -static bool parse_enable_tidscan(char *); -static bool reset_enable_sort(void); -static bool show_enable_sort(void); -static bool parse_enable_sort(char *); -static bool reset_enable_nestloop(void); -static bool show_enable_nestloop(void); -static bool parse_enable_nestloop(char *); -static bool reset_enable_mergejoin(void); -static bool show_enable_mergejoin(void); -static bool parse_enable_mergejoin(char *); -static bool reset_enable_hashjoin(void); -static bool show_enable_hashjoin(void); -static bool parse_enable_hashjoin(char *); -static bool reset_geqo(void); -static bool show_geqo(void); -static bool parse_geqo(char *); -static bool show_ksqo(void); -static bool reset_ksqo(void); -static bool parse_ksqo(char *); -static bool reset_max_expr_depth(void); -static bool show_max_expr_depth(void); -static bool parse_max_expr_depth(char *); + static bool show_XactIsoLevel(void); static bool reset_XactIsoLevel(void); static bool parse_XactIsoLevel(char *); @@ -97,6 +50,7 @@ static bool parse_random_seed(char *); static bool show_random_seed(void); static bool reset_random_seed(void); + /* * get_token * Obtain the next item in a comma-separated list of items, @@ -210,447 +164,6 @@ get_token(char **tok, char **val, char *str) return str; } -/* - * Generic parse routine for boolean ON/OFF variables - */ -static bool -parse_boolean_var(char *value, - bool *variable, const char *varname, bool defaultval) -{ - if (value == NULL) - { - *variable = defaultval; - return TRUE; - } - - if (strcasecmp(value, "on") == 0) - *variable = true; - else if (strcasecmp(value, "off") == 0) - *variable = false; - else - elog(ERROR, "Bad value for %s (%s)", varname, value); - - return TRUE; -} - -/* - * ENABLE_SEQSCAN - */ -static bool -parse_enable_seqscan(char *value) -{ - return parse_boolean_var(value, &enable_seqscan, - "ENABLE_SEQSCAN", true); -} - -static bool -show_enable_seqscan() -{ - elog(NOTICE, "ENABLE_SEQSCAN is %s", - enable_seqscan ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_seqscan() -{ - enable_seqscan = true; - return TRUE; -} - -/* - * ENABLE_INDEXSCAN - */ -static bool -parse_enable_indexscan(char *value) -{ - return parse_boolean_var(value, &enable_indexscan, - "ENABLE_INDEXSCAN", true); -} - -static bool -show_enable_indexscan() -{ - elog(NOTICE, "ENABLE_INDEXSCAN is %s", - enable_indexscan ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_indexscan() -{ - enable_indexscan = true; - return TRUE; -} - -/* - * ENABLE_TIDSCAN - */ -static bool -parse_enable_tidscan(char *value) -{ - return parse_boolean_var(value, &enable_tidscan, - "ENABLE_TIDSCAN", true); -} - -static bool -show_enable_tidscan() -{ - elog(NOTICE, "ENABLE_TIDSCAN is %s", - enable_tidscan ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_tidscan() -{ - enable_tidscan = true; - return TRUE; -} - -/* - * ENABLE_SORT - */ -static bool -parse_enable_sort(char *value) -{ - return parse_boolean_var(value, &enable_sort, - "ENABLE_SORT", true); -} - -static bool -show_enable_sort() -{ - elog(NOTICE, "ENABLE_SORT is %s", - enable_sort ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_sort() -{ - enable_sort = true; - return TRUE; -} - -/* - * ENABLE_NESTLOOP - */ -static bool -parse_enable_nestloop(char *value) -{ - return parse_boolean_var(value, &enable_nestloop, - "ENABLE_NESTLOOP", true); -} - -static bool -show_enable_nestloop() -{ - elog(NOTICE, "ENABLE_NESTLOOP is %s", - enable_nestloop ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_nestloop() -{ - enable_nestloop = true; - return TRUE; -} - -/* - * ENABLE_MERGEJOIN - */ -static bool -parse_enable_mergejoin(char *value) -{ - return parse_boolean_var(value, &enable_mergejoin, - "ENABLE_MERGEJOIN", true); -} - -static bool -show_enable_mergejoin() -{ - elog(NOTICE, "ENABLE_MERGEJOIN is %s", - enable_mergejoin ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_mergejoin() -{ - enable_mergejoin = true; - return TRUE; -} - -/* - * ENABLE_HASHJOIN - */ -static bool -parse_enable_hashjoin(char *value) -{ - return parse_boolean_var(value, &enable_hashjoin, - "ENABLE_HASHJOIN", true); -} - -static bool -show_enable_hashjoin() -{ - elog(NOTICE, "ENABLE_HASHJOIN is %s", - enable_hashjoin ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_hashjoin() -{ - enable_hashjoin = true; - return TRUE; -} - -/* - * - * GEQO - * - */ -static bool -parse_geqo(char *value) -{ - char *tok, - *val, - *rest; - - if (value == NULL) - { - reset_geqo(); - return TRUE; - } - - rest = get_token(&tok, &val, value); - - /* expect one and only one item */ - if (tok == NULL) - elog(ERROR, "Value undefined"); - if (rest && *rest != '\0') - elog(ERROR, "Unable to parse '%s'", rest); - - if (strcasecmp(tok, "on") == 0) - { - int new_geqo_rels = GEQO_RELS; - - if (val != NULL) - { - new_geqo_rels = pg_atoi(val, sizeof(int), '\0'); - if (new_geqo_rels <= 1) - elog(ERROR, "Bad value for # of relations (%s)", val); - } - enable_geqo = true; - geqo_rels = new_geqo_rels; - } - else if (strcasecmp(tok, "off") == 0) - { - if (val != NULL) - elog(ERROR, "%s does not allow a parameter", tok); - enable_geqo = false; - } - else - elog(ERROR, "Bad value for GEQO (%s)", value); - - return TRUE; -} - -static bool -show_geqo() -{ - if (enable_geqo) - elog(NOTICE, "GEQO is ON beginning with %d relations", geqo_rels); - else - elog(NOTICE, "GEQO is OFF"); - return TRUE; -} - -static bool -reset_geqo(void) -{ -#ifdef GEQO - enable_geqo = true; -#else - enable_geqo = false; -#endif - geqo_rels = GEQO_RELS; - return TRUE; -} - -/* - * EFFECTIVE_CACHE_SIZE - */ -static bool -parse_effective_cache_size(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_effective_cache_size(); - return TRUE; - } - - res = float8in((char *) value); - effective_cache_size = *res; - - return TRUE; -} - -static bool -show_effective_cache_size() -{ - elog(NOTICE, "EFFECTIVE_CACHE_SIZE is %g (%dK pages)", - effective_cache_size, BLCKSZ / 1024); - return TRUE; -} - -static bool -reset_effective_cache_size() -{ - effective_cache_size = DEFAULT_EFFECTIVE_CACHE_SIZE; - return TRUE; -} - -/* - * RANDOM_PAGE_COST - */ -static bool -parse_random_page_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_random_page_cost(); - return TRUE; - } - - res = float8in((char *) value); - random_page_cost = *res; - - return TRUE; -} - -static bool -show_random_page_cost() -{ - elog(NOTICE, "RANDOM_PAGE_COST is %g", random_page_cost); - return TRUE; -} - -static bool -reset_random_page_cost() -{ - random_page_cost = DEFAULT_RANDOM_PAGE_COST; - return TRUE; -} - -/* - * CPU_TUPLE_COST - */ -static bool -parse_cpu_tuple_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_cpu_tuple_cost(); - return TRUE; - } - - res = float8in((char *) value); - cpu_tuple_cost = *res; - - return TRUE; -} - -static bool -show_cpu_tuple_cost() -{ - elog(NOTICE, "CPU_TUPLE_COST is %g", cpu_tuple_cost); - return TRUE; -} - -static bool -reset_cpu_tuple_cost() -{ - cpu_tuple_cost = DEFAULT_CPU_TUPLE_COST; - return TRUE; -} - -/* - * CPU_INDEX_TUPLE_COST - */ -static bool -parse_cpu_index_tuple_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_cpu_index_tuple_cost(); - return TRUE; - } - - res = float8in((char *) value); - cpu_index_tuple_cost = *res; - - return TRUE; -} - -static bool -show_cpu_index_tuple_cost() -{ - elog(NOTICE, "CPU_INDEX_TUPLE_COST is %g", cpu_index_tuple_cost); - return TRUE; -} - -static bool -reset_cpu_index_tuple_cost() -{ - cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST; - return TRUE; -} - -/* - * CPU_OPERATOR_COST - */ -static bool -parse_cpu_operator_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_cpu_operator_cost(); - return TRUE; - } - - res = float8in((char *) value); - cpu_operator_cost = *res; - - return TRUE; -} - -static bool -show_cpu_operator_cost() -{ - elog(NOTICE, "CPU_OPERATOR_COST is %g", cpu_operator_cost); - return TRUE; -} - -static bool -reset_cpu_operator_cost() -{ - cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST; - return TRUE; -} /* * DATE_STYLE @@ -917,71 +430,7 @@ reset_timezone() return TRUE; } /* reset_timezone() */ -/*----------------------------------------------------------------------- -KSQO code will one day be unnecessary when the optimizer makes use of -indexes when multiple ORs are specified in the where clause. -See optimizer/prep/prepkeyset.c for more on this. - daveh@insightdist.com 6/16/98 ------------------------------------------------------------------------*/ -static bool -parse_ksqo(char *value) -{ - return parse_boolean_var(value, &_use_keyset_query_optimizer, - "KSQO", false); -} -static bool -show_ksqo() -{ - elog(NOTICE, "KSQO is %s", - _use_keyset_query_optimizer ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_ksqo() -{ - _use_keyset_query_optimizer = false; - return TRUE; -} - -/* - * MAX_EXPR_DEPTH - */ -static bool -parse_max_expr_depth(char *value) -{ - int newval; - - if (value == NULL) - { - reset_max_expr_depth(); - return TRUE; - } - - newval = pg_atoi(value, sizeof(int), '\0'); - - if (newval < 10) /* somewhat arbitrary limit */ - elog(ERROR, "Bad value for MAX_EXPR_DEPTH (%s)", value); - - max_expr_depth = newval; - - return TRUE; -} - -static bool -show_max_expr_depth() -{ - elog(NOTICE, "MAX_EXPR_DEPTH is %d", max_expr_depth); - return TRUE; -} - -static bool -reset_max_expr_depth(void) -{ - max_expr_depth = DEFAULT_MAX_EXPR_DEPTH; - return TRUE; -} /* SET TRANSACTION */ @@ -1038,37 +487,6 @@ reset_XactIsoLevel() return TRUE; } -/* - * Pg_options - */ -static bool -parse_pg_options(char *value) -{ - if (!superuser()) - elog(ERROR, "Only users with superuser privilege can set pg_options"); - if (value == NULL) - read_pg_options(0); - else - parse_options((char *) value, TRUE); - return (TRUE); -} - -static bool -show_pg_options(void) -{ - show_options(); - return (TRUE); -} - -static bool -reset_pg_options(void) -{ - if (!superuser()) - elog(ERROR, "Only users with superuser privilege can set pg_options"); - read_pg_options(0); - return (TRUE); -} - /* * Random number seed @@ -1105,157 +523,75 @@ reset_random_seed(void) } -/*-----------------------------------------------------------------------*/ - -static struct VariableParsers -{ - const char *name; - bool (*parser) (char *); - bool (*show) (); - bool (*reset) (); -} VariableParsers[] = +void +SetPGVariable(const char *name, const char *value) { - { - "datestyle", parse_date, show_date, reset_date - }, - { - "timezone", parse_timezone, show_timezone, reset_timezone - }, - { - "effective_cache_size", parse_effective_cache_size, - show_effective_cache_size, reset_effective_cache_size - }, - { - "random_page_cost", parse_random_page_cost, - show_random_page_cost, reset_random_page_cost - }, - { - "cpu_tuple_cost", parse_cpu_tuple_cost, - show_cpu_tuple_cost, reset_cpu_tuple_cost - }, - { - "cpu_index_tuple_cost", parse_cpu_index_tuple_cost, - show_cpu_index_tuple_cost, reset_cpu_index_tuple_cost - }, - { - "cpu_operator_cost", parse_cpu_operator_cost, - show_cpu_operator_cost, reset_cpu_operator_cost - }, - { - "enable_seqscan", parse_enable_seqscan, - show_enable_seqscan, reset_enable_seqscan - }, - { - "enable_indexscan", parse_enable_indexscan, - show_enable_indexscan, reset_enable_indexscan - }, - { - "enable_tidscan", parse_enable_tidscan, - show_enable_tidscan, reset_enable_tidscan - }, - { - "enable_sort", parse_enable_sort, - show_enable_sort, reset_enable_sort - }, - { - "enable_nestloop", parse_enable_nestloop, - show_enable_nestloop, reset_enable_nestloop - }, - { - "enable_mergejoin", parse_enable_mergejoin, - show_enable_mergejoin, reset_enable_mergejoin - }, - { - "enable_hashjoin", parse_enable_hashjoin, - show_enable_hashjoin, reset_enable_hashjoin - }, - { - "geqo", parse_geqo, show_geqo, reset_geqo - }, + /* + * Special cases ought to be removed are handled separately + * by TCOP + */ + if (strcasecmp(name, "datestyle")==0) + parse_date(pstrdup(value)); + else if (strcasecmp(name, "timezone")==0) + parse_timezone(pstrdup(value)); + else if (strcasecmp(name, "XactIsoLevel")==0) + parse_XactIsoLevel(pstrdup(value)); #ifdef MULTIBYTE - { - "client_encoding", parse_client_encoding, show_client_encoding, reset_client_encoding - }, - { - "server_encoding", parse_server_encoding, show_server_encoding, reset_server_encoding - }, + else if (strcasecmp(name, "client_encoding")==0) + parse_client_encoding(pstrdup(value)); + else if (strcasecmp(name, "server_encoding")==0) + parse_server_encoding(pstrdup(value)); #endif - { - "ksqo", parse_ksqo, show_ksqo, reset_ksqo - }, - { - "max_expr_depth", parse_max_expr_depth, - show_max_expr_depth, reset_max_expr_depth - }, - { - "XactIsoLevel", parse_XactIsoLevel, show_XactIsoLevel, reset_XactIsoLevel - }, - { - "pg_options", parse_pg_options, show_pg_options, reset_pg_options - }, - { - "seed", parse_random_seed, show_random_seed, reset_random_seed - }, - { - NULL, NULL, NULL, NULL - } -}; - -/*-----------------------------------------------------------------------*/ -/* - * Set the named variable, or reset to default value if value is NULL - */ -bool -SetPGVariable(const char *name, const char *value) -{ - struct VariableParsers *vp; - char *val; - - /* Make a modifiable copy for convenience of get_token */ - val = value ? pstrdup(value) : ((char *) NULL); - - for (vp = VariableParsers; vp->name; vp++) - { - if (!strcasecmp(vp->name, name)) - return (vp->parser) (val); - } - - elog(NOTICE, "Unrecognized variable %s", name); - - return TRUE; + else if (strcasecmp(name, "random_seed")==0) + parse_random_seed(pstrdup(value)); + else + SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET); } -/*-----------------------------------------------------------------------*/ -bool + +void GetPGVariable(const char *name) { - struct VariableParsers *vp; - - for (vp = VariableParsers; vp->name; vp++) - { - if (!strcasecmp(vp->name, name)) - return (vp->show) (); - } + if (strcasecmp(name, "datestyle")==0) + show_date(); + else if (strcasecmp(name, "timezone")==0) + show_timezone(); + else if (strcasecmp(name, "XactIsoLevel")==0) + show_XactIsoLevel(); +#ifdef MULTIBYTE + else if (strcasecmp(name, "client_encoding")==0) + show_client_encoding(); + else if (strcasecmp(name, "server_encoding")==0) + show_server_encoding(); +#endif + else if (strcasecmp(name, "random_seed")==0) + show_random_seed(); + else + { + const char * val = GetConfigOption(name, superuser()); + elog(NOTICE, "%s = %s", name, val); + } +} - elog(NOTICE, "Unrecognized variable %s", name); - return TRUE; -} - -/*-----------------------------------------------------------------------*/ -bool +void ResetPGVariable(const char *name) { - struct VariableParsers *vp; - - for (vp = VariableParsers; vp->name; vp++) - { - if (!strcasecmp(vp->name, name)) - return (vp->reset) (); - } - - elog(NOTICE, "Unrecognized variable %s", name); - - return TRUE; -} + if (strcasecmp(name, "datestyle")==0) + reset_date(); + else if (strcasecmp(name, "timezone")==0) + reset_timezone(); + else if (strcasecmp(name, "XactIsoLevel")==0) + reset_XactIsoLevel(); +#ifdef MULTIBYTE + else if (strcasecmp(name, "client_encoding")==0) + reset_client_encoding(); + else if (strcasecmp(name, "server_encoding")==0) + reset_server_encoding(); +#endif + else if (strcasecmp(name, "random_seed")==0) + reset_random_seed(); + else + SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET); +} |