Search Postgresql Archives

Re: ecpg: dtime_t vs timestamp

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 28, 2007 at 10:59:42AM -0400, Paul Tilles wrote:
> We have upgraded from Version 7.4.x to Version 8.2.4. 
> In 7.4.x, we use the Informix compatibility functionality to use legacy 
> code. 
> Our .pgc code looks as follows:
> ...

This is indeed a bug. Thanks for reporting it.

What happens is that ecpg defines the data types, but does not use that
define while in C code. I just committed patches to CVS. I also attach
it here. Could you please try if this fixes your problem?

Thanks.

Michael
-- 
Michael Meskes
Email: Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org)
ICQ: 179140304, AIM/Yahoo: michaelmeskes, Jabber: meskes@xxxxxxxxxx
Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!
--- preproc/ecpg.c	8 Feb 2006 09:10:04 -0000	1.94
+++ preproc/ecpg.c	29 Aug 2007 13:50:55 -0000
@@ -185,11 +185,6 @@
 					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);
--- preproc/pgc.l	22 Sep 2006 21:39:58 -0000	1.150
+++ preproc/pgc.l	29 Aug 2007 13:50:55 -0000
@@ -48,6 +48,8 @@
 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;
@@ -671,29 +673,8 @@
 					}
 <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);
@@ -765,38 +746,10 @@
 					}
 <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)
@@ -1347,3 +1300,61 @@
 		return true;
 	return false;
 }
+
+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;
+}
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux