Re: [GENERAL] ecpg: dtime_t vs timestamp

2007-08-29 Thread Michael Meskes
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: [EMAIL PROTECTED]
Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!
--- preproc/ecpg.c	8 Feb 2006 09:10:04 -	1.94
+++ preproc/ecpg.c	29 Aug 2007 13:50:55 -
@@ -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 -	1.150
+++ preproc/pgc.l	29 Aug 2007 13:50:55 -
@@ -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


[GENERAL] ecpg: dtime_t vs timestamp

2007-08-28 Thread Paul Tilles
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:

#include Ice.h

EXEC SQL include sqlda;
EXEC SQL include sqltypes;
EXEC SQL include sql3types;
EXEC SQL include pgtypes_timestamp;
EXEC SQL include pgtypes_date;
EXEC SQL include pgtypes_interval;
EXEC SQL include pgtypes_numeric;

EXEC SQL BEGIN DECLARE SECTION;
struct Ice_t
{
   charlid[9];
   charpe[3];
   short   dur;
   charts[3];
   charextremum[2];
dtime_t   obstime;
   double  value;
   charshef_qual_code[2];
   longquality_code;
   short   revision;
   charproduct_id[11];
   dtime_t   producttime;
   dtime_t   postingtime;
}


The Ice.h header file includes the postgres datetime.h header file.  The 
datetime.h file has the line typedef timestamp dtime_t.  Using Version 
7.4.x, this worked.  Now when we use Version 8.2.4 (which has an updated 
ecpg), this results in the message


ERROR:  invalid datatype  'dtime_t'

How should we fix this?

Paul Tilles

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
  choose an index scan if your joining column's datatypes do not
  match