Synced parser and keyword list.

Fixed handling of cyclic defines.
This commit is contained in:
Michael Meskes 2004-07-20 18:06:41 +00:00
parent 45995219a0
commit 5420ed3a81
6 changed files with 47 additions and 36 deletions

View File

@ -1845,6 +1845,11 @@ Mon, 5 Jul 2004 10:41:54 +0200
Mon Jul 5 20:50:09 CEST 2004 Mon Jul 5 20:50:09 CEST 2004
- Added free() calls against memory leak in interval.c. - Added free() calls against memory leak in interval.c.
Tue Jul 20 09:15:21 CEST 2004
- Synced parser and keyword list.
- Fixed handling of cyclic defines.
- Set pgtypes library version to 1.2. - Set pgtypes library version to 1.2.
- Set ecpg version to 3.2.0. - Set ecpg version to 3.2.0.
- Set compat library version to 1.2. - Set compat library version to 1.2.

View File

@ -1,4 +1,4 @@
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.88 2004/06/10 22:26:23 momjian Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.89 2004/07/20 18:06:41 meskes Exp $ */
/* New main for ecpg, the PostgreSQL embedded SQL precompiler. */ /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
/* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */ /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@ -96,7 +96,7 @@ add_preprocessor_define(char *define)
{ {
char *tmp; char *tmp;
/* symbol gets a value */ /* symbol has a value */
for (tmp = ptr - 1; *tmp == ' '; tmp--); for (tmp = ptr - 1; *tmp == ' '; tmp--);
tmp[1] = '\0'; tmp[1] = '\0';
defines->old = define_copy; defines->old = define_copy;
@ -105,9 +105,10 @@ add_preprocessor_define(char *define)
else else
{ {
defines->old = define_copy; defines->old = define_copy;
defines->new = mm_strdup(""); defines->new = mm_strdup("1");
} }
defines->pertinent = true; defines->pertinent = true;
defines->used = NULL;
defines->next = pd; defines->next = pd;
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.63 2004/06/20 10:45:47 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.64 2004/07/20 18:06:41 meskes Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -233,8 +233,6 @@ static ScanKeyword ScanKeywords[] = {
{"owner", OWNER}, {"owner", OWNER},
{"partial", PARTIAL}, {"partial", PARTIAL},
{"password", PASSWORD}, {"password", PASSWORD},
{"path", PATH_P},
{"pendant", PENDANT},
{"position", POSITION}, {"position", POSITION},
{"precision", PRECISION}, {"precision", PRECISION},
{"prepare", PREPARE}, {"prepare", PREPARE},
@ -327,7 +325,6 @@ static ScanKeyword ScanKeywords[] = {
{"varchar", VARCHAR}, {"varchar", VARCHAR},
{"varying", VARYING}, {"varying", VARYING},
{"verbose", VERBOSE}, {"verbose", VERBOSE},
{"version", VERSION},
{"view", VIEW}, {"view", VIEW},
{"volatile", VOLATILE}, {"volatile", VOLATILE},
{"when", WHEN}, {"when", WHEN},

View File

@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.129 2004/06/30 15:01:57 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.130 2004/07/20 18:06:41 meskes Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -598,11 +598,11 @@ cppline {space}*#(.*\\{space})+.*
<SQL>{identifier} { <SQL>{identifier} {
ScanKeyword *keyword; ScanKeyword *keyword;
struct _defines *ptr; struct _defines *ptr;
/* How about a DEFINE? */ /* How about a DEFINE? */
for (ptr = defines; ptr; ptr = ptr->next) for (ptr = defines; ptr; ptr = ptr->next)
{ {
if (strcmp(yytext, ptr->old) == 0) if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL)
{ {
struct _yy_buffer *yb; struct _yy_buffer *yb;
@ -611,15 +611,14 @@ cppline {space}*#(.*\\{space})+.*
yb->buffer = YY_CURRENT_BUFFER; yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno; yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename); yb->filename = mm_strdup(input_filename);
yb->next = yy_buffer; ptr->used = yb->next = yy_buffer;
yy_buffer = yb; yy_buffer = yb;
yy_scan_string(ptr->new); yy_scan_string(ptr->new);
break; break;
} }
} }
if (ptr == NULL) if (ptr == NULL)
{ {
/* Is it an SQL keyword? */ /* Is it an SQL keyword? */
@ -640,16 +639,13 @@ cppline {space}*#(.*\\{space})+.*
/* /*
* None of the above. Return it as an identifier. * None of the above. Return it as an identifier.
* *
* The backend would attempt to truncate and case-fold * The backend will attempt to truncate and case-fold
* the identifier, but I see no good reason for ecpg * the identifier, but I see no good reason for ecpg
* to do so; that's just another way that ecpg could get * to do so; that's just another way that ecpg could get
* out of step with the backend. * out of step with the backend.
*/ */
if (ptr == NULL) yylval.str = mm_strdup(yytext);
{ return IDENT;
yylval.str = mm_strdup(yytext);
return IDENT;
}
} }
} }
<SQL>{other} { return yytext[0]; } <SQL>{other} { return yytext[0]; }
@ -700,7 +696,7 @@ cppline {space}*#(.*\\{space})+.*
/* is it a define? */ /* is it a define? */
for (ptr = defines; ptr; ptr = ptr->next) for (ptr = defines; ptr; ptr = ptr->next)
{ {
if (strcmp(yytext, ptr->old) == 0) if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL)
{ {
struct _yy_buffer *yb; struct _yy_buffer *yb;
@ -709,7 +705,7 @@ cppline {space}*#(.*\\{space})+.*
yb->buffer = YY_CURRENT_BUFFER; yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno; yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename); yb->filename = mm_strdup(input_filename);
yb->next = yy_buffer; ptr->used = yb->next = yy_buffer;
yy_buffer = yb; yy_buffer = yb;
@ -739,7 +735,7 @@ cppline {space}*#(.*\\{space})+.*
<C>"-" { return('-'); } <C>"-" { return('-'); }
<C>"(" { return('('); } <C>"(" { return('('); }
<C>")" { return(')'); } <C>")" { return(')'); }
<C>{space} { ECHO; } <C,xskip>{space} { ECHO; }
<C>\{ { return('{'); } <C>\{ { return('{'); }
<C>\} { return('}'); } <C>\} { return('}'); }
<C>\[ { return('['); } <C>\[ { return('['); }
@ -975,12 +971,13 @@ cppline {space}*#(.*\\{space})+.*
} }
if (ptr == NULL) if (ptr == NULL)
{ {
this = (struct _defines *) mm_alloc(sizeof(struct _defines)); this = (struct _defines *) mm_alloc(sizeof(struct _defines));
/* initial definition */ /* initial definition */
this->old = old; this->old = old;
this->new = mm_strdup(literalbuf); this->new = mm_strdup(literalbuf);
this->next = defines; this->next = defines;
this->used = NULL;
defines = this; defines = this;
} }
@ -993,7 +990,7 @@ cppline {space}*#(.*\\{space})+.*
<incl>[^;\<\>\"]+";" { parse_include(); } <incl>[^;\<\>\"]+";" { parse_include(); }
<<EOF>> { <<EOF>> {
if (yy_buffer == NULL) { if (yy_buffer == NULL) {
if ( preproc_tos > 0 ) if ( preproc_tos > 0 )
{ {
preproc_tos = 0; preproc_tos = 0;
@ -1005,7 +1002,15 @@ cppline {space}*#(.*\\{space})+.*
{ {
struct _yy_buffer *yb = yy_buffer; struct _yy_buffer *yb = yy_buffer;
int i; int i;
struct _defines *ptr;
for (ptr = defines; ptr; ptr = ptr->next)
if (ptr->used == yy_buffer)
{
ptr->used = NULL;
break;
}
if (yyin != NULL) if (yyin != NULL)
fclose(yyin); fclose(yyin);
@ -1025,6 +1030,7 @@ cppline {space}*#(.*\\{space})+.*
if (i != 0) if (i != 0)
output_line_number(); output_line_number();
} }
} }
%% %%

View File

@ -1,4 +1,4 @@
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.292 2004/07/05 09:45:53 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.293 2004/07/20 18:06:41 meskes Exp $ */
/* Copyright comment */ /* Copyright comment */
%{ %{
@ -385,7 +385,7 @@ add_additional_variables(char *name, bool insert)
OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER
OUT_P OUTER_P OVERLAPS OVERLAY OWNER OUT_P OUTER_P OVERLAPS OVERLAY OWNER
PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION PARTIAL PASSWORD PLACING POSITION
PRECISION PRESERVE PREPARE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE PRECISION PRESERVE PREPARE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE
QUOTE QUOTE
@ -403,7 +403,7 @@ add_additional_variables(char *name, bool insert)
UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UPDATE USAGE UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UPDATE USAGE
USER USING USER USING
VACUUM VALID VALUES VARCHAR VARYING VERBOSE VERSION VIEW VOLATILE VACUUM VALID VALUES VARCHAR VARYING VERBOSE VIEW VOLATILE
WHEN WHERE WITH WITHOUT WORK WRITE WHEN WHERE WITH WITHOUT WORK WRITE
YEAR_P YEAR_P
ZONE ZONE
@ -414,7 +414,7 @@ add_additional_variables(char *name, bool insert)
*/ */
%token UNIONJOIN %token UNIONJOIN
/* Special keywords, not in the query language - see the "lex" file */ /* Special token types, not actually keywords - see the "lex" file */
%token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST %token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST
%token <ival> ICONST PARAM %token <ival> ICONST PARAM
%token <dval> FCONST %token <dval> FCONST
@ -1232,6 +1232,9 @@ alter_table_cmd:
/* ALTER TABLE <name> SET WITHOUT CLUSTER */ /* ALTER TABLE <name> SET WITHOUT CLUSTER */
| SET WITHOUT CLUSTER | SET WITHOUT CLUSTER
{ $$ = make_str("set without cluster"); } { $$ = make_str("set without cluster"); }
/* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
| SET TABLESPACE name
{ $$ = cat_str(2, make_str("set tablespace"), $3); }
; ;
alter_column_default: alter_column_default:
@ -1590,8 +1593,8 @@ CreateAsElement: ColId { $$ = $1; }
* *
*****************************************************************************/ *****************************************************************************/
CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList OptTableSpace CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList
{ $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5, $6); } { $$ = cat_str(4, make_str("create"), $2, make_str("sequence"), $4, $5); }
; ;
AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList
@ -5857,6 +5860,7 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); }
| ADD { $$ = make_str("add"); } | ADD { $$ = make_str("add"); }
| AFTER { $$ = make_str("after"); } | AFTER { $$ = make_str("after"); }
| AGGREGATE { $$ = make_str("aggregate"); } | AGGREGATE { $$ = make_str("aggregate"); }
| ALSO { $$ = make_str("also"); }
| ALTER { $$ = make_str("alter"); } | ALTER { $$ = make_str("alter"); }
| ASSERTION { $$ = make_str("assertion"); } | ASSERTION { $$ = make_str("assertion"); }
| ASSIGNMENT { $$ = make_str("assignment"); } | ASSIGNMENT { $$ = make_str("assignment"); }
@ -5957,8 +5961,6 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); }
| OWNER { $$ = make_str("owner"); } | OWNER { $$ = make_str("owner"); }
| PARTIAL { $$ = make_str("partial"); } | PARTIAL { $$ = make_str("partial"); }
| PASSWORD { $$ = make_str("password"); } | PASSWORD { $$ = make_str("password"); }
| PATH_P { $$ = make_str("path"); }
| PENDANT { $$ = make_str("pendant"); }
| PREPARE { $$ = make_str("prepare"); } | PREPARE { $$ = make_str("prepare"); }
| PRESERVE { $$ = make_str("preserver"); } | PRESERVE { $$ = make_str("preserver"); }
| PRIOR { $$ = make_str("prior"); } | PRIOR { $$ = make_str("prior"); }
@ -6021,7 +6023,6 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); }
| VALID { $$ = make_str("valid"); } | VALID { $$ = make_str("valid"); }
| VALUES { $$ = make_str("values"); } | VALUES { $$ = make_str("values"); }
| VARYING { $$ = make_str("varying"); } | VARYING { $$ = make_str("varying"); }
| VERSION { $$ = make_str("version"); }
| VIEW { $$ = make_str("view"); } | VIEW { $$ = make_str("view"); }
| WITH { $$ = make_str("with"); } | WITH { $$ = make_str("with"); }
| WITHOUT { $$ = make_str("without"); } | WITHOUT { $$ = make_str("without"); }

View File

@ -135,6 +135,7 @@ struct _defines
char *old; char *old;
char *new; char *new;
int pertinent; int pertinent;
void *used;
struct _defines *next; struct _defines *next;
}; };