Fixed bug in Informix define handling.
authorMichael Meskes <[email protected]>
Wed, 29 Aug 2007 13:58:51 +0000 (13:58 +0000)
committerMichael Meskes <[email protected]>
Wed, 29 Aug 2007 13:58:51 +0000 (13:58 +0000)
src/interfaces/ecpg/preproc/ecpg.c
src/interfaces/ecpg/preproc/pgc.l

index 41625fa758a2188c6a02ef5ea5ce41d592fecce1..4915ab2f992e365783a917f45672e97bc6f9d678 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.93 2005/10/15 02:49:47 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.93.2.1 2007/08/29 13:58:51 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <[email protected]> Feb 5th, 1998 */
@@ -185,11 +185,6 @@ main(int argc, char *const argv[])
                    char        informix_path[MAXPGPATH];
 
                    compat = (strcmp(optarg, "INFORMIX") == 0) ? ECPG_COMPAT_INFORMIX : ECPG_COMPAT_INFORMIX_SE;
-                   /* system_includes = true; */
-                   add_preprocessor_define("dec_t=decimal");
-                   add_preprocessor_define("intrvl_t=interval");
-                   add_preprocessor_define("dtime_t=timestamp");
-
                    get_pkginclude_path(my_exec_path, pkginclude_path);
                    snprintf(informix_path, MAXPGPATH, "%s/informix/esql", pkginclude_path);
                    add_include_path(informix_path);
index f72b7bf7d2a1e9c91f3af5b7e58466f7c80ee164..4e89cd6453a5278b7fc5ccb20663d563631d2950 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.137 2005/10/05 14:58:36 meskes Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.137.2.1 2007/08/29 13:58:51 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,6 +47,8 @@ static void addlit(char *ytext, int yleng);
 static void addlitchar (unsigned char);
 static void parse_include (void);
 static void check_escape_warning(void);
+static bool isdefine(void);
+static bool isinformixdefine(void);
 
 char *token_start;
 int state_before;
@@ -647,29 +649,8 @@ cppline            {space}*#(.*\\{space})*.*{newline}
                    }
 <SQL>{identifier}  {
                        ScanKeyword    *keyword;
-                       struct _defines *ptr;
-                       
-                       /* How about a DEFINE? */
-                       for (ptr = defines; ptr; ptr = ptr->next)
-                       {
-                           if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL)
-                           {
-                               struct _yy_buffer *yb;
-
-                               yb = mm_alloc(sizeof(struct _yy_buffer));
 
-                               yb->buffer =  YY_CURRENT_BUFFER;
-                               yb->lineno = yylineno;
-                               yb->filename = mm_strdup(input_filename);
-                               yb->next = yy_buffer;
-                               
-                               ptr->used = yy_buffer = yb;
-
-                               yy_scan_string(ptr->new);
-                               break;
-                           }
-                       }
-                       if (ptr == NULL)
+                       if (!isdefine())
                        {
                            /* Is it an SQL keyword? */
                            keyword = ScanKeywordLookup(yytext);
@@ -741,38 +722,10 @@ cppline           {space}*#(.*\\{space})*.*{newline}
                    }
 <C>{identifier}    {
                        ScanKeyword     *keyword;
-                       struct _defines *ptr;
-
-                                   if (INFORMIX_MODE)
-                       {
-                           /* Informix uses SQL defines only in SQL space */
-                           ptr = NULL;
-                       }
-                       else
-                       {
-                           /* is it a define? */
-                           for (ptr = defines; ptr; ptr = ptr->next)
-                           {
-                               if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL)
-                               {
-                                   struct _yy_buffer *yb;
-
-                                   yb = mm_alloc(sizeof(struct _yy_buffer));
-
-                                   yb->buffer =  YY_CURRENT_BUFFER;
-                                   yb->lineno = yylineno;
-                                   yb->filename = mm_strdup(input_filename);
-                                   yb->next = yy_buffer;
-
-                                   ptr->used = yy_buffer = yb;
 
-                                   yy_scan_string(ptr->new);
-                                   break;
-                               }
-                           }
-                       }
-
-                       if (ptr == NULL)
+                       /* Informix uses SQL defines only in SQL space */
+                       /* however, some defines have to be taken care of for compatibility */
+                       if ((!INFORMIX_MODE || !isinformixdefine()) && !isdefine())
                        {
                            keyword = ScanCKeywordLookup(yytext);
                            if (keyword != NULL)
@@ -1245,3 +1198,61 @@ check_escape_warning(void)
            mmerror (PARSE_ERROR, ET_WARNING, "nonstandard use of escape in a string literal");
         warn_on_first_escape = false;   /* warn only once per string */
 }
+
+static bool isdefine(void)
+{
+   struct _defines *ptr;
+
+   /* is it a define? */
+   for (ptr = defines; ptr; ptr = ptr->next)
+   {
+       if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL)
+       {
+           struct _yy_buffer *yb;
+
+           yb = mm_alloc(sizeof(struct _yy_buffer));
+
+           yb->buffer =  YY_CURRENT_BUFFER;
+           yb->lineno = yylineno;
+           yb->filename = mm_strdup(input_filename);
+           yb->next = yy_buffer;
+
+           ptr->used = yy_buffer = yb;
+
+           yy_scan_string(ptr->new);
+           return true;
+       }
+   }
+
+   return false;
+}
+
+static bool isinformixdefine(void)
+{
+   const char *new = NULL;
+
+   if (strcmp(yytext, "dec_t") == 0)
+       new = "decimal";
+   else if (strcmp(yytext, "intrvl_t") == 0)
+           new = "interval";
+   else if (strcmp(yytext, "dtime_t") == 0)
+                new = "timestamp";
+
+   if (new)
+   {
+       struct _yy_buffer *yb;
+
+       yb = mm_alloc(sizeof(struct _yy_buffer));
+
+       yb->buffer =  YY_CURRENT_BUFFER;
+       yb->lineno = yylineno;
+       yb->filename = mm_strdup(input_filename);
+       yb->next = yy_buffer;
+       yy_buffer = yb;
+
+       yy_scan_string(new);
+       return true;
+   }
+
+   return false;
+}