Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf464ad0

Browse files
author
Michael Meskes
committed
- 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.
1 parentf0c9397 commitf464ad0

File tree

2 files changed

+41
-138
lines changed

2 files changed

+41
-138
lines changed

‎src/interfaces/ecpg/ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,5 +1740,11 @@ Sun Feb 15 14:44:14 CET 2004
17401740

17411741
- Added missing braces to array parsing.
17421742
- Allowed some C keywords to be used as SQL column names.
1743+
1744+
Mon Feb 16 08:17:19 CET 2004
1745+
1746+
- Cleaned up parser a little bit. It does not make sense to allow a
1747+
typename to be typedef'ed that cannot be parsed as variable type.
1748+
- Allowed some SQL keywords to be used as C variable names.
17431749
- Set ecpg version to 3.1.1.
17441750

‎src/interfaces/ecpg/preproc/preproc.y

Lines changed: 35 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.273 2004/02/15 15:38:20 meskes Exp $*/
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.274 2004/02/16 07:41:54 meskes Exp $*/
22

33
/* Copyright comment*/
44
%{
@@ -541,6 +541,7 @@ add_additional_variables(char *name, bool insert)
541541
%type<str>ECPGTypeNameusing_listECPGColLabelCommonUsingConst
542542
%type<str>inf_val_listinf_col_listusing_descriptorinto_descriptor
543543
%type<str>ecpg_into_usingprepared_namestruct_union_type_with_symbol
544+
%type<str>ECPGunreservedECPGunreserved_interval
544545

545546
%type<struct_union>s_struct_union_symbol
546547

@@ -550,7 +551,7 @@ add_additional_variables(char *name, bool insert)
550551

551552
%type<dtype_enum>descriptor_itemdesc_header_item
552553

553-
%type<type>var_typecommon_typesingle_vt_type
554+
%type<type>var_typesingle_vt_type
554555

555556
%type<action>action
556557

@@ -4459,7 +4460,7 @@ ecpg_interval:opt_interval{ $$ = $1; }
44594460
|MONTH_PTOMONTH_P{$$ = make_str("month to month"); }
44604461
;
44614462

4462-
single_vt_type:common_type
4463+
single_vt_type:var_type
44634464
|DOUBLE_P
44644465
{
44654466
$$.type_enum = ECPGt_double;
@@ -4468,124 +4469,6 @@ single_vt_type: common_type
44684469
$$.type_index = make_str("-1");
44694470
$$.type_sizeof =NULL;
44704471
}
4471-
|ECPGColLabelCommonecpg_interval
4472-
{
4473-
if (strlen($2) !=0 && strcmp ($1,"datetime") !=0 && strcmp ($1,"interval") !=0)
4474-
mmerror (PARSE_ERROR, ET_ERROR,"Interval specification not allowed here");
4475-
4476-
/*
4477-
* Check for type names that the SQL grammar treats as
4478-
* unreserved keywords
4479-
*/
4480-
if (strcmp($1,"varchar") ==0)
4481-
{
4482-
$$.type_enum = ECPGt_varchar;
4483-
$$.type_str = EMPTY;
4484-
$$.type_dimension = make_str("-1");
4485-
$$.type_index = make_str("-1");
4486-
$$.type_sizeof =NULL;
4487-
}
4488-
elseif (strcmp($1,"float") ==0)
4489-
{
4490-
$$.type_enum = ECPGt_float;
4491-
$$.type_str = make_str("float");
4492-
$$.type_dimension = make_str("-1");
4493-
$$.type_index = make_str("-1");
4494-
$$.type_sizeof =NULL;
4495-
}
4496-
elseif (strcmp($1,"numeric") ==0)
4497-
{
4498-
$$.type_enum = ECPGt_numeric;
4499-
$$.type_str = make_str("numeric");
4500-
$$.type_dimension = make_str("-1");
4501-
$$.type_index = make_str("-1");
4502-
$$.type_sizeof =NULL;
4503-
}
4504-
elseif (strcmp($1,"decimal") ==0)
4505-
{
4506-
$$.type_enum = ECPGt_decimal;
4507-
$$.type_str = make_str("decimal");
4508-
$$.type_dimension = make_str("-1");
4509-
$$.type_index = make_str("-1");
4510-
$$.type_sizeof =NULL;
4511-
}
4512-
elseif (strcmp($1,"date") ==0)
4513-
{
4514-
$$.type_enum = ECPGt_date;
4515-
$$.type_str = make_str("date");
4516-
$$.type_dimension = make_str("-1");
4517-
$$.type_index = make_str("-1");
4518-
$$.type_sizeof =NULL;
4519-
}
4520-
elseif (strcmp($1,"timestamp") ==0)
4521-
{
4522-
$$.type_enum = ECPGt_timestamp;
4523-
$$.type_str = make_str("timestamp");
4524-
$$.type_dimension = make_str("-1");
4525-
$$.type_index = make_str("-1");
4526-
$$.type_sizeof =NULL;
4527-
}
4528-
elseif (strcmp($1,"datetime") ==0)
4529-
{
4530-
$$.type_enum = ECPGt_timestamp;
4531-
$$.type_str = make_str("timestamp");
4532-
$$.type_dimension = make_str("-1");
4533-
$$.type_index = make_str("-1");
4534-
$$.type_sizeof =NULL;
4535-
}
4536-
elseif (strcmp($1,"interval") ==0)
4537-
{
4538-
$$.type_enum = ECPGt_interval;
4539-
$$.type_str = make_str("interval");
4540-
$$.type_dimension = make_str("-1");
4541-
$$.type_index = make_str("-1");
4542-
$$.type_sizeof =NULL;
4543-
}
4544-
else
4545-
{
4546-
/* this is for typedef'ed types*/
4547-
structtypedefs *this = get_typedef($1);
4548-
4549-
$$.type_str = (this->type->type_enum == ECPGt_varchar) ? EMPTY : mm_strdup(this->name);
4550-
$$.type_enum =this->type->type_enum;
4551-
$$.type_dimension =this->type->type_dimension;
4552-
$$.type_index =this->type->type_index;
4553-
$$.type_sizeof =this->type->type_sizeof;
4554-
struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
4555-
}
4556-
}
4557-
|s_struct_union_symbol
4558-
{
4559-
/* this is for named structs/unions*/
4560-
char *name;
4561-
structtypedefs *this;
4562-
bool forward = (forward_name !=NULL && strcmp($1.symbol, forward_name) ==0 && strcmp($1.su,"struct") ==0);
4563-
4564-
name = cat2_str($1.su,$1.symbol);
4565-
/* Do we have a forward definition?*/
4566-
if (!forward)
4567-
{
4568-
/* No*/
4569-
4570-
this = get_typedef(name);
4571-
$$.type_str = mm_strdup(this->name);
4572-
$$.type_enum =this->type->type_enum;
4573-
$$.type_dimension =this->type->type_dimension;
4574-
$$.type_index =this->type->type_index;
4575-
$$.type_sizeof =this->type->type_sizeof;
4576-
struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
4577-
free(name);
4578-
}
4579-
else
4580-
{
4581-
$$.type_str = name;
4582-
$$.type_enum = ECPGt_long;
4583-
$$.type_dimension = make_str("-1");
4584-
$$.type_index = make_str("-1");
4585-
$$.type_sizeof = make_str("");
4586-
struct_member_list[struct_level] =NULL;
4587-
}
4588-
}
45894472
;
45904473

45914474
/*
@@ -4740,7 +4623,7 @@ storage_modifier : S_CONST{ $$ = make_str("const"); }
47404623
|S_VOLATILE{$$ = make_str("volatile"); }
47414624
;
47424625

4743-
common_type:simple_type
4626+
var_type:simple_type
47444627
{
47454628
$$.type_enum =$1;
47464629
$$.type_str = mm_strdup(ECPGtype_name($1));
@@ -4796,10 +4679,7 @@ common_type: simple_type
47964679
$$.type_index = make_str("-1");
47974680
$$.type_sizeof =NULL;
47984681
}
4799-
;
4800-
4801-
var_type:common_type
4802-
|ECPGColLabelecpg_interval
4682+
|ECPGColLabelCommonecpg_interval
48034683
{
48044684
if (strlen($2) !=0 && strcmp ($1,"datetime") !=0 && strcmp ($1,"interval") !=0)
48054685
mmerror (PARSE_ERROR, ET_ERROR,"Interval specification not allowed here");
@@ -5092,7 +4972,7 @@ variable_list: variable
50924972
{$$ = cat_str(3,$1, make_str(","),$3); }
50934973
;
50944974

5095-
variable:opt_pointerECPGColLabelCommonopt_array_boundsopt_initializer
4975+
variable:opt_pointerECPGColLabelopt_array_boundsopt_initializer
50964976
{
50974977
structECPGtype * type;
50984978
char *dimension =$3.index1;/* dimension of array*/
@@ -5466,7 +5346,7 @@ ECPGTypedef: TYPE_P
54665346
/* an initializer specified*/
54675347
initializer =0;
54685348
}
5469-
ColLabelISvar_typeopt_array_boundsopt_reference
5349+
ECPGColLabelCommonISvar_typeopt_array_boundsopt_reference
54705350
{
54715351
/* add entry to list*/
54725352
structtypedefs *ptr, *this;
@@ -5778,7 +5658,9 @@ ColLabel: ECPGColLabel{ $$ = $1; }
57785658
|INPUT_P{$$ = make_str("input"); }
57795659
|INT_P{$$ = make_str("int"); }
57805660
|UNION{$$ = make_str("union"); }
5661+
|TO{$$ = make_str("to"); }
57815662
|ECPGCKeywords{$$ =$1; }
5663+
|ECPGunreserved_interval{$$ =$1; }
57825664
;
57835665

57845666
ECPGColLabelCommon:ident {$$ =$1; }
@@ -5788,8 +5670,8 @@ ECPGColLabelCommon: ident { $$ = $1; }
57885670
;
57895671

57905672
ECPGColLabel:ECPGColLabelCommon{$$ =$1; }
5791-
|unreserved_keyword{$$ =$1; }
57925673
|reserved_keyword{$$ =$1; }
5674+
|ECPGunreserved{$$ =$1; }
57935675
|ECPGKeywords_rest{$$ =$1; }
57945676
;
57955677

@@ -5800,7 +5682,7 @@ ECPGCKeywords: S_AUTO{ $$ = make_str("auto"); }
58005682
|S_STATIC{$$ = make_str("static"); }
58015683
|S_TYPEDEF{$$ = make_str("typedef"); }
58025684
;
5803-
5685+
58045686
/*
58055687
* Keyword classification lists. Generally, every keyword present in
58065688
* the Postgres grammar should appear in exactly one of these lists.
@@ -5812,8 +5694,21 @@ ECPGCKeywords: S_AUTO{ $$ = make_str("auto"); }
58125694

58135695
/* "Unreserved" keywords --- available for use as any kind of name.
58145696
*/
5815-
unreserved_keyword:
5816-
ABORT_P{$$ = make_str("abort"); }
5697+
/* The following symbols must be excluded from ECPGColLabel and directly included into ColLabel
5698+
to enable C variables to get names from ECPGColLabel:
5699+
DAY_P, HOUR_P, MINUTE_P, MONTH_P, SECOND_P, YEAR_P
5700+
*/
5701+
unreserved_keyword:ECPGunreserved_interval|ECPGunreserved;
5702+
5703+
ECPGunreserved_interval:DAY_P{$$ = make_str("day"); }
5704+
|HOUR_P{$$ = make_str("hour"); }
5705+
|MINUTE_P{$$ = make_str("minute"); }
5706+
|MONTH_P{$$ = make_str("month"); }
5707+
|SECOND_P{$$ = make_str("second"); }
5708+
|YEAR_P{$$ = make_str("year"); }
5709+
;
5710+
5711+
ECPGunreserved:ABORT_P{$$ = make_str("abort"); }
58175712
|ABSOLUTE_P{$$ = make_str("absolute"); }
58185713
|ACCESS{$$ = make_str("access"); }
58195714
|ACTION{$$ = make_str("action"); }
@@ -5847,7 +5742,7 @@ unreserved_keyword:
58475742
|CURSOR{$$ = make_str("cursor"); }
58485743
|CYCLE{$$ = make_str("cycle"); }
58495744
|DATABASE{$$ = make_str("database"); }
5850-
|DAY_P{$$ = make_str("day"); }
5745+
/*| DAY_P{ $$ = make_str("day"); }*/
58515746
|DEALLOCATE{$$ = make_str("deallocate"); }
58525747
|DECLARE{$$ = make_str("declare"); }
58535748
|DEFAULTS{$$ = make_str("defaults"); }
@@ -5874,7 +5769,7 @@ unreserved_keyword:
58745769
|GLOBAL{$$ = make_str("global"); }
58755770
|HANDLER{$$ = make_str("handler"); }
58765771
|HOLD{$$ = make_str("hold"); }
5877-
|HOUR_P{$$ = make_str("hour"); }
5772+
/*| HOUR_P{ $$ = make_str("hour"); }*/
58785773
|IMMEDIATE{$$ = make_str("immediate"); }
58795774
|IMMUTABLE{$$ = make_str("immutable"); }
58805775
|IMPLICIT_P{$$ = make_str("implicit"); }
@@ -5899,10 +5794,10 @@ unreserved_keyword:
58995794
|LOCK_P{$$ = make_str("lock"); }
59005795
|MATCH{$$ = make_str("match"); }
59015796
|MAXVALUE{$$ = make_str("maxvalue"); }
5902-
|MINUTE_P{$$ = make_str("minute"); }
5797+
/*| MINUTE_P{ $$ = make_str("minute"); }*/
59035798
|MINVALUE{$$ = make_str("minvalue"); }
59045799
|MODE{$$ = make_str("mode"); }
5905-
|MONTH_P{$$ = make_str("month"); }
5800+
/*| MONTH_P{ $$ = make_str("month"); }*/
59065801
|MOVE{$$ = make_str("move"); }
59075802
|NAMES{$$ = make_str("names"); }
59085803
|NATIONAL{$$ = make_str("national"); }
@@ -5945,7 +5840,7 @@ unreserved_keyword:
59455840
|RULE{$$ = make_str("rule"); }
59465841
|SCHEMA{$$ = make_str("schema"); }
59475842
|SCROLL{$$ = make_str("scroll"); }
5948-
|SECOND_P{$$ = make_str("second"); }
5843+
/*| SECOND_P{ $$ = make_str("second"); }*/
59495844
|SEQUENCE{$$ = make_str("sequence"); }
59505845
|SERIALIZABLE{$$ = make_str("serializable"); }
59515846
|SESSION{$$ = make_str("session"); }
@@ -5987,7 +5882,7 @@ unreserved_keyword:
59875882
|WITHOUT{$$ = make_str("without"); }
59885883
|WORK{$$ = make_str("work"); }
59895884
|WRITE {$$ = make_str("write"); }
5990-
|YEAR_P{$$ = make_str("year"); }
5885+
/*| YEAR_P{ $$ = make_str("year"); }*/
59915886
|ZONE{$$ = make_str("zone"); }
59925887
;
59935888

@@ -6135,7 +6030,9 @@ reserved_keyword:
61356030
|SOME{$$ = make_str("some"); }
61366031
|TABLE{$$ = make_str("table"); }
61376032
|THEN{$$ = make_str("then"); }
6033+
/* TO must be excluded from ECPGColLabel because of a conflict in variable name parsing
61386034
| TO{ $$ = make_str("to"); }
6035+
*/
61396036
|TRAILING{$$ = make_str("trailing"); }
61406037
|TRUE_P{$$ = make_str("true"); }
61416038
/* UNION must be excluded from ECPGColLabel because of conflict with s_union

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp