mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
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)
This commit is contained in:
@ -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[] =
|
||||
|
||||
{
|
||||
{
|
||||
"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
|
||||
},
|
||||
#ifdef MULTIBYTE
|
||||
{
|
||||
"client_encoding", parse_client_encoding, show_client_encoding, reset_client_encoding
|
||||
},
|
||||
{
|
||||
"server_encoding", parse_server_encoding, show_server_encoding, reset_server_encoding
|
||||
},
|
||||
#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
|
||||
void
|
||||
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;
|
||||
/*
|
||||
* 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
|
||||
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
|
||||
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;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
for (vp = VariableParsers; vp->name; vp++)
|
||||
{
|
||||
if (!strcasecmp(vp->name, name))
|
||||
return (vp->show) ();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user