aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/variable.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2000-05-31 00:28:42 +0000
committerPeter Eisentraut <peter_e@gmx.net>2000-05-31 00:28:42 +0000
commit6a68f42648f54690ad5b5ae6fb9104e86e15f0f1 (patch)
tree4b6742f51fb2160dbe2ce090273fd430dc2b2499 /src/backend/commands/variable.c
parent5e4d554bae6a7177903cdb99bf5d41b695519a45 (diff)
downloadpostgresql-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.c792
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);
+}