diff --git a/src/interfaces/ecpg/pgtypeslib/dt.h b/src/interfaces/ecpg/pgtypeslib/dt.h index 001e0fc4af..e000ec4411 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 ad9c8b05c3..dfd7c663fe 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 9f4bf782cd..e6062525ab 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 9fc31239c9..681222806c 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;