|
|
|
|
@ -2,12 +2,13 @@ |
|
|
|
|
* Routines for handling of 'SET var TO', 'SHOW var' and 'RESET var' |
|
|
|
|
* statements. |
|
|
|
|
* |
|
|
|
|
* $Id: variable.c,v 1.11 1997/06/03 06:29:31 vadim Exp $ |
|
|
|
|
* $Id: variable.c,v 1.12 1997/06/20 17:17:03 thomas Exp $ |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
#include <ctype.h> |
|
|
|
|
#include "postgres.h" |
|
|
|
|
#include "miscadmin.h" |
|
|
|
|
#include "tcop/variable.h" |
|
|
|
|
@ -39,54 +40,59 @@ static const char *get_token(char **tok, char **val, const char *str) |
|
|
|
|
const char *start; |
|
|
|
|
int len = 0; |
|
|
|
|
|
|
|
|
|
*tok = *val = NULL; |
|
|
|
|
*tok = NULL; |
|
|
|
|
if (val != NULL) *val = NULL; |
|
|
|
|
|
|
|
|
|
if ( !(*str) ) |
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
/* skip white spaces */ |
|
|
|
|
while ( *str == ' ' || *str == '\t' ) |
|
|
|
|
str++; |
|
|
|
|
while (isspace(*str)) str++; |
|
|
|
|
if ( *str == ',' || *str == '=' ) |
|
|
|
|
elog(WARN, "Syntax error near (%s): empty setting", str); |
|
|
|
|
|
|
|
|
|
/* end of string? then return NULL */ |
|
|
|
|
if ( !(*str) ) |
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
/* OK, at beginning of non-NULL string... */ |
|
|
|
|
start = str; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* count chars in token until we hit white space or comma
|
|
|
|
|
* or '=' or end of string |
|
|
|
|
*/ |
|
|
|
|
while ( *str && *str != ' ' && *str != '\t'
|
|
|
|
|
while ( *str && (! isspace(*str)) |
|
|
|
|
&& *str != ',' && *str != '=' ) |
|
|
|
|
{ |
|
|
|
|
str++; |
|
|
|
|
len++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*tok = (char*) palloc (len + 1); |
|
|
|
|
*tok = (char*) PALLOC(len + 1); |
|
|
|
|
strncpy (*tok, start, len); |
|
|
|
|
(*tok)[len] = '\0'; |
|
|
|
|
|
|
|
|
|
/* skip white spaces */ |
|
|
|
|
while ( *str == ' ' || *str == '\t' ) |
|
|
|
|
str++; |
|
|
|
|
while ( isspace(*str)) str++; |
|
|
|
|
|
|
|
|
|
if ( !(*str) ) |
|
|
|
|
return (NULL); |
|
|
|
|
if ( *str == ',' ) |
|
|
|
|
/* end of string? */ |
|
|
|
|
if ( !(*str) ) { |
|
|
|
|
return(str); |
|
|
|
|
|
|
|
|
|
/* delimiter? */ |
|
|
|
|
} else if ( *str == ',' ) { |
|
|
|
|
return (++str); |
|
|
|
|
|
|
|
|
|
if ( *str != '=' ) |
|
|
|
|
} else if ((val == NULL) || ( *str != '=' )) { |
|
|
|
|
elog(WARN, "Syntax error near (%s)", str); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
str++; /* '=': get value */ |
|
|
|
|
len = 0; |
|
|
|
|
|
|
|
|
|
/* skip white spaces */ |
|
|
|
|
while ( *str == ' ' || *str == '\t' ) |
|
|
|
|
str++; |
|
|
|
|
while ( isspace(*str)) str++; |
|
|
|
|
|
|
|
|
|
if ( *str == ',' || !(*str) ) |
|
|
|
|
elog(WARN, "Syntax error near (=%s)", str); |
|
|
|
|
@ -94,22 +100,21 @@ static const char *get_token(char **tok, char **val, const char *str) |
|
|
|
|
start = str; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* count chars in token' value until we hit white space or comma
|
|
|
|
|
* count chars in token's value until we hit white space or comma
|
|
|
|
|
* or end of string |
|
|
|
|
*/ |
|
|
|
|
while ( *str && *str != ' ' && *str != '\t' && *str != ',' ) |
|
|
|
|
while ( *str && (! isspace(*str)) && *str != ',' ) |
|
|
|
|
{ |
|
|
|
|
str++; |
|
|
|
|
len++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*val = (char*) palloc (len + 1); |
|
|
|
|
*val = (char*) PALLOC(len + 1); |
|
|
|
|
strncpy (*val, start, len); |
|
|
|
|
(*val)[len] = '\0'; |
|
|
|
|
|
|
|
|
|
/* skip white spaces */ |
|
|
|
|
while ( *str == ' ' || *str == '\t' ) |
|
|
|
|
str++; |
|
|
|
|
while ( isspace(*str)) str++; |
|
|
|
|
|
|
|
|
|
if ( !(*str) ) |
|
|
|
|
return (NULL); |
|
|
|
|
@ -146,8 +151,8 @@ static bool parse_geqo (const char *value) |
|
|
|
|
if ( tok == NULL ) |
|
|
|
|
elog(WARN, "Value undefined"); |
|
|
|
|
|
|
|
|
|
if ( rest ) |
|
|
|
|
elog(WARN, "Unacceptable data (%s)", rest); |
|
|
|
|
if (( rest ) && ( *rest != '\0' )) |
|
|
|
|
elog(WARN, "Unable to parse '%s'", value); |
|
|
|
|
|
|
|
|
|
if ( strcasecmp (tok, "on") == 0 ) |
|
|
|
|
{ |
|
|
|
|
@ -158,21 +163,21 @@ static bool parse_geqo (const char *value) |
|
|
|
|
geqo_rels = pg_atoi (val, sizeof(int32), '\0'); |
|
|
|
|
if ( geqo_rels <= 1 ) |
|
|
|
|
elog(WARN, "Bad value for # of relations (%s)", val); |
|
|
|
|
pfree (val); |
|
|
|
|
PFREE(val); |
|
|
|
|
} |
|
|
|
|
_use_geqo_ = true; |
|
|
|
|
_use_geqo_rels_ = geqo_rels; |
|
|
|
|
} |
|
|
|
|
else if ( strcasecmp (tok, "off") == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( val != NULL ) |
|
|
|
|
elog(WARN, "Unacceptable data (%s)", val); |
|
|
|
|
if (( val != NULL ) && ( *val != '\0' )) |
|
|
|
|
elog(WARN, "%s does not allow a parameter",tok); |
|
|
|
|
_use_geqo_ = false; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
elog(WARN, "Bad value for GEQO (%s)", value); |
|
|
|
|
|
|
|
|
|
pfree (tok); |
|
|
|
|
PFREE(tok); |
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -180,7 +185,7 @@ static bool show_geqo () |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
if ( _use_geqo_ ) |
|
|
|
|
elog (NOTICE, "GEQO is ON begining with %d relations", _use_geqo_rels_); |
|
|
|
|
elog (NOTICE, "GEQO is ON beginning with %d relations", _use_geqo_rels_); |
|
|
|
|
else |
|
|
|
|
elog (NOTICE, "GEQO is OFF"); |
|
|
|
|
return TRUE; |
|
|
|
|
@ -278,14 +283,11 @@ static bool reset_cost_index () |
|
|
|
|
|
|
|
|
|
static bool parse_date(const char *value) |
|
|
|
|
{ |
|
|
|
|
char *tok, *val; |
|
|
|
|
char *tok; |
|
|
|
|
int dcnt = 0, ecnt = 0; |
|
|
|
|
|
|
|
|
|
while((value = get_token(&tok, &val, value)) != 0) |
|
|
|
|
while((value = get_token(&tok, NULL, value)) != 0) |
|
|
|
|
{ |
|
|
|
|
if ( val != NULL ) |
|
|
|
|
elog(WARN, "Syntax error near (%s)", val); |
|
|
|
|
|
|
|
|
|
/* Ugh. Somebody ought to write a table driven version -- mjl */ |
|
|
|
|
|
|
|
|
|
if(!strcasecmp(tok, "iso")) |
|
|
|
|
@ -324,7 +326,7 @@ static bool parse_date(const char *value) |
|
|
|
|
{ |
|
|
|
|
elog(WARN, "Bad value for date style (%s)", tok); |
|
|
|
|
} |
|
|
|
|
pfree (tok); |
|
|
|
|
PFREE(tok); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(dcnt > 1 || ecnt > 1) |
|
|
|
|
|