mirror of
https://github.com/postgres/postgres.git
synced 2025-06-26 12:21:12 +03:00
- Cleaned up parser a little bit. It does not make sense to allow a
typename to be typedef'ed that cannot be parsed as variable type. - Allowed some SQL keywords to be used as C variable names.
This commit is contained in:
@ -1740,5 +1740,11 @@ Sun Feb 15 14:44:14 CET 2004
|
|||||||
|
|
||||||
- Added missing braces to array parsing.
|
- Added missing braces to array parsing.
|
||||||
- Allowed some C keywords to be used as SQL column names.
|
- Allowed some C keywords to be used as SQL column names.
|
||||||
|
|
||||||
|
Mon Feb 16 08:17:19 CET 2004
|
||||||
|
|
||||||
|
- Cleaned up parser a little bit. It does not make sense to allow a
|
||||||
|
typename to be typedef'ed that cannot be parsed as variable type.
|
||||||
|
- Allowed some SQL keywords to be used as C variable names.
|
||||||
- Set ecpg version to 3.1.1.
|
- Set ecpg version to 3.1.1.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.273 2004/02/15 15:38:20 meskes Exp $ */
|
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.274 2004/02/16 07:41:54 meskes Exp $ */
|
||||||
|
|
||||||
/* Copyright comment */
|
/* Copyright comment */
|
||||||
%{
|
%{
|
||||||
@ -541,6 +541,7 @@ add_additional_variables(char *name, bool insert)
|
|||||||
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
|
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
|
||||||
%type <str> inf_val_list inf_col_list using_descriptor into_descriptor
|
%type <str> inf_val_list inf_col_list using_descriptor into_descriptor
|
||||||
%type <str> ecpg_into_using prepared_name struct_union_type_with_symbol
|
%type <str> ecpg_into_using prepared_name struct_union_type_with_symbol
|
||||||
|
%type <str> ECPGunreserved ECPGunreserved_interval
|
||||||
|
|
||||||
%type <struct_union> s_struct_union_symbol
|
%type <struct_union> s_struct_union_symbol
|
||||||
|
|
||||||
@ -550,7 +551,7 @@ add_additional_variables(char *name, bool insert)
|
|||||||
|
|
||||||
%type <dtype_enum> descriptor_item desc_header_item
|
%type <dtype_enum> descriptor_item desc_header_item
|
||||||
|
|
||||||
%type <type> var_type common_type single_vt_type
|
%type <type> var_type single_vt_type
|
||||||
|
|
||||||
%type <action> action
|
%type <action> action
|
||||||
|
|
||||||
@ -4459,7 +4460,7 @@ ecpg_interval: opt_interval { $$ = $1; }
|
|||||||
| MONTH_P TO MONTH_P { $$ = make_str("month to month"); }
|
| MONTH_P TO MONTH_P { $$ = make_str("month to month"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
single_vt_type: common_type
|
single_vt_type: var_type
|
||||||
| DOUBLE_P
|
| DOUBLE_P
|
||||||
{
|
{
|
||||||
$$.type_enum = ECPGt_double;
|
$$.type_enum = ECPGt_double;
|
||||||
@ -4468,124 +4469,6 @@ single_vt_type: common_type
|
|||||||
$$.type_index = make_str("-1");
|
$$.type_index = make_str("-1");
|
||||||
$$.type_sizeof = NULL;
|
$$.type_sizeof = NULL;
|
||||||
}
|
}
|
||||||
| ECPGColLabelCommon ecpg_interval
|
|
||||||
{
|
|
||||||
if (strlen($2) != 0 && strcmp ($1, "datetime") != 0 && strcmp ($1, "interval") != 0)
|
|
||||||
mmerror (PARSE_ERROR, ET_ERROR, "Interval specification not allowed here ");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check for type names that the SQL grammar treats as
|
|
||||||
* unreserved keywords
|
|
||||||
*/
|
|
||||||
if (strcmp($1, "varchar") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_varchar;
|
|
||||||
$$.type_str = EMPTY;
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else if (strcmp($1, "float") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_float;
|
|
||||||
$$.type_str = make_str("float");
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else if (strcmp($1, "numeric") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_numeric;
|
|
||||||
$$.type_str = make_str("numeric");
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else if (strcmp($1, "decimal") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_decimal;
|
|
||||||
$$.type_str = make_str("decimal");
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else if (strcmp($1, "date") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_date;
|
|
||||||
$$.type_str = make_str("date");
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else if (strcmp($1, "timestamp") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_timestamp;
|
|
||||||
$$.type_str = make_str("timestamp");
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else if (strcmp($1, "datetime") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_timestamp;
|
|
||||||
$$.type_str = make_str("timestamp");
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else if (strcmp($1, "interval") == 0)
|
|
||||||
{
|
|
||||||
$$.type_enum = ECPGt_interval;
|
|
||||||
$$.type_str = make_str("interval");
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* this is for typedef'ed types */
|
|
||||||
struct typedefs *this = get_typedef($1);
|
|
||||||
|
|
||||||
$$.type_str = (this->type->type_enum == ECPGt_varchar) ? EMPTY : mm_strdup(this->name);
|
|
||||||
$$.type_enum = this->type->type_enum;
|
|
||||||
$$.type_dimension = this->type->type_dimension;
|
|
||||||
$$.type_index = this->type->type_index;
|
|
||||||
$$.type_sizeof = this->type->type_sizeof;
|
|
||||||
struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
| s_struct_union_symbol
|
|
||||||
{
|
|
||||||
/* this is for named structs/unions */
|
|
||||||
char *name;
|
|
||||||
struct typedefs *this;
|
|
||||||
bool forward = (forward_name != NULL && strcmp($1.symbol, forward_name) == 0 && strcmp($1.su, "struct") == 0);
|
|
||||||
|
|
||||||
name = cat2_str($1.su, $1.symbol);
|
|
||||||
/* Do we have a forward definition? */
|
|
||||||
if (!forward)
|
|
||||||
{
|
|
||||||
/* No */
|
|
||||||
|
|
||||||
this = get_typedef(name);
|
|
||||||
$$.type_str = mm_strdup(this->name);
|
|
||||||
$$.type_enum = this->type->type_enum;
|
|
||||||
$$.type_dimension = this->type->type_dimension;
|
|
||||||
$$.type_index = this->type->type_index;
|
|
||||||
$$.type_sizeof = this->type->type_sizeof;
|
|
||||||
struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
|
|
||||||
free(name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$$.type_str = name;
|
|
||||||
$$.type_enum = ECPGt_long;
|
|
||||||
$$.type_dimension = make_str("-1");
|
|
||||||
$$.type_index = make_str("-1");
|
|
||||||
$$.type_sizeof = make_str("");
|
|
||||||
struct_member_list[struct_level] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -4740,7 +4623,7 @@ storage_modifier : S_CONST { $$ = make_str("const"); }
|
|||||||
| S_VOLATILE { $$ = make_str("volatile"); }
|
| S_VOLATILE { $$ = make_str("volatile"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
common_type: simple_type
|
var_type: simple_type
|
||||||
{
|
{
|
||||||
$$.type_enum = $1;
|
$$.type_enum = $1;
|
||||||
$$.type_str = mm_strdup(ECPGtype_name($1));
|
$$.type_str = mm_strdup(ECPGtype_name($1));
|
||||||
@ -4796,10 +4679,7 @@ common_type: simple_type
|
|||||||
$$.type_index = make_str("-1");
|
$$.type_index = make_str("-1");
|
||||||
$$.type_sizeof = NULL;
|
$$.type_sizeof = NULL;
|
||||||
}
|
}
|
||||||
;
|
| ECPGColLabelCommon ecpg_interval
|
||||||
|
|
||||||
var_type: common_type
|
|
||||||
| ECPGColLabel ecpg_interval
|
|
||||||
{
|
{
|
||||||
if (strlen($2) != 0 && strcmp ($1, "datetime") != 0 && strcmp ($1, "interval") != 0)
|
if (strlen($2) != 0 && strcmp ($1, "datetime") != 0 && strcmp ($1, "interval") != 0)
|
||||||
mmerror (PARSE_ERROR, ET_ERROR, "Interval specification not allowed here ");
|
mmerror (PARSE_ERROR, ET_ERROR, "Interval specification not allowed here ");
|
||||||
@ -5092,7 +4972,7 @@ variable_list: variable
|
|||||||
{ $$ = cat_str(3, $1, make_str(","), $3); }
|
{ $$ = cat_str(3, $1, make_str(","), $3); }
|
||||||
;
|
;
|
||||||
|
|
||||||
variable: opt_pointer ECPGColLabelCommon opt_array_bounds opt_initializer
|
variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
|
||||||
{
|
{
|
||||||
struct ECPGtype * type;
|
struct ECPGtype * type;
|
||||||
char *dimension = $3.index1; /* dimension of array */
|
char *dimension = $3.index1; /* dimension of array */
|
||||||
@ -5466,7 +5346,7 @@ ECPGTypedef: TYPE_P
|
|||||||
/* an initializer specified */
|
/* an initializer specified */
|
||||||
initializer = 0;
|
initializer = 0;
|
||||||
}
|
}
|
||||||
ColLabel IS var_type opt_array_bounds opt_reference
|
ECPGColLabelCommon IS var_type opt_array_bounds opt_reference
|
||||||
{
|
{
|
||||||
/* add entry to list */
|
/* add entry to list */
|
||||||
struct typedefs *ptr, *this;
|
struct typedefs *ptr, *this;
|
||||||
@ -5778,7 +5658,9 @@ ColLabel: ECPGColLabel { $$ = $1; }
|
|||||||
| INPUT_P { $$ = make_str("input"); }
|
| INPUT_P { $$ = make_str("input"); }
|
||||||
| INT_P { $$ = make_str("int"); }
|
| INT_P { $$ = make_str("int"); }
|
||||||
| UNION { $$ = make_str("union"); }
|
| UNION { $$ = make_str("union"); }
|
||||||
|
| TO { $$ = make_str("to"); }
|
||||||
| ECPGCKeywords { $$ = $1; }
|
| ECPGCKeywords { $$ = $1; }
|
||||||
|
| ECPGunreserved_interval { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
ECPGColLabelCommon: ident { $$ = $1; }
|
ECPGColLabelCommon: ident { $$ = $1; }
|
||||||
@ -5788,8 +5670,8 @@ ECPGColLabelCommon: ident { $$ = $1; }
|
|||||||
;
|
;
|
||||||
|
|
||||||
ECPGColLabel: ECPGColLabelCommon { $$ = $1; }
|
ECPGColLabel: ECPGColLabelCommon { $$ = $1; }
|
||||||
| unreserved_keyword { $$ = $1; }
|
|
||||||
| reserved_keyword { $$ = $1; }
|
| reserved_keyword { $$ = $1; }
|
||||||
|
| ECPGunreserved { $$ = $1; }
|
||||||
| ECPGKeywords_rest { $$ = $1; }
|
| ECPGKeywords_rest { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -5812,8 +5694,21 @@ ECPGCKeywords: S_AUTO { $$ = make_str("auto"); }
|
|||||||
|
|
||||||
/* "Unreserved" keywords --- available for use as any kind of name.
|
/* "Unreserved" keywords --- available for use as any kind of name.
|
||||||
*/
|
*/
|
||||||
unreserved_keyword:
|
/* The following symbols must be excluded from ECPGColLabel and directly included into ColLabel
|
||||||
ABORT_P { $$ = make_str("abort"); }
|
to enable C variables to get names from ECPGColLabel:
|
||||||
|
DAY_P, HOUR_P, MINUTE_P, MONTH_P, SECOND_P, YEAR_P
|
||||||
|
*/
|
||||||
|
unreserved_keyword: ECPGunreserved_interval | ECPGunreserved;
|
||||||
|
|
||||||
|
ECPGunreserved_interval: DAY_P { $$ = make_str("day"); }
|
||||||
|
| HOUR_P { $$ = make_str("hour"); }
|
||||||
|
| MINUTE_P { $$ = make_str("minute"); }
|
||||||
|
| MONTH_P { $$ = make_str("month"); }
|
||||||
|
| SECOND_P { $$ = make_str("second"); }
|
||||||
|
| YEAR_P { $$ = make_str("year"); }
|
||||||
|
;
|
||||||
|
|
||||||
|
ECPGunreserved: ABORT_P { $$ = make_str("abort"); }
|
||||||
| ABSOLUTE_P { $$ = make_str("absolute"); }
|
| ABSOLUTE_P { $$ = make_str("absolute"); }
|
||||||
| ACCESS { $$ = make_str("access"); }
|
| ACCESS { $$ = make_str("access"); }
|
||||||
| ACTION { $$ = make_str("action"); }
|
| ACTION { $$ = make_str("action"); }
|
||||||
@ -5847,7 +5742,7 @@ unreserved_keyword:
|
|||||||
| CURSOR { $$ = make_str("cursor"); }
|
| CURSOR { $$ = make_str("cursor"); }
|
||||||
| CYCLE { $$ = make_str("cycle"); }
|
| CYCLE { $$ = make_str("cycle"); }
|
||||||
| DATABASE { $$ = make_str("database"); }
|
| DATABASE { $$ = make_str("database"); }
|
||||||
| DAY_P { $$ = make_str("day"); }
|
/* | DAY_P { $$ = make_str("day"); }*/
|
||||||
| DEALLOCATE { $$ = make_str("deallocate"); }
|
| DEALLOCATE { $$ = make_str("deallocate"); }
|
||||||
| DECLARE { $$ = make_str("declare"); }
|
| DECLARE { $$ = make_str("declare"); }
|
||||||
| DEFAULTS { $$ = make_str("defaults"); }
|
| DEFAULTS { $$ = make_str("defaults"); }
|
||||||
@ -5874,7 +5769,7 @@ unreserved_keyword:
|
|||||||
| GLOBAL { $$ = make_str("global"); }
|
| GLOBAL { $$ = make_str("global"); }
|
||||||
| HANDLER { $$ = make_str("handler"); }
|
| HANDLER { $$ = make_str("handler"); }
|
||||||
| HOLD { $$ = make_str("hold"); }
|
| HOLD { $$ = make_str("hold"); }
|
||||||
| HOUR_P { $$ = make_str("hour"); }
|
/* | HOUR_P { $$ = make_str("hour"); }*/
|
||||||
| IMMEDIATE { $$ = make_str("immediate"); }
|
| IMMEDIATE { $$ = make_str("immediate"); }
|
||||||
| IMMUTABLE { $$ = make_str("immutable"); }
|
| IMMUTABLE { $$ = make_str("immutable"); }
|
||||||
| IMPLICIT_P { $$ = make_str("implicit"); }
|
| IMPLICIT_P { $$ = make_str("implicit"); }
|
||||||
@ -5899,10 +5794,10 @@ unreserved_keyword:
|
|||||||
| LOCK_P { $$ = make_str("lock"); }
|
| LOCK_P { $$ = make_str("lock"); }
|
||||||
| MATCH { $$ = make_str("match"); }
|
| MATCH { $$ = make_str("match"); }
|
||||||
| MAXVALUE { $$ = make_str("maxvalue"); }
|
| MAXVALUE { $$ = make_str("maxvalue"); }
|
||||||
| MINUTE_P { $$ = make_str("minute"); }
|
/* | MINUTE_P { $$ = make_str("minute"); }*/
|
||||||
| MINVALUE { $$ = make_str("minvalue"); }
|
| MINVALUE { $$ = make_str("minvalue"); }
|
||||||
| MODE { $$ = make_str("mode"); }
|
| MODE { $$ = make_str("mode"); }
|
||||||
| MONTH_P { $$ = make_str("month"); }
|
/* | MONTH_P { $$ = make_str("month"); }*/
|
||||||
| MOVE { $$ = make_str("move"); }
|
| MOVE { $$ = make_str("move"); }
|
||||||
| NAMES { $$ = make_str("names"); }
|
| NAMES { $$ = make_str("names"); }
|
||||||
| NATIONAL { $$ = make_str("national"); }
|
| NATIONAL { $$ = make_str("national"); }
|
||||||
@ -5945,7 +5840,7 @@ unreserved_keyword:
|
|||||||
| RULE { $$ = make_str("rule"); }
|
| RULE { $$ = make_str("rule"); }
|
||||||
| SCHEMA { $$ = make_str("schema"); }
|
| SCHEMA { $$ = make_str("schema"); }
|
||||||
| SCROLL { $$ = make_str("scroll"); }
|
| SCROLL { $$ = make_str("scroll"); }
|
||||||
| SECOND_P { $$ = make_str("second"); }
|
/* | SECOND_P { $$ = make_str("second"); }*/
|
||||||
| SEQUENCE { $$ = make_str("sequence"); }
|
| SEQUENCE { $$ = make_str("sequence"); }
|
||||||
| SERIALIZABLE { $$ = make_str("serializable"); }
|
| SERIALIZABLE { $$ = make_str("serializable"); }
|
||||||
| SESSION { $$ = make_str("session"); }
|
| SESSION { $$ = make_str("session"); }
|
||||||
@ -5987,7 +5882,7 @@ unreserved_keyword:
|
|||||||
| WITHOUT { $$ = make_str("without"); }
|
| WITHOUT { $$ = make_str("without"); }
|
||||||
| WORK { $$ = make_str("work"); }
|
| WORK { $$ = make_str("work"); }
|
||||||
| WRITE { $$ = make_str("write"); }
|
| WRITE { $$ = make_str("write"); }
|
||||||
| YEAR_P { $$ = make_str("year"); }
|
/* | YEAR_P { $$ = make_str("year"); }*/
|
||||||
| ZONE { $$ = make_str("zone"); }
|
| ZONE { $$ = make_str("zone"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -6135,7 +6030,9 @@ reserved_keyword:
|
|||||||
| SOME { $$ = make_str("some"); }
|
| SOME { $$ = make_str("some"); }
|
||||||
| TABLE { $$ = make_str("table"); }
|
| TABLE { $$ = make_str("table"); }
|
||||||
| THEN { $$ = make_str("then"); }
|
| THEN { $$ = make_str("then"); }
|
||||||
|
/* TO must be excluded from ECPGColLabel because of a conflict in variable name parsing
|
||||||
| TO { $$ = make_str("to"); }
|
| TO { $$ = make_str("to"); }
|
||||||
|
*/
|
||||||
| TRAILING { $$ = make_str("trailing"); }
|
| TRAILING { $$ = make_str("trailing"); }
|
||||||
| TRUE_P { $$ = make_str("true"); }
|
| TRUE_P { $$ = make_str("true"); }
|
||||||
/* UNION must be excluded from ECPGColLabel because of conflict with s_union
|
/* UNION must be excluded from ECPGColLabel because of conflict with s_union
|
||||||
|
Reference in New Issue
Block a user