Synced parser and keyword list.
Fixed handling of cyclic defines.
This commit is contained in:
parent
45995219a0
commit
5420ed3a81
@ -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.
|
||||
|
@ -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 <meskes@postgresql.org> 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;
|
||||
}
|
||||
|
||||
|
@ -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},
|
||||
|
@ -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})+.*
|
||||
<SQL>{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;
|
||||
}
|
||||
}
|
||||
<SQL>{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})+.*
|
||||
<C>"-" { return('-'); }
|
||||
<C>"(" { return('('); }
|
||||
<C>")" { return(')'); }
|
||||
<C>{space} { ECHO; }
|
||||
<C,xskip>{space} { ECHO; }
|
||||
<C>\{ { return('{'); }
|
||||
<C>\} { return('}'); }
|
||||
<C>\[ { 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})+.*
|
||||
<incl>[^;\<\>\"]+";" { parse_include(); }
|
||||
|
||||
<<EOF>> {
|
||||
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();
|
||||
|
||||
}
|
||||
}
|
||||
%%
|
||||
|
@ -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 <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST
|
||||
%token <ival> ICONST PARAM
|
||||
%token <dval> FCONST
|
||||
@ -1232,6 +1232,9 @@ alter_table_cmd:
|
||||
/* ALTER TABLE <name> SET WITHOUT CLUSTER */
|
||||
| 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:
|
||||
@ -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"); }
|
||||
|
@ -135,6 +135,7 @@ struct _defines
|
||||
char *old;
|
||||
char *new;
|
||||
int pertinent;
|
||||
void *used;
|
||||
struct _defines *next;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user