diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 136a7a75626d3e4977be013b05f8860b3e559c71..77ab60c2b3c0c984cf2eaaa12303cc3d43d3da7a 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1369,6 +1369,13 @@ Fri Mar 21 15:13:42 CET 2003
 
 	- Made sure preprocessor accepts new datatypes.
 	- Do not free prepared statements at the end of a transaction.
+
+
+Thu Mar 27 15:23:58 CET 2003
+
+	- Some more updates to pgtypeslib.
+	- Set optimization to -O1 until I find the reason why code is broken
+	  with -O2.
 	- Set ecpg version to 2.12.0.
 	- Set ecpg library to 3.4.2.
 	- Set pgtypes library to 1.0.0
diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c
index 81f9d62e691964f94aa8ead5b43735e6a931292d..5d6f31f089bfebed4b872de6888caa7783854dd0 100644
--- a/src/interfaces/ecpg/ecpglib/data.c
+++ b/src/interfaces/ecpg/ecpglib/data.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.2 2003/03/20 15:56:50 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.3 2003/03/27 14:29:17 meskes Exp $ */
 
 #include "postgres_fe.h"
 
@@ -13,6 +13,7 @@
 #include "pgtypes_numeric.h"
 #include "pgtypes_date.h"
 #include "pgtypes_timestamp.h"
+#include "pgtypes_interval.h"
 
 bool
 ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
@@ -100,9 +101,10 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 				unsigned long ures;
 				double		dres;
 				char	   *scan_length;
-				NumericVar *nres;
+				Numeric *nres;
 				Date	   ddres;
 				Timestamp	tres;
+				Interval	*ires;
 
 			case ECPGt_short:
 			case ECPGt_int:
@@ -392,16 +394,39 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 					if ((isarray && *scan_length != ',' && *scan_length != '}')
 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */
 					{
-						ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval);
+						ECPGraise(lineno, ECPG_NUMERIC_FORMAT, pval);
 						return (false);
 					}
 				}
 				else
 					nres = PGTYPESnumeric_aton("0.0", &scan_length);
 
-				PGTYPESnumeric_copy(nres, (NumericVar *)(var + offset * act_tuple));
+				PGTYPESnumeric_copy(nres, (Numeric *)(var + offset * act_tuple));
 				break;
 				
+			case ECPGt_interval:
+				if (pval)
+				{
+					if (isarray && *pval == '"')
+						ires = PGTYPESinterval_atoi(pval + 1, &scan_length);
+					else
+						ires = PGTYPESinterval_atoi(pval, &scan_length);
+
+					if (isarray && *scan_length == '"')
+						scan_length++;
+
+					if ((isarray && *scan_length != ',' && *scan_length != '}')
+						|| (!isarray && *scan_length != '\0'))	/* Garbage left */
+					{
+						ECPGraise(lineno, ECPG_INTERVAL_FORMAT, pval);
+						return (false);
+					}
+				}
+				else
+					ires = PGTYPESinterval_atoi("0 seconds", NULL);
+
+				PGTYPESinterval_copy(ires, (Interval *)(var + offset * act_tuple));
+				break;
 			case ECPGt_date:
 				if (pval)
 				{
@@ -416,7 +441,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 					if ((isarray && *scan_length != ',' && *scan_length != '}')
 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */
 					{
-						ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval);
+						ECPGraise(lineno, ECPG_DATE_FORMAT, pval);
 						return (false);
 					}
 
@@ -438,7 +463,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 					if ((isarray && *scan_length != ',' && *scan_length != '}')
 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */
 					{
-						ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval);
+						ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, pval);
 						return (false);
 					}
 
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 24a46edc4150da3661e7244c1dfab8f22ce394b6..a1e0f5456b4dfddfdb7d2a0fed0b7f4b3a40f610 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.5 2003/03/25 02:44:36 momjian Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.6 2003/03/27 14:29:17 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -29,6 +29,7 @@
 #include "pgtypes_numeric.h"
 #include "pgtypes_date.h"
 #include "pgtypes_timestamp.h"
+#include "pgtypes_interval.h"
 
 /* variables visible to the programs */
 struct sqlca sqlca =
@@ -846,7 +847,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
 					{
 						for (element = 0; element < var->arrsize; element++)
 						{
-							str = PGTYPESnumeric_ntoa((NumericVar *)((var + var->offset * element)->value));
+							str = PGTYPESnumeric_ntoa((Numeric *)((var + var->offset * element)->value));
 							slen = strlen (str);
 							
 							if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + 5, stmt->lineno)))
@@ -862,7 +863,48 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
 					}
 					else
 					{
-						str = PGTYPESnumeric_ntoa((NumericVar *)(var->value));
+						str = PGTYPESnumeric_ntoa((Numeric *)(var->value));
+						slen = strlen (str);
+					
+						if (!(mallocedval = ECPGalloc(slen + 1, stmt->lineno)))
+							return false;
+
+						strncpy(mallocedval, str , slen);
+						mallocedval[slen] = '\0';
+					}
+					
+					*tobeinserted_p = mallocedval;
+					*malloced_p = true;
+					free(str);
+				}
+				break;
+
+			case ECPGt_interval:
+				{
+					char *str = NULL;
+					int slen;
+					
+					if (var->arrsize > 1)
+					{
+						for (element = 0; element < var->arrsize; element++)
+						{
+							str = PGTYPESinterval_itoa((Interval *)((var + var->offset * element)->value));
+							slen = strlen (str);
+							
+							if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + 5, stmt->lineno)))
+								return false;
+							
+							if (!element)
+								strcpy(mallocedval, "'{");
+							
+							strncpy(mallocedval + strlen(mallocedval), str , slen + 1);
+							strcpy(mallocedval + strlen(mallocedval), ",");
+						}
+						strcpy(mallocedval + strlen(mallocedval) - 1, "}'");
+					}
+					else
+					{
+						str = PGTYPESinterval_itoa((Interval *)(var->value));
 						slen = strlen (str);
 					
 						if (!(mallocedval = ECPGalloc(slen + 1, stmt->lineno)))
diff --git a/src/interfaces/ecpg/ecpglib/typename.c b/src/interfaces/ecpg/ecpglib/typename.c
index 6ae846c38128e1d8ddc97dd20e051e3e218dcd1d..684aa9cfc8a01d505879cb3f4bb8bde533ccd5da 100644
--- a/src/interfaces/ecpg/ecpglib/typename.c
+++ b/src/interfaces/ecpg/ecpglib/typename.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.2 2003/03/20 15:56:50 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.3 2003/03/27 14:29:17 meskes Exp $ */
 
 #include "postgres_fe.h"
 
@@ -53,6 +53,8 @@ ECPGtype_name(enum ECPGttype typ)
 			return "date";
 		case ECPGt_timestamp:
 			return "timestamp";
+		case ECPGt_interval:
+			return "interval";
 		default:
 			abort();
 	}
diff --git a/src/interfaces/ecpg/include/datetime.h b/src/interfaces/ecpg/include/datetime.h
index dc029e038e415c7485a4e1bad3d46e52f6cd5b6c..94ef5d28ad4ee4e81086a08cfba38ec49df953fb 100644
--- a/src/interfaces/ecpg/include/datetime.h
+++ b/src/interfaces/ecpg/include/datetime.h
@@ -1,11 +1,12 @@
 #include <pgtypes_timestamp.h>
+#include <pgtypes_interval.h>
 
 #ifndef dtime_t
 #define dtime_t Timestamp
 #endif /* dtime_t */
 
 #ifndef intrvl_t
-#define intrvl_t Timestamp
+#define intrvl_t Interval
 #endif /* intrvl_t */
 
 extern void dtcurrent (dtime_t *);
diff --git a/src/interfaces/ecpg/include/decimal.h b/src/interfaces/ecpg/include/decimal.h
index ce0eedc3d95423143c17247359fc32d5dac1315d..10c8f3b179a417c1f4fc5fc1049b40c5a4d04054 100644
--- a/src/interfaces/ecpg/include/decimal.h
+++ b/src/interfaces/ecpg/include/decimal.h
@@ -1,19 +1,19 @@
 #include <pgtypes_numeric.h>
 
 #ifndef dec_t
-#define dec_t NumericVar
+#define dec_t Numeric
 #endif /* dec_t */
 
-int decadd(dec_t *, NumericVar *, NumericVar *);
-int deccmp(dec_t *, NumericVar *);
-void deccopy(dec_t *, NumericVar *);
+int decadd(dec_t *, Numeric *, Numeric *);
+int deccmp(dec_t *, Numeric *);
+void deccopy(dec_t *, Numeric *);
 int deccvasc(char *, int, dec_t *);
 int deccvdbl(double, dec_t *);
 int deccvint(int, dec_t *);
 int deccvlong(long, dec_t *);
-int decdiv(dec_t *, NumericVar *, NumericVar *);
-int decmul(dec_t *, NumericVar *, NumericVar *);
-int decsub(dec_t *, NumericVar *, NumericVar *);
+int decdiv(dec_t *, Numeric *, Numeric *);
+int decmul(dec_t *, Numeric *, Numeric *);
+int decsub(dec_t *, Numeric *, Numeric *);
 int dectoasc(dec_t *, char *, int, int);
 int dectodbl(dec_t *, double *);
 int dectoint(dec_t *, int *);
diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h
index 2106e3dd54d3fbb39be9e3c6f4494abb9764d557..05a1a592eb452521d04d3202a97d449ed4b182a8 100644
--- a/src/interfaces/ecpg/include/ecpgerrno.h
+++ b/src/interfaces/ecpg/include/ecpgerrno.h
@@ -20,12 +20,16 @@
 #define ECPG_INT_FORMAT			-204
 #define ECPG_UINT_FORMAT		-205
 #define ECPG_FLOAT_FORMAT		-206
