@ -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.37 2001 / 06 / 07 04 : 50 : 57 momjian Exp $
* $ Header : / cvsroot / pgsql / src / backend / utils / misc / guc . c , v 1.38 2001 / 06 / 12 22 : 54 : 06 tgl Exp $
*
* Copyright 2000 by PostgreSQL Global Development Group
* Written by Peter Eisentraut < peter_e @ gmx . net > .
@ -46,7 +46,6 @@ extern bool FixBTree;
extern char * Syslog_facility ;
extern char * Syslog_ident ;
static bool check_facility ( const char * facility ) ;
# endif
/*
@ -54,7 +53,6 @@ static bool check_facility(const char *facility);
*/
# ifdef USE_ASSERT_CHECKING
bool assert_enabled = true ;
# endif
bool Debug_print_query = false ;
bool Debug_print_plan = false ;
@ -76,7 +74,9 @@ bool SQL_inheritance = true;
# endif
/*
* Declarations for GUC tables
*/
enum config_type
{
PGC_NONE = 0 ,
@ -101,6 +101,8 @@ struct config_bool
GucContext context ;
bool * variable ;
bool default_val ;
/* No need for parse_hook ... presumably both values are legal */
void ( * assign_hook ) ( bool newval ) ;
} ;
@ -112,6 +114,8 @@ struct config_int
int default_val ;
int min ;
int max ;
bool ( * parse_hook ) ( int proposed ) ;
void ( * assign_hook ) ( int newval ) ;
} ;
@ -123,6 +127,8 @@ struct config_real
double default_val ;
double min ;
double max ;
bool ( * parse_hook ) ( double proposed ) ;
void ( * assign_hook ) ( double newval ) ;
} ;
/*
@ -171,61 +177,61 @@ struct config_string
static struct config_bool
ConfigureNamesBool [ ] =
{
{ " enable_seqscan " , PGC_USERSET , & enable_seqscan , true } ,
{ " enable_indexscan " , PGC_USERSET , & enable_indexscan , true } ,
{ " enable_tidscan " , PGC_USERSET , & enable_tidscan , true } ,
{ " enable_sort " , PGC_USERSET , & enable_sort , true } ,
{ " enable_nestloop " , PGC_USERSET , & enable_nestloop , true } ,
{ " enable_mergejoin " , PGC_USERSET , & enable_mergejoin , true } ,
{ " enable_hashjoin " , PGC_USERSET , & enable_hashjoin , true } ,
{ " ksqo " , PGC_USERSET , & _use_keyset_query_optimizer , false } ,
{ " geqo " , PGC_USERSET , & enable_geqo , true } ,
{ " tcpip_socket " , PGC_POSTMASTER , & NetServer , false } ,
{ " ssl " , PGC_POSTMASTER , & EnableSSL , false } ,
{ " fsync " , PGC_SIGHUP , & enableFsync , true } ,
{ " silent_mode " , PGC_POSTMASTER , & SilentMode , false } ,
{ " log_connections " , PGC_SIGHUP , & Log_connections , false } ,
{ " log_timestamp " , PGC_SIGHUP , & Log_timestamp , false } ,
{ " log_pid " , PGC_SIGHUP , & Log_pid , false } ,
{ " enable_seqscan " , PGC_USERSET , & enable_seqscan , true , NULL } ,
{ " enable_indexscan " , PGC_USERSET , & enable_indexscan , true , NULL } ,
{ " enable_tidscan " , PGC_USERSET , & enable_tidscan , true , NULL } ,
{ " enable_sort " , PGC_USERSET , & enable_sort , true , NULL } ,
{ " enable_nestloop " , PGC_USERSET , & enable_nestloop , true , NULL } ,
{ " enable_mergejoin " , PGC_USERSET , & enable_mergejoin , true , NULL } ,
{ " enable_hashjoin " , PGC_USERSET , & enable_hashjoin , true , NULL } ,
{ " ksqo " , PGC_USERSET , & _use_keyset_query_optimizer , false , NULL } ,
{ " geqo " , PGC_USERSET , & enable_geqo , true , NULL } ,
{ " tcpip_socket " , PGC_POSTMASTER , & NetServer , false , NULL } ,
{ " ssl " , PGC_POSTMASTER , & EnableSSL , false , NULL } ,
{ " fsync " , PGC_SIGHUP , & enableFsync , true , NULL } ,
{ " silent_mode " , PGC_POSTMASTER , & SilentMode , false , NULL } ,
{ " log_connections " , PGC_SIGHUP , & Log_connections , false , NULL } ,
{ " log_timestamp " , PGC_SIGHUP , & Log_timestamp , false , NULL } ,
{ " log_pid " , PGC_SIGHUP , & Log_pid , false , NULL } ,
# ifdef USE_ASSERT_CHECKING
{ " debug_assertions " , PGC_USERSET , & assert_enabled , true } ,
{ " debug_assertions " , PGC_USERSET , & assert_enabled , true , NULL } ,
# endif
{ " 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 } ,
{ " debug_print_query " , PGC_USERSET , & Debug_print_query , false , NULL } ,
{ " debug_print_parse " , PGC_USERSET , & Debug_print_parse , false , NULL } ,
{ " debug_print_rewritten " , PGC_USERSET , & Debug_print_rewritten , false , NULL } ,
{ " debug_print_plan " , PGC_USERSET , & Debug_print_plan , false , NULL } ,
{ " debug_pretty_print " , PGC_USERSET , & Debug_pretty_print , false , NULL } ,
{ " 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 } ,
{ " show_parser_stats " , PGC_USERSET , & Show_parser_stats , false , NULL } ,
{ " show_planner_stats " , PGC_USERSET , & Show_planner_stats , false , NULL } ,
{ " show_executor_stats " , PGC_USERSET , & Show_executor_stats , false , NULL } ,
{ " show_query_stats " , PGC_USERSET , & Show_query_stats , false , NULL } ,
# ifdef BTREE_BUILD_STATS
{ " show_btree_build_stats " , PGC_SUSET , & Show_btree_build_stats , false } ,
{ " show_btree_build_stats " , PGC_SUSET , & Show_btree_build_stats , false , NULL } ,
# endif
{ " trace_notify " , PGC_USERSET , & Trace_notify , false } ,
{ " trace_notify " , PGC_USERSET , & Trace_notify , false , NULL } ,
# ifdef LOCK_DEBUG
{ " trace_locks " , PGC_SUSET , & Trace_locks , false } ,
{ " trace_userlocks " , PGC_SUSET , & Trace_userlocks , false } ,
{ " trace_spinlocks " , PGC_SUSET , & Trace_spinlocks , false } ,
{ " debug_deadlocks " , PGC_SUSET , & Debug_deadlocks , false } ,
{ " trace_locks " , PGC_SUSET , & Trace_locks , false , NULL } ,
{ " trace_userlocks " , PGC_SUSET , & Trace_userlocks , false , NULL } ,
{ " trace_spinlocks " , PGC_SUSET , & Trace_spinlocks , false , NULL } ,
{ " debug_deadlocks " , PGC_SUSET , & Debug_deadlocks , false , NULL } ,
# endif
{ " hostname_lookup " , PGC_SIGHUP , & HostnameLookup , false } ,
{ " show_source_port " , PGC_SIGHUP , & ShowPortNumber , false } ,
{ " hostname_lookup " , PGC_SIGHUP , & HostnameLookup , false , NULL } ,
{ " show_source_port " , PGC_SIGHUP , & ShowPortNumber , false , NULL } ,
{ " sql_inheritance " , PGC_USERSET , & SQL_inheritance , true } ,
{ " sql_inheritance " , PGC_USERSET , & SQL_inheritance , true , NULL } ,
{ " fixbtree " , PGC_POSTMASTER , & FixBTree , true } ,
{ " fixbtree " , PGC_POSTMASTER , & FixBTree , true , NULL } ,
{ NULL , 0 , NULL , false }
{ NULL , 0 , NULL , false , NULL }
} ;
@ -233,22 +239,22 @@ static struct config_int
ConfigureNamesInt [ ] =
{
{ " geqo_threshold " , PGC_USERSET , & geqo_rels ,
DEFAULT_GEQO_RELS , 2 , INT_MAX } ,
DEFAULT_GEQO_RELS , 2 , INT_MAX , NULL , NULL } ,
{ " geqo_pool_size " , PGC_USERSET , & Geqo_pool_size ,
DEFAULT_GEQO_POOL_SIZE , 0 , MAX_GEQO_POOL_SIZE } ,
DEFAULT_GEQO_POOL_SIZE , 0 , MAX_GEQO_POOL_SIZE , NULL , NULL } ,
{ " geqo_effort " , PGC_USERSET , & Geqo_effort ,
1 , 1 , INT_MAX } ,
1 , 1 , INT_MAX , NULL , NULL } ,
{ " geqo_generations " , PGC_USERSET , & Geqo_generations ,
0 , 0 , INT_MAX } ,
0 , 0 , INT_MAX , NULL , NULL } ,
{ " geqo_random_seed " , PGC_USERSET , & Geqo_random_seed ,
- 1 , INT_MIN , INT_MAX } ,
- 1 , INT_MIN , INT_MAX , NULL , NULL } ,
{ " deadlock_timeout " , PGC_POSTMASTER , & DeadlockTimeout ,
1000 , 0 , INT_MAX } ,
1000 , 0 , INT_MAX , NULL , NULL } ,
# ifdef ENABLE_SYSLOG
{ " syslog " , PGC_SIGHUP , & Use_syslog ,
0 , 0 , 2 } ,
0 , 0 , 2 , NULL , NULL } ,
# endif
/*
@ -257,52 +263,52 @@ static struct config_int
* constraints here are partially unused .
*/
{ " max_connections " , PGC_POSTMASTER , & MaxBackends ,
DEF_MAXBACKENDS , 1 , MAXBACKENDS } ,
DEF_MAXBACKENDS , 1 , MAXBACKENDS , NULL , NULL } ,
{ " shared_buffers " , PGC_POSTMASTER , & NBuffers ,
DEF_NBUFFERS , 16 , INT_MAX } ,
DEF_NBUFFERS , 16 , INT_MAX , NULL , NULL } ,
{ " port " , PGC_POSTMASTER , & PostPortNumber ,
DEF_PGPORT , 1 , 65535 } ,
DEF_PGPORT , 1 , 65535 , NULL , NULL } ,
{ " sort_mem " , PGC_USERSET , & SortMem ,
512 , 1 , INT_MAX } ,
512 , 1 , INT_MAX , NULL , NULL } ,
{ " debug_level " , PGC_USERSET , & DebugLvl ,
0 , 0 , 16 } ,
0 , 0 , 16 , NULL , NULL } ,
# ifdef LOCK_DEBUG
{ " trace_lock_oidmin " , PGC_SUSET , & Trace_lock_oidmin ,
BootstrapObjectIdData , 1 , INT_MAX } ,
BootstrapObjectIdData , 1 , INT_MAX , NULL , NULL } ,
{ " trace_lock_table " , PGC_SUSET , & Trace_lock_table ,
0 , 0 , INT_MAX } ,
0 , 0 , INT_MAX , NULL , NULL } ,
# endif
{ " max_expr_depth " , PGC_USERSET , & max_expr_depth ,
DEFAULT_MAX_EXPR_DEPTH , 10 , INT_MAX } ,
DEFAULT_MAX_EXPR_DEPTH , 10 , INT_MAX , NULL , NULL } ,
{ " unix_socket_permissions " , PGC_POSTMASTER , & Unix_socket_permissions ,
0777 , 0000 , 0777 } ,
0777 , 0000 , 0777 , NULL , NULL } ,
{ " checkpoint_segments " , PGC_SIGHUP , & CheckPointSegments ,
3 , 1 , INT_MAX } ,
3 , 1 , INT_MAX , NULL , NULL } ,
{ " checkpoint_timeout " , PGC_SIGHUP , & CheckPointTimeout ,
300 , 30 , 3600 } ,
300 , 30 , 3600 , NULL , NULL } ,
{ " wal_buffers " , PGC_POSTMASTER , & XLOGbuffers ,
8 , 4 , INT_MAX } ,
8 , 4 , INT_MAX , NULL , NULL } ,
{ " wal_files " , PGC_SIGHUP , & XLOGfiles ,
0 , 0 , 64 } ,
0 , 0 , 64 , NULL , NULL } ,
{ " wal_debug " , PGC_SUSET , & XLOG_DEBUG ,
0 , 0 , 16 } ,
0 , 0 , 16 , NULL , NULL } ,
{ " commit_delay " , PGC_USERSET , & CommitDelay ,
0 , 0 , 100000 } ,
0 , 0 , 100000 , NULL , NULL } ,
{ " commit_siblings " , PGC_USERSET , & CommitSiblings ,
5 , 1 , 1000 } ,
5 , 1 , 1000 , NULL , NULL } ,
{ NULL , 0 , NULL , 0 , 0 , 0 }
{ NULL , 0 , NULL , 0 , 0 , 0 , NULL , NULL }
} ;
@ -310,20 +316,21 @@ static struct config_real
ConfigureNamesReal [ ] =
{
{ " effective_cache_size " , PGC_USERSET , & effective_cache_size ,
DEFAULT_EFFECTIVE_CACHE_SIZE , 0 , DBL_MAX } ,
DEFAULT_EFFECTIVE_CACHE_SIZE , 0 , DBL_MAX , NULL , NULL } ,
{ " random_page_cost " , PGC_USERSET , & random_page_cost ,
DEFAULT_RANDOM_PAGE_COST , 0 , DBL_MAX } ,
DEFAULT_RANDOM_PAGE_COST , 0 , DBL_MAX , NULL , NULL } ,
{ " cpu_tuple_cost " , PGC_USERSET , & cpu_tuple_cost ,
DEFAULT_CPU_TUPLE_COST , 0 , DBL_MAX } ,
DEFAULT_CPU_TUPLE_COST , 0 , DBL_MAX , NULL , NULL } ,
{ " cpu_index_tuple_cost " , PGC_USERSET , & cpu_index_tuple_cost ,
DEFAULT_CPU_INDEX_TUPLE_COST , 0 , DBL_MAX } ,
DEFAULT_CPU_INDEX_TUPLE_COST , 0 , DBL_MAX , NULL , NULL } ,
{ " cpu_operator_cost " , PGC_USERSET , & cpu_operator_cost ,
DEFAULT_CPU_OPERATOR_COST , 0 , DBL_MAX } ,
DEFAULT_CPU_OPERATOR_COST , 0 , DBL_MAX , NULL , NULL } ,
{ " geqo_selection_bias " , PGC_USERSET , & Geqo_selection_bias ,
DEFAULT_GEQO_SELECTION_BIAS , MIN_GEQO_SELECTION_BIAS , MAX_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 , 0 , NULL , 0.0 , 0.0 , 0.0 , NULL , NULL }
} ;
@ -413,47 +420,84 @@ find_option(const char *name, struct config_generic ** record)
/*
* Reset all options to their specified default values . Should only be
* called at program startup .
* Reset all options to their specified default values . Must be called
* with isStartup = true at program startup . May be called later with
* isStartup = false to reset all resettable options .
*/
void
ResetAllOptions ( void )
ResetAllOptions ( bool isStartup )
{
int i ;
for ( i = 0 ; ConfigureNamesBool [ i ] . name ; i + + )
* ( ConfigureNamesBool [ i ] . variable ) = ConfigureNamesBool [ i ] . default_val ;
{
struct config_bool * conf = & ConfigureNamesBool [ i ] ;
if ( isStartup | |
conf - > context = = PGC_SUSET | | conf - > context = = PGC_USERSET )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( conf - > default_val ) ;
* conf - > variable = conf - > default_val ;
}
}
for ( i = 0 ; ConfigureNamesInt [ i ] . name ; i + + )
* ( ConfigureNamesInt [ i ] . variable ) = ConfigureNamesInt [ i ] . default_val ;
{
struct config_int * conf = & ConfigureNamesInt [ i ] ;
if ( isStartup | |
conf - > context = = PGC_SUSET | | conf - > context = = PGC_USERSET )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( conf - > default_val ) ;
* conf - > variable = conf - > default_val ;
}
}
for ( i = 0 ; ConfigureNamesReal [ i ] . name ; i + + )
* ( ConfigureNamesReal [ i ] . variable ) = ConfigureNamesReal [ i ] . default_val ;
{
struct config_real * conf = & ConfigureNamesReal [ i ] ;
if ( isStartup | |
conf - > context = = PGC_SUSET | | conf - > context = = PGC_USERSET )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( conf - > default_val ) ;
* conf - > variable = conf - > default_val ;
}
}
for ( i = 0 ; ConfigureNamesString [ i ] . name ; i + + )
{
char * str = NULL ;
struct config_string * conf = & ConfigureNamesString [ i ] ;
if ( ! ConfigureNamesString [ i ] . default_val
& & ConfigureNamesString [ i ] . boot_default_val )
if ( isStartup | |
conf - > context = = PGC_SUSET | | conf - > context = = PGC_USERSET )
{
str = strdup ( ConfigureNamesString [ i ] . boot_default_val ) ;
if ( str = = NULL )
elog ( ERROR , " out of memory " ) ;
char * str = NULL ;
ConfigureNamesString [ i ] . default_val = str ;
}
if ( ConfigureNamesString [ i ] . default_val )
{
str = strdup ( ConfigureNamesString [ i ] . default_val ) ;
if ( str = = NULL )
elog ( ERROR , " out of memory " ) ;
if ( conf - > default_val = = NULL & &
conf - > boot_default_val )
{
str = strdup ( conf - > boot_default_val ) ;
if ( str = = NULL )
elog ( ERROR , " out of memory " ) ;
conf - > default_val = str ;
}
if ( conf - > default_val )
{
str = strdup ( conf - > default_val ) ;
if ( str = = NULL )
elog ( ERROR , " out of memory " ) ;
}
if ( conf - > assign_hook )
( conf - > assign_hook ) ( str ) ;
if ( * conf - > variable )
free ( * conf - > variable ) ;
* conf - > variable = str ;
}
* ( ConfigureNamesString [ i ] . variable ) = str ;
}
if ( getenv ( " PGPORT " ) )
PostPortNumber = atoi ( getenv ( " PGPORT " ) ) ;
}
@ -591,8 +635,8 @@ parse_real(const char *value, double *result)
* See also SetConfigOption for an external interface .
*/
bool
set_config_option ( const char * name , const char * value , GucContext
context , bool DoIt , bool makeDefault )
set_config_option ( const char * name , const char * value ,
GucContext context , bool DoIt , bool makeDefault )
{
struct config_generic * record ;
enum config_type type ;
@ -639,8 +683,8 @@ set_config_option(const char *name, const char *value, GucContext
else
return true ;
}
else if ( record - > context = = PGC_SUSET & & ( context = = PGC_USERSET
| | context = = PGC_BACKEND ) )
else if ( record - > context = = PGC_SUSET & &
( context = = PGC_USERSET | | context = = PGC_BACKEND ) )
elog ( ERROR , " permission denied " ) ;
@ -662,15 +706,22 @@ set_config_option(const char *name, const char *value, GucContext
elog ( elevel , " option '%s' requires a boolean value " , name ) ;
return false ;
}
/* no parse_hook needed for booleans */
if ( DoIt )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( boolval ) ;
* conf - > variable = boolval ;
if ( makeDefault )
conf - > default_val = boolval ;
}
}
else if ( DoIt )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( conf - > default_val ) ;
* conf - > variable = conf - > default_val ;
}
break ;
}
@ -694,15 +745,27 @@ set_config_option(const char *name, const char *value, GucContext
name , intval , conf - > min , conf - > max ) ;
return false ;
}
if ( conf - > parse_hook & & ! ( conf - > parse_hook ) ( intval ) )
{
elog ( elevel , " invalid value for option '%s': %d " ,
name , intval ) ;
return false ;
}
if ( DoIt )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( intval ) ;
* conf - > variable = intval ;
if ( makeDefault )
conf - > default_val = intval ;
}
}
else if ( DoIt )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( conf - > default_val ) ;
* conf - > variable = conf - > default_val ;
}
break ;
}
@ -726,15 +789,27 @@ set_config_option(const char *name, const char *value, GucContext
name , dval , conf - > min , conf - > max ) ;
return false ;
}
if ( conf - > parse_hook & & ! ( conf - > parse_hook ) ( dval ) )
{
elog ( elevel , " invalid value for option '%s': %g " ,
name , dval ) ;
return false ;
}
if ( DoIt )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( dval ) ;
* conf - > variable = dval ;
if ( makeDefault )
conf - > default_val = dval ;
}
}
else if ( DoIt )
{
if ( conf - > assign_hook )
( conf - > assign_hook ) ( conf - > default_val ) ;
* conf - > variable = conf - > default_val ;
}
break ;
}
@ -746,7 +821,8 @@ set_config_option(const char *name, const char *value, GucContext
{
if ( conf - > parse_hook & & ! ( conf - > parse_hook ) ( value ) )
{
elog ( elevel , " invalid value for option '%s': '%s' " , name , value ) ;
elog ( elevel , " invalid value for option '%s': '%s' " ,
name , value ) ;
return false ;
}
if ( DoIt )
@ -766,13 +842,13 @@ set_config_option(const char *name, const char *value, GucContext
* conf - > variable = str ;
if ( makeDefault )
{
if ( conf - > default_val )
free ( conf - > default_val ) ;
str = strdup ( value ) ;
if ( str = = NULL ) {
elog ( elevel , " out of memory " ) ;
return false ;
}
if ( conf - > default_val )
free ( conf - > default_val ) ;
conf - > default_val = str ;
}
}
@ -789,7 +865,7 @@ set_config_option(const char *name, const char *value, GucContext
elog ( elevel , " out of memory " ) ;
return false ;
}
conf - > boot_ default_val = str ;
conf - > default_val = str ;
}
str = strdup ( conf - > default_val ) ;
if ( str = = NULL )
@ -818,8 +894,8 @@ set_config_option(const char *name, const char *value, GucContext
* this is just the wrapper to be called from the outside .
*/
void
SetConfigOption ( const char * name , const char * value , GucContext
context , bool makeDefault )
SetConfigOption ( const char * name , const char * value ,
GucContext context , bool makeDefault )
{
( void ) set_config_option ( name , value , context , true , makeDefault ) ;
}
@ -829,9 +905,7 @@ SetConfigOption(const char *name, const char *value, GucContext
/*
* This is more or less the SHOW command . It returns a string with the
* value of the option ` name ' . If the option doesn ' t exist , throw an
* elog and don ' t return . issuper should be true if and only if the
* current user is a superuser . Normal users don ' t have read
* permission on all options .
* elog and don ' t return .
*
* The string is * not * allocated for modification and is really only
* valid until the next call to configuration related functions .
@ -853,11 +927,13 @@ GetConfigOption(const char *name)
return * ( ( struct config_bool * ) record ) - > variable ? " on " : " off " ;
case PGC_INT :
snprintf ( buffer , 256 , " %d " , * ( ( struct config_int * ) record ) - > variable ) ;
snprintf ( buffer , sizeof ( buffer ) , " %d " ,
* ( ( struct config_int * ) record ) - > variable ) ;
return buffer ;
case PGC_REAL :
snprintf ( buffer , 256 , " %g " , * ( ( struct config_real * ) record ) - > variable ) ;
snprintf ( buffer , sizeof ( buffer ) , " %g " ,
* ( ( struct config_real * ) record ) - > variable ) ;
return buffer ;
case PGC_STRING :
@ -872,7 +948,7 @@ GetConfigOption(const char *name)
static void
_ShowOption ( enum config_type opttype , struct config_generic * record )
{
static char buffer [ 256 ] ;
char buffer [ 256 ] ;
char * val ;
switch ( opttype )
@ -881,12 +957,14 @@ _ShowOption(enum config_type opttype, struct config_generic *record)
val = * ( ( struct config_bool * ) record ) - > variable ? " on " : " off " ;
break ;
case PGC_INT :
snprintf ( buffer , 256 , " %d " , * ( ( struct config_int * ) record ) - > variable ) ;
snprintf ( buffer , sizeof ( buffer ) , " %d " ,
* ( ( struct config_int * ) record ) - > variable ) ;
val = buffer ;
break ;
case PGC_REAL :
snprintf ( buffer , 256 , " %g " , * ( ( struct config_real * ) record ) - > variable ) ;
snprintf ( buffer , sizeof ( buffer ) , " %g " ,
* ( ( struct config_real * ) record ) - > variable ) ;
val = buffer ;
break ;
@ -955,8 +1033,8 @@ ParseLongOption(const char *string, char **name, char **value)
elog ( FATAL , " out of memory " ) ;
}
else
/* no equal sign in string */
{
/* no equal sign in string */
* name = strdup ( string ) ;
if ( ! * name )
elog ( FATAL , " out of memory " ) ;
@ -971,6 +1049,7 @@ ParseLongOption(const char *string, char **name, char **value)
# ifdef ENABLE_SYSLOG
static bool
check_facility ( const char * facility )
{