diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index efce428318..97e37eaf3e 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -1845,6 +1845,11 @@ Mon, 5 Jul 2004 10:41:54 +0200 Mon Jul 5 20:50:09 CEST 2004 - 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 ecpg version to 3.2.0. - Set compat library version to 1.2. diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c index f8013e487c..5592b42a79 100644 --- a/src/interfaces/ecpg/preproc/ecpg.c +++ b/src/interfaces/ecpg/preproc/ecpg.c @@ -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. */ /* (C) Michael Meskes Feb 5th, 1998 */ @@ -96,7 +96,7 @@ add_preprocessor_define(char *define) { char *tmp; - /* symbol gets a value */ + /* symbol has a value */ for (tmp = ptr - 1; *tmp == ' '; tmp--); tmp[1] = '\0'; defines->old = define_copy; @@ -105,9 +105,10 @@ add_preprocessor_define(char *define) else { defines->old = define_copy; - defines->new = mm_strdup(""); + defines->new = mm_strdup("1"); } defines->pertinent = true; + defines->used = NULL; defines->next = pd; } diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c index 67525830c4..d8e8fed67a 100644 --- a/src/interfaces/ecpg/preproc/keywords.c +++ b/src/interfaces/ecpg/preproc/keywords.c @@ -8,7 +8,7 @@ * * * 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}, {"partial", PARTIAL}, {"password", PASSWORD}, - {"path", PATH_P}, - {"pendant", PENDANT}, {"position", POSITION}, {"precision", PRECISION}, {"prepare", PREPARE}, @@ -327,7 +325,6 @@ static ScanKeyword ScanKeywords[] = { {"varchar", VARCHAR}, {"varying", VARYING}, {"verbose", VERBOSE}, - {"version", VERSION}, {"view", VIEW}, {"volatile", VOLATILE}, {"when", WHEN}, diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index e4ab68634f..28578a3954 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -12,7 +12,7 @@ * * * 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})+.* {identifier} { ScanKeyword *keyword; struct _defines *ptr; - + /* How about a DEFINE? */ 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; @@ -611,15 +611,14 @@ cppline {space}*#(.*\\{space})+.* yb->buffer = YY_CURRENT_BUFFER; yb->lineno = yylineno; yb->filename = mm_strdup(input_filename); - yb->next = yy_buffer; - + ptr->used = yb->next = yy_buffer; + yy_buffer = yb; yy_scan_string(ptr->new); break; } } - if (ptr == NULL) { /* Is it an SQL keyword? */ @@ -640,16 +639,13 @@ cppline {space}*#(.*\\{space})+.* /* * 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 * to do so; that's just another way that ecpg could get * out of step with the backend. */ - if (ptr == NULL) - { - yylval.str = mm_strdup(yytext); - return IDENT; - } + yylval.str = mm_strdup(yytext); + return IDENT; } } {other} { return yytext[0]; } @@ -700,7 +696,7 @@ cppline {space}*#(.*\\{space})+.* /* is it a define? */ 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; @@ -709,7 +705,7 @@ cppline {space}*#(.*\\{space})+.* yb->buffer = YY_CURRENT_BUFFER; yb->lineno = yylineno; yb->filename = mm_strdup(input_filename); - yb->next = yy_buffer; + ptr->used = yb->next = yy_buffer; yy_buffer = yb; @@ -739,7 +735,7 @@ cppline {space}*#(.*\\{space})+.* "-" { return('-'); } "(" { return('('); } ")" { return(')'); } -{space} { ECHO; } +{space} { ECHO; } \{ { return('{'); } \} { return('}'); } \[ { return('['); } @@ -975,12 +971,13 @@ cppline {space}*#(.*\\{space})+.* } if (ptr == NULL) { - this = (struct _defines *) mm_alloc(sizeof(struct _defines)); + this = (struct _defines *) mm_alloc(sizeof(struct _defines)); - /* initial definition */ - this->old = old; - this->new = mm_strdup(literalbuf); + /* initial definition */ + this->old = old; + this->new = mm_strdup(literalbuf); this->next = defines; + this->used = NULL; defines = this; } @@ -993,7 +990,7 @@ cppline {space}*#(.*\\{space})+.* [^;\<\>\"]+";" { parse_include(); } <> { - if (yy_buffer == NULL) { + if (yy_buffer == NULL) { if ( preproc_tos > 0 ) { preproc_tos = 0; @@ -1005,7 +1002,15 @@ cppline {space}*#(.*\\{space})+.* { struct _yy_buffer *yb = yy_buffer; int i; + struct _defines *ptr; + for (ptr = defines; ptr; ptr = ptr->next) + if (ptr->used == yy_buffer) + { + ptr->used = NULL; + break; + } + if (yyin != NULL) fclose(yyin); @@ -1025,6 +1030,7 @@ cppline {space}*#(.*\\{space})+.* if (i != 0) output_line_number(); + } } %% diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 3c10072f68..a2e30af3e0 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -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 */ %{ @@ -385,7 +385,7 @@ add_additional_variables(char *name, bool insert) OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER 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 QUOTE @@ -403,7 +403,7 @@ add_additional_variables(char *name, bool insert) UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UPDATE USAGE 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 YEAR_P ZONE @@ -414,7 +414,7 @@ add_additional_variables(char *name, bool insert) */ %token UNIONJOIN -/* Special keywords, not in the query language - see the "lex" file */ +/* Special token types, not actually keywords - see the "lex" file */ %token IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST %token ICONST PARAM %token FCONST @@ -1232,6 +1232,9 @@ alter_table_cmd: /* ALTER TABLE SET WITHOUT CLUSTER */ | SET WITHOUT CLUSTER { $$ = make_str("set without cluster"); } + /* ALTER TABLE SET TABLESPACE */ + | SET TABLESPACE name + { $$ = cat_str(2, make_str("set tablespace"), $3); } ; alter_column_default: @@ -1590,8 +1593,8 @@ CreateAsElement: ColId { $$ = $1; } * *****************************************************************************/ -CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList OptTableSpace - { $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5, $6); } +CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList + { $$ = cat_str(4, make_str("create"), $2, make_str("sequence"), $4, $5); } ; AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList @@ -5857,6 +5860,7 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); } | ADD { $$ = make_str("add"); } | AFTER { $$ = make_str("after"); } | AGGREGATE { $$ = make_str("aggregate"); } + | ALSO { $$ = make_str("also"); } | ALTER { $$ = make_str("alter"); } | ASSERTION { $$ = make_str("assertion"); } | ASSIGNMENT { $$ = make_str("assignment"); } @@ -5957,8 +5961,6 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); } | OWNER { $$ = make_str("owner"); } | PARTIAL { $$ = make_str("partial"); } | PASSWORD { $$ = make_str("password"); } - | PATH_P { $$ = make_str("path"); } - | PENDANT { $$ = make_str("pendant"); } | PREPARE { $$ = make_str("prepare"); } | PRESERVE { $$ = make_str("preserver"); } | PRIOR { $$ = make_str("prior"); } @@ -6021,7 +6023,6 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); } | VALID { $$ = make_str("valid"); } | VALUES { $$ = make_str("values"); } | VARYING { $$ = make_str("varying"); } - | VERSION { $$ = make_str("version"); } | VIEW { $$ = make_str("view"); } | WITH { $$ = make_str("with"); } | WITHOUT { $$ = make_str("without"); } diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h index 3b1f4c657b..9aab463aa1 100644 --- a/src/interfaces/ecpg/preproc/type.h +++ b/src/interfaces/ecpg/preproc/type.h @@ -135,6 +135,7 @@ struct _defines char *old; char *new; int pertinent; + void *used; struct _defines *next; };