-#define ECPG_CONVERT_BOOL		-207
-#define ECPG_EMPTY			-208
-#define ECPG_MISSING_INDICATOR		-209
-#define ECPG_NO_ARRAY			-210
-#define ECPG_DATA_NOT_ARRAY		-211
-#define ECPG_ARRAY_INSERT		-212
+#define ECPG_NUMERIC_FORMAT		-207
+#define ECPG_INTERVAL_FORMAT		-208
+#define ECPG_DATE_FORMAT		-209
+#define ECPG_TIMESTAMP_FORMAT		-210
+#define ECPG_CONVERT_BOOL		-211
+#define ECPG_EMPTY			-212
+#define ECPG_MISSING_INDICATOR		-213
+#define ECPG_NO_ARRAY			-214
+#define ECPG_DATA_NOT_ARRAY		-215
+#define ECPG_ARRAY_INSERT		-216
 
 #define ECPG_NO_CONN			-220
 #define ECPG_NOT_CONN			-221
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 31738d421f1406f5a1deeccf08a6b3c646f17d84..32dd84aafc025ff525a53192a171e78e3afbef67 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -54,7 +54,8 @@ enum ECPGttype
 	ECPGt_descriptor,			/* sql descriptor, no C variable */
 	ECPGt_numeric,
 	ECPGt_date,
-	ECPGt_timestamp
+	ECPGt_timestamp,
+	ECPGt_interval
 };
 
  /* descriptor items */
diff --git a/src/interfaces/ecpg/include/pgtypes_interval.h b/src/interfaces/ecpg/include/pgtypes_interval.h
new file mode 100644
index 0000000000000000000000000000000000000000..b3c71b0597052d2cb25b1804527931936021a6b6
--- /dev/null
+++ b/src/interfaces/ecpg/include/pgtypes_interval.h
@@ -0,0 +1,20 @@
+#ifndef PGTYPES_INTERVAL
+#define PGTYPES_INTERVAL
+
+#include <pgtypes_timestamp.h>
+
+typedef struct
+{
+#ifdef HAVE_INT64_TIMESTAMP
+        int64           time;                   /* all time units other than months and years */
+#else
+        double          time;                   /* all time units other than months and years */
+#endif
+        long           month;                  /* months and years, after time for alignment */
+} Interval;
+
+extern Interval *PGTYPESinterval_atoi(char *, char **);
+extern char *PGTYPESinterval_itoa(Interval *);
+extern int PGTYPESinterval_copy(Interval *, Interval *);
+	
+#endif /* PGTYPES_INTERVAL */
diff --git a/src/interfaces/ecpg/include/pgtypes_numeric.h b/src/interfaces/ecpg/include/pgtypes_numeric.h
index 7ac4c1cb065c71551fd000b2d35a54407b26088e..3fe849a3ad9730e76428b24f87f857c5ef91ecd7 100644
--- a/src/interfaces/ecpg/include/pgtypes_numeric.h
+++ b/src/interfaces/ecpg/include/pgtypes_numeric.h
@@ -1,8 +1,15 @@
 #ifndef PGTYPES_NUMERIC
 #define PGTYPES_NUMERIC
 
+#define NUMERIC_POS                     0x0000
+#define NUMERIC_NEG                     0x4000
+#define NUMERIC_MAX_PRECISION           1000
+#define NUMERIC_MAX_DISPLAY_SCALE       NUMERIC_MAX_PRECISION
+#define NUMERIC_MIN_DISPLAY_SCALE       0
+#define NUMERIC_MIN_SIG_DIGITS          16
+
 typedef unsigned char NumericDigit;
-typedef struct NumericVar
+typedef struct 
 {
 		int ndigits;		/* number of digits in digits[] - can be 0! */
 		int weight;		/* weight of first digit */
@@ -11,23 +18,23 @@ typedef struct NumericVar
 		int sign;		/* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
 		NumericDigit *buf;	/* start of alloc'd space for digits[] */
 		NumericDigit *digits;	/* decimal digits */
-} NumericVar;
+} Numeric;
 
-NumericVar *PGTYPESnew(void);
-void PGTYPESnumeric_free(NumericVar *);
-NumericVar *PGTYPESnumeric_aton(char *, char **);
-char *PGTYPESnumeric_ntoa(NumericVar *);
-int PGTYPESnumeric_add(NumericVar *, NumericVar *, NumericVar *);
-int PGTYPESnumeric_sub(NumericVar *, NumericVar *, NumericVar *);
-int PGTYPESnumeric_mul(NumericVar *, NumericVar *, NumericVar *);
-int PGTYPESnumeric_div(NumericVar *, NumericVar *, NumericVar *);
-int PGTYPESnumeric_cmp(NumericVar *, NumericVar *);
-int PGTYPESnumeric_iton(signed int, NumericVar *);
-int PGTYPESnumeric_lton(signed long int, NumericVar *);
-int PGTYPESnumeric_copy(NumericVar *, NumericVar *);
-int PGTYPESnumeric_dton(double, NumericVar *);
-int PGTYPESnumeric_ntod(NumericVar *, double *);
-int PGTYPESnumeric_ntoi(NumericVar *, int *);
-int PGTYPESnumeric_ntol(NumericVar *, long *);
+Numeric *PGTYPESnew(void);
+void PGTYPESnumeric_free(Numeric *);
+Numeric *PGTYPESnumeric_aton(char *, char **);
+char *PGTYPESnumeric_ntoa(Numeric *);
+int PGTYPESnumeric_add(Numeric *, Numeric *, Numeric *);
+int PGTYPESnumeric_sub(Numeric *, Numeric *, Numeric *);
+int PGTYPESnumeric_mul(Numeric *, Numeric *, Numeric *);
+int PGTYPESnumeric_div(Numeric *, Numeric *, Numeric *);
+int PGTYPESnumeric_cmp(Numeric *, Numeric *);
+int PGTYPESnumeric_iton(signed int, Numeric *);
+int PGTYPESnumeric_lton(signed long int, Numeric *);
+int PGTYPESnumeric_copy(Numeric *, Numeric *);
+int PGTYPESnumeric_dton(double, Numeric *);
+int PGTYPESnumeric_ntod(Numeric *, double *);
+int PGTYPESnumeric_ntoi(Numeric *, int *);
+int PGTYPESnumeric_ntol(Numeric *, long *);
 
 #endif /* PGTYPES_NUMERIC */
