From c7b6593042fb304555c45ce72142aae3e5101bd2 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Wed, 29 Aug 2007 13:58:13 +0000 Subject: [PATCH] Fixed bug in Informix define handling. --- src/interfaces/ecpg/ChangeLog | 4 ++++ src/interfaces/ecpg/preproc/ecpg.c | 7 +------ src/interfaces/ecpg/preproc/pgc.l | 39 +++++++++++++++++++++++++++++++++++--- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 1dbed25536..0a8dce301a 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -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. diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c index 2131185862..1dbe4d4ef4 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.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 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); diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index c9ba3431ce..acfd618ed5 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.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} } {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 */ -- 2.11.0