@ -148,6 +148,8 @@ extern bool optimize_bounded_sort;
static int GUC_check_errcode_value ;
static List * reserved_class_prefix = NIL ;
/* global variables for check hook support */
char * GUC_check_errmsg_string ;
char * GUC_check_errdetail_string ;
@ -235,8 +237,6 @@ static bool check_recovery_target_lsn(char **newval, void **extra, GucSource sou
static void assign_recovery_target_lsn ( const char * newval , void * extra ) ;
static bool check_primary_slot_name ( char * * newval , void * * extra , GucSource source ) ;
static bool check_default_with_oids ( bool * newval , void * * extra , GucSource source ) ;
static void check_reserved_prefixes ( const char * varName ) ;
static List * reserved_class_prefix = NIL ;
/* Private functions in guc-file.l that need to be called from guc.c */
static ConfigVariable * ProcessConfigFileInternal ( GucContext context ,
@ -5569,11 +5569,16 @@ find_option(const char *name, bool create_placeholders, bool skip_errors,
* doesn ' t contain a separator , don ' t assume that it was meant to be a
* placeholder .
*/
if ( strchr ( name , GUC_QUALIFIER_SEPARATOR ) ! = NULL )
const char * sep = strchr ( name , GUC_QUALIFIER_SEPARATOR ) ;
if ( sep ! = NULL )
{
size_t classLen = sep - name ;
ListCell * lc ;
/* The name must be syntactically acceptable ... */
if ( ! valid_custom_variable_name ( name ) )
{
if ( valid_custom_variable_name ( name ) )
return add_placeholder_variable ( name , elevel ) ;
/* A special error message seems desirable here */
if ( ! skip_errors )
ereport ( elevel ,
( errcode ( ERRCODE_INVALID_NAME ) ,
@ -5582,6 +5587,27 @@ find_option(const char *name, bool create_placeholders, bool skip_errors,
errdetail ( " Custom parameter names must be two or more simple identifiers separated by dots. " ) ) ) ;
return NULL ;
}
/* ... and it must not match any previously-reserved prefix */
foreach ( lc , reserved_class_prefix )
{
const char * rcprefix = lfirst ( lc ) ;
if ( strlen ( rcprefix ) = = classLen & &
strncmp ( name , rcprefix , classLen ) = = 0 )
{
if ( ! skip_errors )
ereport ( elevel ,
( errcode ( ERRCODE_INVALID_NAME ) ,
errmsg ( " invalid configuration parameter name \" %s \" " ,
name ) ,
errdetail ( " \" %s \" is a reserved prefix. " ,
rcprefix ) ) ) ;
return NULL ;
}
}
/* OK, create it */
return add_placeholder_variable ( name , elevel ) ;
}
}
/* Unknown name */
@ -8764,7 +8790,6 @@ ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel)
( superuser ( ) ? PGC_SUSET : PGC_USERSET ) ,
PGC_S_SESSION ,
action , true , 0 , false ) ;
check_reserved_prefixes ( stmt - > name ) ;
break ;
case VAR_SET_MULTI :
@ -8850,8 +8875,6 @@ ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel)
( superuser ( ) ? PGC_SUSET : PGC_USERSET ) ,
PGC_S_SESSION ,
action , true , 0 , false ) ;
check_reserved_prefixes ( stmt - > name ) ;
break ;
case VAR_RESET_ALL :
ResetAllOptions ( ) ;
@ -9347,6 +9370,7 @@ EmitWarningsOnPlaceholders(const char *className)
int i ;
MemoryContext oldcontext ;
/* Check for existing placeholders. */
for ( i = 0 ; i < num_guc_variables ; i + + )
{
struct config_generic * var = guc_variables [ i ] ;
@ -9362,48 +9386,12 @@ EmitWarningsOnPlaceholders(const char *className)
}
}
/* And remember the name so we can prevent future mistakes. */
oldcontext = MemoryContextSwitchTo ( TopMemoryContext ) ;
reserved_class_prefix = lappend ( reserved_class_prefix , pstrdup ( className ) ) ;
MemoryContextSwitchTo ( oldcontext ) ;
}
/*
* Check a setting name against prefixes previously reserved by
* EmitWarningsOnPlaceholders ( ) and throw a warning if matching .
*/
static void
check_reserved_prefixes ( const char * varName )
{
char * sep = strchr ( varName , GUC_QUALIFIER_SEPARATOR ) ;
if ( sep )
{
size_t classLen = sep - varName ;
ListCell * lc ;
foreach ( lc , reserved_class_prefix )
{
char * rcprefix = lfirst ( lc ) ;
if ( strncmp ( varName , rcprefix , classLen ) = = 0 )
{
for ( int i = 0 ; i < num_guc_variables ; i + + )
{
struct config_generic * var = guc_variables [ i ] ;
if ( ( var - > flags & GUC_CUSTOM_PLACEHOLDER ) ! = 0 & &
strcmp ( varName , var - > name ) = = 0 )
{
ereport ( WARNING ,
( errcode ( ERRCODE_UNDEFINED_OBJECT ) ,
errmsg ( " unrecognized configuration parameter \" %s \" " , var - > name ) ,
errdetail ( " \" %.*s \" is a reserved prefix. " , ( int ) classLen , var - > name ) ) ) ;
}
}
}
}
}
}
/*
* SHOW command