diff --git a/src/interfaces/ecpg/pgtypeslib/dt.h b/src/interfaces/ecpg/pgtypeslib/dt.h
index 001e0fc4af45b1031a2167aa46f8c3839cdbc11d..e000ec4411c70ce4262c9a5c009d2a3a8de66372 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt.h
+++ b/src/interfaces/ecpg/pgtypeslib/dt.h
@@ -305,5 +305,6 @@ extern char *pgtypes_date_weekdays_short[];
 extern char *pgtypes_date_months[];
 extern char *months[];
 extern char *days[];
+extern int  day_tab[2][13];
 
 #endif   /* DT_H */
diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c
index ad9c8b05c30b37f228f09baf334e159d8379bb56..dfd7c663fe3fe0145c79e112c645bb1818ca950b 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt_common.c
+++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c
@@ -8,7 +8,7 @@
 #include "dt.h"
 #include "pgtypes_timestamp.h"
 
-static int	day_tab[2][13] = {
+int	day_tab[2][13] = {
 	{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}};
 
diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c
index 9f4bf782cd008009e1f375347ca2531f97c75eb9..e6062525ab430b6103e74774a194a81b8187ca85 100644
--- a/src/interfaces/ecpg/pgtypeslib/timestamp.c
+++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c
@@ -12,6 +12,7 @@
 #include "pgtypes_timestamp.h"
 #include "pgtypes_date.h"
 
+
 int PGTYPEStimestamp_defmt_scan(char **, char *, timestamp *, int *, int *, int *,
 							int *, int *, int *, int *);
 
@@ -844,3 +845,87 @@ PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d)
 	free(mfmt);
 	return i;
 }
+
+/*
+* add an interval to a time stamp
+*
+*   *tout = tin + span
+*
+*    returns 0 if successful
+*    returns -1 if it fails
+*
+*/
+                                                                                                               
+int
+PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout)
+{
+                                                                                                               
+                                                                                                               
+    if (TIMESTAMP_NOT_FINITE(*tin))
+        *tout = *tin;
+                                                                                                               
+                                                                                                               
+    else
+    {
+        if (span->month != 0)
+        {
+            struct tm tt,
+                  *tm = &tt;
+            fsec_t          fsec;
+                                                                                                               
+                                                                                                               
+            if (timestamp2tm(*tin, NULL, tm, &fsec, NULL) !=0)
+                return -1;
+            tm->tm_mon += span->month;
+            if (tm->tm_mon > 12)
+            {
+                tm->tm_year += ((tm->tm_mon - 1) / 12);
+                tm->tm_mon = (((tm->tm_mon - 1) % 12) + 1);
+            }
+            else if (tm->tm_mon < 1)
+            {
+                tm->tm_year += ((tm->tm_mon / 12) - 1);
+                tm->tm_mon = ((tm->tm_mon % 12) + 12);
+            }
+                                                                                                               
+                                                                                                               
+            /* adjust for end of month boundary problems... */
+            if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])
+                tm->tm_mday = (day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]);
+                                                                                                               
+                                                                                                               
+                if (tm2timestamp(tm, fsec, NULL, tin) !=0)
+                    return -1;
+          }
+                                                                                                               
+                                                                                                               
+          *tin +=span->time;
+          *tout = *tin;
+    }
+    return 0;
+                                                                                                               
+}
+                                                                                                               
+                                                                                                               
+/*
+* subtract an interval from a time stamp
+*
+*   *tout = tin - span
+*
+*    returns 0 if successful
+*    returns -1 if it fails
+*
+*/
+                                                                                                               
+int
+PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout)
+{
+    interval        tspan;
+                                                                                                               
+    tspan.month = -span->month;
+    tspan.time = -span->time;
+                                                                                                               
+                                                                                                               
+    return PGTYPEStimestamp_add_interval(tin, &tspan, tout );
+}
+
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 9fc31239c9b2738bf80f53b2c545f76e9acd1666..681222806cd74ad026c19cd74d1c52a0bf5d3b9b 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.132 2004/08/29 04:13:11 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.133 2004/12/23 10:46:10 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -611,9 +611,9 @@ cppline			{space}*#(.*\\{space})+.*
 								yb->buffer =  YY_CURRENT_BUFFER;
 								yb->lineno = yylineno;
 								yb->filename = mm_strdup(input_filename);
-								ptr->used = yb->next = yy_buffer;
+								yb->next = yy_buffer;
 								
-								yy_buffer = yb;
+								ptr->used = yy_buffer = yb;
 
 								yy_scan_string(ptr->new);
 								break;
@@ -712,9 +712,9 @@ cppline			{space}*#(.*\\{space})+.*
 									yb->buffer =  YY_CURRENT_BUFFER;
 									yb->lineno = yylineno;
 									yb->filename = mm_strdup(input_filename);
-									ptr->used = yb->next = yy_buffer;
+									yb->next = yy_buffer;
 
-									yy_buffer = yb;
+									ptr->used = yy_buffer = yb;
 
 									yy_scan_string(ptr->new);
 									break;