Synced parser and keyword list.
authorMichael Meskes
Tue, 20 Jul 2004 18:06:41 +0000 (18:06 +0000)
committerMichael Meskes
Tue, 20 Jul 2004 18:06:41 +0000 (18:06 +0000)
Fixed handling of cyclic defines.

src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/preproc/ecpg.c
src/interfaces/ecpg/preproc/keywords.c
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/preproc.y
src/interfaces/ecpg/preproc/type.h

index efce42831888d4723113ba6f2fbdfe5921c6816d..97e37eaf3edff876ca36659166d165bd208d159c 100644 (file)
@@ -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.
index f8013e487c36d5b23c103bc512db7370ef29c5b6..5592b42a79dc187b5091e5b32355fce2d5871d6f 100644 (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. */
 /* (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;
 }
 
index 67525830c4c4ced39283ed38d91c9a3202bfa65a..d8e8fed67abdd19b517526a02bcfe7902d373ee7 100644 (file)
@@ -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},
index e4ab68634f4cd762f843b792017954d1cc3e5110..28578a395430a663fbfa1db4b5bab6ce03fab5e3 100644 (file)
@@ -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; }
+,xskip>{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();
+                           
                        }
                    }
 %%
index 3c10072f6860fd790b4a0b54f937927068e6c036..a2e30af3e082000c93738e7c0642abf110e6f3d7 100644 (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 */
 %{
@@ -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"); }
index 3b1f4c657b1e7ed94976c39dae021a64cf8052c7..9aab463aa1caa170032906a975169c62b160c203 100644 (file)
@@ -135,6 +135,7 @@ struct _defines
    char        *old;
    char        *new;
    int     pertinent;
+   void        *used;
    struct _defines *next;
 };