Synced parser and keyword list.
authorMichael Meskes <meskes@postgresql.org>
Tue, 20 Jul 2004 18:06:41 +0000 (18:06 +0000)
committerMichael Meskes <meskes@postgresql.org>
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 <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;
 }
 
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})+.*
 <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();
+                                                       
                                                }
                                        }
 %%
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 <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"); }
index 3b1f4c657b1e7ed94976c39dae021a64cf8052c7..9aab463aa1caa170032906a975169c62b160c203 100644 (file)
@@ -135,6 +135,7 @@ struct _defines
        char            *old;
        char            *new;
        int             pertinent;
+       void            *used;
        struct _defines *next;
 };