diff --git a/src/interfaces/ecpg/pgtypeslib/Makefile b/src/interfaces/ecpg/pgtypeslib/Makefile
index ae691c7d21d632379e96249b14881c91f6e6e0c9..97d8cbb24ea91f69af2a44423df06de73d825287 100644
--- a/src/interfaces/ecpg/pgtypeslib/Makefile
+++ b/src/interfaces/ecpg/pgtypeslib/Makefile
@@ -4,7 +4,7 @@
 #
 # Copyright (c) 1994, Regents of the University of California
 #
-# $Header: /cvsroot/pgsql/src/interfaces/ecpg/pgtypeslib/Makefile,v 1.2 2003/03/20 15:56:50 meskes Exp $
+# $Header: /cvsroot/pgsql/src/interfaces/ecpg/pgtypeslib/Makefile,v 1.3 2003/03/27 14:29:17 meskes Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -16,7 +16,7 @@ NAME= pgtypes
 SO_MAJOR_VERSION= 1
 SO_MINOR_VERSION= 0.0
 
-override CPPFLAGS := -g -I$(top_srcdir)/src/interfaces/ecpg/include -I$(top_srcdir)/src/include/utils $(CPPFLAGS)
+override CPPFLAGS := -O1 -g -I$(top_srcdir)/src/interfaces/ecpg/include -I$(top_srcdir)/src/include/utils $(CPPFLAGS)
 
 OBJS= numeric.o datetime.o common.o dt_common.o timestamp.o
 
diff --git a/src/interfaces/ecpg/pgtypeslib/common.c b/src/interfaces/ecpg/pgtypeslib/common.c
index 719b18b0290697b1e3d00bb83f02ac51e1e39191..b91bedcd581f536c03f19c3eb42b567426165896 100644
--- a/src/interfaces/ecpg/pgtypeslib/common.c
+++ b/src/interfaces/ecpg/pgtypeslib/common.c
@@ -1,5 +1,4 @@
 #include <errno.h>
-#include <stdlib.h>
 
 #include "extern.h"
 	
diff --git a/src/interfaces/ecpg/pgtypeslib/numeric.c b/src/interfaces/ecpg/pgtypeslib/numeric.c
index 1dc2e1b63810b160fd861f442096b902a8a1d59d..9b0a1f2e14e9b0b7c62bf80c5e026287ee00cfe1 100644
--- a/src/interfaces/ecpg/pgtypeslib/numeric.c
+++ b/src/interfaces/ecpg/pgtypeslib/numeric.c
@@ -8,14 +8,13 @@
 
 #include "c.h"
 #include "extern.h"
-#include "numeric.h"
 #include "pgtypes_error.h"
 #include "decimal.h"
 
 #define Max(x, y)               ((x) > (y) ? (x) : (y))
 #define Min(x, y)               ((x) < (y) ? (x) : (y))
 
-#define init_var(v)             memset(v,0,sizeof(NumericVar))
+#define init_var(v)             memset(v,0,sizeof(Numeric))
 
 #define digitbuf_alloc(size) ((NumericDigit *) pgtypes_alloc(size))
 #define digitbuf_free(buf)      \
@@ -35,7 +34,7 @@
  * ----------
  */
 static int 
