summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meskes2004-07-20 18:06:41 +0000
committerMichael Meskes2004-07-20 18:06:41 +0000
commit5420ed3a814b4aea81699a01b70c8b1d951254b6 (patch)
treee36cbcaaacb442e40f9c4513edd5d5d6a86f0b92
parent45995219a015b841d48dff2b3920b03edcd35d06 (diff)
Synced parser and keyword list.
Fixed handling of cyclic defines.
-rw-r--r--src/interfaces/ecpg/ChangeLog5
-rw-r--r--src/interfaces/ecpg/preproc/ecpg.c7
-rw-r--r--src/interfaces/ecpg/preproc/keywords.c5
-rw-r--r--src/interfaces/ecpg/preproc/pgc.l46
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y19
-rw-r--r--src/interfaces/ecpg/preproc/type.h1
6 files changed, 47 insertions, 36 deletions
diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index efce4283188..97e37eaf3ed 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 f8013e487c3..5592b42a79d 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 <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;
}
diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c
index 67525830c4c..d8e8fed67ab 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 e4ab68634f4..28578a39543 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})+.*
<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();
+
}
}
%%
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 3c10072f686..a2e30af3e08 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 <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"); }
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index 3b1f4c657b1..9aab463aa1c 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;
};