Skip to content

Commit f464ad0

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 parent f0c9397 commit f464ad0

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> ECPGTypeName using_list ECPGColLabelCommon UsingConst
542542
%type <str> inf_val_list inf_col_list using_descriptor into_descriptor
543543
%type <str> ecpg_into_using prepared_name struct_union_type_with_symbol
544+
%type <str> ECPGunreserved ECPGunreserved_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_item desc_header_item
552553

553-
%type <type> var_type common_type single_vt_type
554+
%type <type> var_type single_vt_type
554555

555556
%type <action> action
556557

@@ -4459,7 +4460,7 @@ ecpg_interval: opt_interval { $$ = $1; }
44594460
| MONTH_P TO MONTH_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-
| ECPGColLabelCommon ecpg_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-
else if (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-
else if (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-
else if (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-
else if (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-
else if (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-
else if (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-
else if (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-
struct typedefs *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-
struct typedefs *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-
| ECPGColLabel ecpg_interval
4682+
| ECPGColLabelCommon ecpg_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_pointer ECPGColLabelCommon opt_array_bounds opt_initializer
4975+
variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
50964976
{
50974977
struct ECPGtype * 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-
ColLabel IS var_type opt_array_bounds opt_reference
5349+
ECPGColLabelCommon IS var_type opt_array_bounds opt_reference
54705350
{
54715351
/* add entry to list */
54725352
struct typedefs *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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy