Fixed bug in Informix define handling.
authorMichael Meskes <meskes@postgresql.org>
Wed, 29 Aug 2007 13:58:13 +0000 (13:58 +0000)
committerMichael Meskes <meskes@postgresql.org>
Wed, 29 Aug 2007 13:58:13 +0000 (13:58 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/preproc/ecpg.c
src/interfaces/ecpg/preproc/pgc.l

index 1dbed255367fb33fb0c134238dc6fc3d3b17111a..0a8dce301a2a62f4c1671733ad7719b4e15bc000 100644 (file)
@@ -2229,5 +2229,9 @@ Tue, 14 Aug 2007 11:46:51 +0200
 Wed, 22 Aug 2007 08:41:33 +0200
 
    - More cleaning up and removed some duplicates.
+
+Wed, 29 Aug 2007 15:41:58 +0200
+
+   - Fixed bug in Informix define handling.
    - Set ecpg library version to 6.0.
    - Set ecpg version to 4.4.
index 213118586230ef1bb37776409ad4be3dab35cb19..1dbe4d4ef4a382caa9c46c1561c4b3aa3dcf985a 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.100 2007/08/14 10:01:53 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.101 2007/08/29 13:58:13 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@@ -212,11 +212,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 c9ba3431ce68d41eda386e677fda5000bf1fb0b7..acfd618ed51304a8f6918cbec1f8bbf192e71896 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.154 2007/08/22 08:20:58 meskes Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.155 2007/08/29 13:58:13 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -50,6 +50,7 @@ static void parse_include (void);
 static void check_escape_warning(void);
 static bool ecpg_isspace(char ch);
 static bool isdefine(void);
+static bool isinformixdefine(void);
 
 char *token_start;
 int state_before;
@@ -751,8 +752,10 @@ cppline            {space}*#(.*\\{space})*.*{newline}
                    }
 <C>{identifier}    {
                        const ScanKeyword       *keyword;
-
-                       if (INFORMIX_MODE || !isdefine())
+                           
+                       /* 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)
@@ -1332,6 +1335,36 @@ static bool isdefine(void)
    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;
+}
+
 /*
  * Called before any actual parsing is done
  */