-apply_typmod(NumericVar *var, long typmod)
+apply_typmod(Numeric *var, long typmod)
 {
 	int			precision;
 	int			scale;
@@ -115,7 +114,7 @@ apply_typmod(NumericVar *var, long typmod)
  * ----------
  */
 static int
-alloc_var(NumericVar *var, int ndigits)
+alloc_var(Numeric *var, int ndigits)
 {
 	digitbuf_free(var->buf);
 	var->buf = digitbuf_alloc(ndigits + 1);
@@ -127,12 +126,12 @@ alloc_var(NumericVar *var, int ndigits)
 	return 0;
 }
 
-NumericVar * 
+Numeric * 
 PGTYPESnew(void)
 {
-	NumericVar *var;
+	Numeric *var;
 		
-	if ((var = (NumericVar *)pgtypes_alloc(sizeof(NumericVar))) == NULL)
+	if ((var = (Numeric *)pgtypes_alloc(sizeof(Numeric))) == NULL)
 		return NULL;
 
 	if (alloc_var(var, 0) < 0) {
@@ -149,7 +148,7 @@ PGTYPESnew(void)
  * ----------
  */
 static int 
-set_var_from_str(char *str, char **ptr, NumericVar *dest)
+set_var_from_str(char *str, char **ptr, Numeric *dest)
 {
 	bool	have_dp = FALSE;
 	int	i = 0;
@@ -278,7 +277,7 @@ set_var_from_str(char *str, char **ptr, NumericVar *dest)
  * ----------
  */
 static char *
-get_str_from_var(NumericVar *var, int dscale)
+get_str_from_var(Numeric *var, int dscale)
 {
 	char	   *str;
 	char	   *cp;
@@ -370,10 +369,10 @@ get_str_from_var(NumericVar *var, int dscale)
  *	Input function for numeric data type
  * ----------
  */
-NumericVar *
+Numeric *
 PGTYPESnumeric_aton(char *str, char **endptr)
 {
-	NumericVar *value = (NumericVar *)pgtypes_alloc(sizeof(NumericVar));
+	Numeric *value = (Numeric *)pgtypes_alloc(sizeof(Numeric));
 	int ret;
 #if 0
 	long typmod = -1;
@@ -403,7 +402,7 @@ PGTYPESnumeric_aton(char *str, char **endptr)
  * ----------
  */
 char *
-PGTYPESnumeric_ntoa(NumericVar *num)
+PGTYPESnumeric_ntoa(Numeric *num)
 {
 	return(get_str_from_var(num, num->dscale));
 }
@@ -416,7 +415,7 @@ PGTYPESnumeric_ntoa(NumericVar *num)
  * ----------
  */
 static void
-zero_var(NumericVar *var)
+zero_var(Numeric *var)
 {
 	digitbuf_free(var->buf);
 	var->buf = NULL;
@@ -427,7 +426,7 @@ zero_var(NumericVar *var)
 }
 
 void  
-PGTYPESnumeric_free(NumericVar *var)
+PGTYPESnumeric_free(Numeric *var)
 {
 	digitbuf_free(var->buf);
 	free(var);
@@ -443,7 +442,7 @@ PGTYPESnumeric_free(NumericVar *var)
  * ----------
  */
 static int
-cmp_abs(NumericVar *var1, NumericVar *var2)
+cmp_abs(Numeric *var1, Numeric *var2)
 {
 	int			i1 = 0;
 	int			i2 = 0;
@@ -501,7 +500,7 @@ cmp_abs(NumericVar *var1, NumericVar *var2)
  * ----------
  */
 static int
-add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result)
+add_abs(Numeric *var1, Numeric *var2, Numeric *result)
 {
 	NumericDigit *res_buf;
 	NumericDigit *res_digits;
@@ -589,7 +588,7 @@ add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result)
  * ----------
  */
 static int
-sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result)
+sub_abs(Numeric *var1, Numeric *var2, Numeric *result)
 {
 	NumericDigit *res_buf;
 	NumericDigit *res_digits;
@@ -673,7 +672,7 @@ sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result)
  * ----------
  */
 int
-PGTYPESnumeric_add(NumericVar *var1, NumericVar *var2, NumericVar *result)
+PGTYPESnumeric_add(Numeric *var1, Numeric *var2, Numeric *result)
 {
 	/*
 	 * Decide on the signs of the two variables what to do
@@ -802,7 +801,7 @@ PGTYPESnumeric_add(NumericVar *var1, NumericVar *var2, NumericVar *result)
  * ----------
  */
 int
-PGTYPESnumeric_sub(NumericVar *var1, NumericVar *var2, NumericVar *result)
+PGTYPESnumeric_sub(Numeric *var1, Numeric *var2, Numeric *result)
 {
 	/*
 	 * Decide on the signs of the two variables what to do
@@ -933,7 +932,7 @@ PGTYPESnumeric_sub(NumericVar *var1, NumericVar *var2, NumericVar *result)
  * ----------
  */
 int
-PGTYPESnumeric_mul(NumericVar *var1, NumericVar *var2, NumericVar *result)
+PGTYPESnumeric_mul(Numeric *var1, Numeric *var2, Numeric *result)
 {
 	NumericDigit *res_buf;
 	NumericDigit *res_digits;
@@ -1024,7 +1023,7 @@ PGTYPESnumeric_mul(NumericVar *var1, NumericVar *var2, NumericVar *result)
  * Note that this must be called before div_var.
  */
 static int
-select_div_scale(NumericVar *var1, NumericVar *var2, int *rscale)
+select_div_scale(Numeric *var1, Numeric *var2, int *rscale)
 {
 	int			weight1,
 				weight2,
@@ -1091,14 +1090,14 @@ select_div_scale(NumericVar *var1, NumericVar *var2, int *rscale)
 }
 
 int
-PGTYPESnumeric_div(NumericVar *var1, NumericVar *var2, NumericVar *result)
+PGTYPESnumeric_div(Numeric *var1, Numeric *var2, Numeric *result)
 {
 	NumericDigit *res_digits;
 	int			res_ndigits;
 	int			res_sign;
 	int			res_weight;
-	NumericVar	dividend;
-	NumericVar	divisor[10];
+	Numeric	dividend;
+	Numeric	divisor[10];
 	int			ndigits_tmp;
 	int			weight_tmp;
 	int			rscale_tmp;
@@ -1214,7 +1213,7 @@ PGTYPESnumeric_div(NumericVar *var1, NumericVar *var2, NumericVar *result)
 				int			i;
 				long		sum = 0;
 
-				memcpy(&divisor[guess], &divisor[1], sizeof(NumericVar));
+				memcpy(&divisor[guess], &divisor[1], sizeof(Numeric));
 				divisor[guess].buf = digitbuf_alloc(divisor[guess].ndigits);
 				divisor[guess].digits = divisor[guess].buf;
 				for (i = divisor[1].ndigits - 1; i >= 0; i--)
@@ -1297,7 +1296,7 @@ PGTYPESnumeric_div(NumericVar *var1, NumericVar *var2, NumericVar *result)
 
 
 int
-PGTYPESnumeric_cmp(NumericVar *var1, NumericVar *var2) {
+PGTYPESnumeric_cmp(Numeric *var1, Numeric *var2) {
 
 	/* use cmp_abs function to calculate the result */
 
@@ -1327,14 +1326,14 @@ PGTYPESnumeric_cmp(NumericVar *var1, NumericVar *var2) {
 }
 
 int
-PGTYPESnumeric_iton(signed int int_val, NumericVar *var) {
+PGTYPESnumeric_iton(signed int int_val, Numeric *var) {
 	/* implicit conversion */
 	signed long int long_int = int_val;
 	return PGTYPESnumeric_lton(long_int, var);
 }
 
 int
-PGTYPESnumeric_lton(signed long int long_val, NumericVar *var) {
+PGTYPESnumeric_lton(signed long int long_val, Numeric *var) {
 	/* calculate the size of the long int number */
 	/* a number n needs log_10 n digits */
 	/* however we multiply by 10 each time and compare instead of
@@ -1386,7 +1385,7 @@ PGTYPESnumeric_lton(signed long int long_val, NumericVar *var) {
 }
 
 int
-PGTYPESnumeric_copy(NumericVar *src, NumericVar *dst) {
+PGTYPESnumeric_copy(Numeric *src, Numeric *dst) {
 	int i;
 
 	zero_var(dst);
@@ -1407,10 +1406,10 @@ PGTYPESnumeric_copy(NumericVar *src, NumericVar *dst) {
 }
 
 int
-PGTYPESnumeric_dton(double d, NumericVar *dst)
+PGTYPESnumeric_dton(double d, Numeric *dst)
 {
 	char buffer[100];
-	NumericVar *tmp;
+	Numeric *tmp;
 	
 	if (sprintf(buffer, "%f", d) == 0)
 		return -1;
@@ -1424,7 +1423,7 @@ PGTYPESnumeric_dton(double d, NumericVar *dst)
 }
 
 static int
-numericvar_to_double_no_overflow(NumericVar *var, double *dp)
+numericvar_to_double_no_overflow(Numeric *var, double *dp)
 {
 	char	   *tmp;
 	double		val;
@@ -1448,7 +1447,7 @@ numericvar_to_double_no_overflow(NumericVar *var, double *dp)
 }
 
 int
-PGTYPESnumeric_ntod(NumericVar* nv, double* dp) {
+PGTYPESnumeric_ntod(Numeric* nv, double* dp) {
 	double tmp;
 	int i;
 	
@@ -1459,7 +1458,7 @@ PGTYPESnumeric_ntod(NumericVar* nv, double* dp) {
 }
 
 int
-PGTYPESnumeric_ntoi(NumericVar* nv, int* ip) {
+PGTYPESnumeric_ntoi(Numeric* nv, int* ip) {
 	long l;
 	int i;
 	
@@ -1476,7 +1475,7 @@ PGTYPESnumeric_ntoi(NumericVar* nv, int* ip) {
 }
 
 int
-PGTYPESnumeric_ntol(NumericVar* nv, long* lp) {
+PGTYPESnumeric_ntol(Numeric* nv, long* lp) {
 	int i;
 	long l = 0;
 
@@ -1502,7 +1501,7 @@ PGTYPESnumeric_ntol(NumericVar* nv, long* lp) {
 
 /* Finally we need some wrappers for the INFORMIX functions */
 int
-decadd(NumericVar *arg1, NumericVar *arg2, NumericVar *sum)
+decadd(Numeric *arg1, Numeric *arg2, Numeric *sum)
 {
 	int i = PGTYPESnumeric_add(arg1, arg2, sum);
 
@@ -1515,7 +1514,7 @@ decadd(NumericVar *arg1, NumericVar *arg2, NumericVar *sum)
 }
 
 int
-deccmp(NumericVar *arg1, NumericVar *arg2)
+deccmp(Numeric *arg1, Numeric *arg2)
 {
 	int i = PGTYPESnumeric_cmp(arg1, arg2);
 	
@@ -1524,7 +1523,7 @@ deccmp(NumericVar *arg1, NumericVar *arg2)
 }
 
 void
-deccopy(NumericVar *src, NumericVar *target)
+deccopy(Numeric *src, Numeric *target)
 {
 	PGTYPESnumeric_copy(src, target);
 }
@@ -1547,7 +1546,7 @@ strndup(char *str, int len)
 }
 
 int
-deccvasc(char *cp, int len, NumericVar *np)
+deccvasc(char *cp, int len, Numeric *np)
 {
 	char *str = strndup(cp, len); /* Numeric_in always converts the complete string */
 	int ret = 0;
@@ -1575,25 +1574,25 @@ deccvasc(char *cp, int len, NumericVar *np)
 }
 
 int
-deccvdbl(double dbl, NumericVar *np)
+deccvdbl(double dbl, Numeric *np)
 {
 	return(PGTYPESnumeric_dton(dbl, np));
 }
 
 int
-deccvint(int in, NumericVar *np)
+deccvint(int in, Numeric *np)
 {
 	return(PGTYPESnumeric_iton(in, np));
 }
 
 int
-deccvlong(long lng, NumericVar *np)
+deccvlong(long lng, Numeric *np)
 {
 	return(PGTYPESnumeric_lton(lng, np));	
 }
 
 int
-decdiv(NumericVar *n1, NumericVar *n2, NumericVar *n3)
+decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
 {
 	int i = PGTYPESnumeric_div(n1, n2, n3), ret = 0;
 
@@ -1612,7 +1611,7 @@ decdiv(NumericVar *n1, NumericVar *n2, NumericVar *n3)
 }
 
 int 
-decmul(NumericVar *n1, NumericVar *n2, NumericVar *n3)
+decmul(Numeric *n1, Numeric *n2, Numeric *n3)
 {
 	int i = PGTYPESnumeric_mul(n1, n2, n3), ret = 0;
 
@@ -1629,7 +1628,7 @@ decmul(NumericVar *n1, NumericVar *n2, NumericVar *n3)
 }
 
 int
-decsub(NumericVar *n1, NumericVar *n2, NumericVar *n3)
+decsub(Numeric *n1, Numeric *n2, Numeric *n3)
 {
 	int i = PGTYPESnumeric_sub(n1, n2, n3), ret = 0;
 
@@ -1646,7 +1645,7 @@ decsub(NumericVar *n1, NumericVar *n2, NumericVar *n3)
 }
 
 int
-dectoasc(NumericVar *np, char *cp, int len, int right)
+dectoasc(Numeric *np, char *cp, int len, int right)
 {
 	char *str;
 	
@@ -1666,13 +1665,13 @@ dectoasc(NumericVar *np, char *cp, int len, int right)
 }
 
 int
-dectodbl(NumericVar *np, double *dblp)
+dectodbl(Numeric *np, double *dblp)
 {
 	return(PGTYPESnumeric_ntod(np, dblp));
 }
 
 int
-dectoint(NumericVar *np, int *ip)
+dectoint(Numeric *np, int *ip)
 {
 	int ret = PGTYPESnumeric_ntoi(np, ip);
 
@@ -1683,7 +1682,7 @@ dectoint(NumericVar *np, int *ip)
 }
 
 int
-dectolong(NumericVar *np, long *lngp)	
+dectolong(Numeric *np, long *lngp)	
 {
 	int ret = PGTYPESnumeric_ntol(np, lngp);
 
diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c
index 892092037c39027351561e24936a4573a1e9918d..bf1ca57c6ef4fc4e8569994913dcf5452fe4ab34 100644
--- a/src/interfaces/ecpg/pgtypeslib/timestamp.c
+++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c
@@ -13,6 +13,7 @@
 #include "extern.h"
 #include "pgtypes_error.h"
 #include "pgtypes_timestamp.h"
+#include "pgtypes_interval.h"
 #include "datetime.h"
 
 #ifdef HAVE_INT64_TIMESTAMP
@@ -368,7 +369,7 @@ dtcvasc (char *str, Timestamp *ts)
 }
 
 int
-dtsub (Timestamp *ts1, Timestamp *ts2, Timestamp *iv)
+dtsub (Timestamp *ts1, Timestamp *ts2, Interval *iv)
 {
 	return 0;
 }
@@ -386,8 +387,30 @@ dttofmtasc (Timestamp *ts, char *output, int str_len, char *fmtstr)
 }
 
 int
-intoasc(Timestamp *i, char *str)
+intoasc(Interval *i, char *str)
 {
 	return 0;
 }
 
+Interval *
+PGTYPESinterval_atoi(char *str, char **endptr)
+{
+	Interval	*result = NULL;
+	
+	return result;
+}
+
+char *
+PGTYPESinterval_itoa(Interval *intvl)
+{
+        char            buf[MAXDATELEN + 1];
+
+        return pgtypes_strdup(buf);
+}
+
+int 
+PGTYPESinterval_copy(Interval *intvlsrc, Interval *intrcldest)
+{
+		return 0;
+}
+
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index d1545358213d8e18f389cb2b3c0699ff25afa216..d3b61525dd82fa65695f6bb6800599392c8799bb 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.63 2003/03/18 10:46:39 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.64 2003/03/27 14:29:17 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@@ -157,7 +157,8 @@ main(int argc, char *const argv[])
 				if (strcmp(optarg, "INFORMIX") == 0)
 				{
 					compat = ECPG_COMPAT_INFORMIX;
-					add_preprocessor_define("dec_t=NumericVar");
+					add_preprocessor_define("dec_t=Numeric");
+					add_preprocessor_define("intrvl_t=Interval");
 				}
 				else
 				{
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index e926e60fbbebbf67bc9bcc40e8403bf0510457b5..3b474a40e7559ded78dbb77cb2f4518d6a4b2bd4 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.214 2003/03/21 14:17:47 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.215 2003/03/27 14:29:17 meskes Exp $ */
 
 /* Copyright comment */
 %{
@@ -4258,8 +4258,8 @@ single_vt_type: common_type
 			}
 			else if (strcmp($1, "interval") == 0)
 			{
-				$$.type_enum = ECPGt_timestamp;
-				$$.type_str = make_str("Timestamp");
+				$$.type_enum = ECPGt_interval;
+				$$.type_str = EMPTY;
 				$$.type_dimension = -1;
 				$$.type_index = -1;
 				$$.type_sizeof = NULL;
@@ -4526,8 +4526,8 @@ var_type:	common_type
 			}
 			else if (strcmp($1, "interval") == 0)
 			{
-				$$.type_enum = ECPGt_timestamp;
-				$$.type_str = make_str("Timestamp");
+				$$.type_enum = ECPGt_interval;
+				$$.type_str = EMPTY;
 				$$.type_dimension = -1;
 				$$.type_index = -1;
 				$$.type_sizeof = NULL;
@@ -4732,9 +4732,21 @@ variable: opt_pointer ECPGColLabelCommon opt_array_bounds opt_initializer
                                                 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
 
 					if (dimension < 0)
-						$$ = cat_str(4, mm_strdup(actual_storage[struct_level]), make_str("NumericVar"), mm_strdup($2), $4);
+						$$ = cat_str(4, mm_strdup(actual_storage[struct_level]), make_str("Numeric"), mm_strdup($2), $4);
+					else
+						$$ = cat_str(5, mm_strdup(actual_storage[struct_level]), make_str("Numeric"), mm_strdup($2), mm_strdup(dim), $4);
+					break;
+				
+				case ECPGt_interval:
+					if (dimension < 0)
+                                                type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
+                                        else
+                                                type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
+
+					if (dimension < 0)
+						$$ = cat_str(4, mm_strdup(actual_storage[struct_level]), make_str("Interval"), mm_strdup($2), $4);
 					else
-						$$ = cat_str(5, mm_strdup(actual_storage[struct_level]), make_str("NumericVar"), mm_strdup($2), mm_strdup(dim), $4);
+						$$ = cat_str(5, mm_strdup(actual_storage[struct_level]), make_str("Interval"), mm_strdup($2), mm_strdup(dim), $4);
 					break;
 					
 				default:
diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c
index c55244fb1c4cfc279f007c7a367b5e0881ea5d18..fe0c76b95728b9e9e9645fe32dc6fd6fbd31ea9a 100644
--- a/src/interfaces/ecpg/preproc/type.c
+++ b/src/interfaces/ecpg/preproc/type.c
@@ -172,6 +172,9 @@ get_type(enum ECPGttype type)
 		case ECPGt_numeric:
 			return ("ECPGt_numeric");
 			break;
+		case ECPGt_interval:
+			return ("ECPGt_interval");
+			break;
 		case ECPGt_descriptor:
 			return ("ECPGt_descriptor");
 			break;
@@ -334,7 +337,15 @@ ECPGdump_a_simple(FILE *o, const char *name, enum ECPGttype type,
 				 *  we have to use a pointer here
 				 */
 				sprintf(variable, "&(%s%s)", prefix ? prefix : "", name);
-				sprintf(offset, "sizeof(struct NumericVar)");
+				sprintf(offset, "sizeof(Numeric)");
+				break;
+			case ECPGt_interval:
+
+				/*
+				 *  we have to use a pointer here
+				 */
+				sprintf(variable, "&(%s%s)", prefix ? prefix : "", name);
+				sprintf(offset, "sizeof(Interval)");
 				break;
 			case ECPGt_date:
 
diff --git a/src/interfaces/ecpg/test/num_test.pgc b/src/interfaces/ecpg/test/num_test.pgc
index f534df5da25458103f0d40772b763a22b6199f00..42eb66d9a04cdcc6ed231a19dc029b4a1e6a1d94 100644
--- a/src/interfaces/ecpg/test/num_test.pgc
+++ b/src/interfaces/ecpg/test/num_test.pgc
@@ -1,14 +1,14 @@
 #include <stdio.h>
 #include <pgtypes_numeric.h>
+#include <decimal.h>
 
 int
 main()
 {
 	char *text="error\n";
-	NumericVar *value1, *value2, *res;
+	Numeric *value1, *value2, *res;
 	exec sql begin declare section;
 		decimal(14,7) des = {0, 0, 0, 0, 0, NULL, NULL} ;
-		numeric num;
 	exec sql end declare section;
 	double d;
 	FILE *dbgs;