diff options
| author | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-02-16 17:26:26 +0000 |
|---|---|---|
| committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-02-16 17:26:26 +0000 |
| commit | 41f1f5b76ad8e177a2b19116cbf41384f93f3851 (patch) | |
| tree | 2165e6c833bc96f32e2d2b45c1d40b71e9c82ab7 /src/include/utils | |
| parent | c97672b08325d722cf5807ffede9fd31ee070f72 (diff) | |
| download | postgresql-41f1f5b76ad8e177a2b19116cbf41384f93f3851.tar.gz | |
Implement "date/time grand unification".
Transform datetime and timespan into timestamp and interval.
Deprecate datetime and timespan, though translate to new types in gram.y.
Transform all datetime and timespan catalog entries into new types.
Make "INTERVAL" reserved word allowed as a column identifier in gram.y.
Remove dt.h, dt.c files, and retarget datetime.h, datetime.c as utility
routines for all date/time types.
date.{h,c} now deals with date, time types.
timestamp.{h,c} now deals with timestamp, interval types.
nabstime.{h,c} now deals with abstime, reltime, tinterval types.
Make NUMERIC a known native type for purposes of type coersion. Not tested.
Diffstat (limited to 'src/include/utils')
| -rw-r--r-- | src/include/utils/builtins.h | 98 | ||||
| -rw-r--r-- | src/include/utils/date.h | 52 | ||||
| -rw-r--r-- | src/include/utils/datetime.h | 425 | ||||
| -rw-r--r-- | src/include/utils/dt.h | 378 | ||||
| -rw-r--r-- | src/include/utils/formatting.h | 22 | ||||
| -rw-r--r-- | src/include/utils/nabstime.h | 49 | ||||
| -rw-r--r-- | src/include/utils/timestamp.h | 208 |
7 files changed, 742 insertions, 490 deletions
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 7f9dcc6c46..df8dad8dc3 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: builtins.h,v 1.101 2000/02/15 20:49:27 tgl Exp $ + * $Id: builtins.h,v 1.102 2000/02/16 17:26:25 thomas Exp $ * * NOTES * This should normally only be included by fmgr.h. @@ -27,12 +27,14 @@ #include "nodes/relation.h" /* for amcostestimate parameters */ #include "storage/itemptr.h" #include "utils/array.h" -#include "utils/datetime.h" -#include "utils/geo_decls.h" #include "utils/inet.h" #include "utils/int8.h" -#include "utils/nabstime.h" +#include "utils/geo_decls.h" #include "utils/numeric.h" +#include "utils/datetime.h" +#include "utils/timestamp.h" +#include "utils/nabstime.h" +#include "utils/date.h" /* * Defined in adt/ @@ -204,46 +206,6 @@ extern int32 pqtest(struct varlena * vlena); /* arrayfuncs.c */ -/* date.c */ -extern RelativeTime reltimein(char *timestring); -extern char *reltimeout(RelativeTime timevalue); -extern TimeInterval tintervalin(char *intervalstr); -extern char *tintervalout(TimeInterval interval); -extern RelativeTime timespan_reltime(TimeSpan *timespan); -extern TimeSpan *reltime_timespan(RelativeTime reltime); -extern TimeInterval mktinterval(AbsoluteTime t1, AbsoluteTime t2); -extern AbsoluteTime timepl(AbsoluteTime t1, RelativeTime t2); -extern AbsoluteTime timemi(AbsoluteTime t1, RelativeTime t2); - -/* extern RelativeTime abstimemi(AbsoluteTime t1, AbsoluteTime t2); static*/ -extern int ininterval(AbsoluteTime t, TimeInterval interval); -extern RelativeTime intervalrel(TimeInterval interval); -extern AbsoluteTime timenow(void); -extern bool reltimeeq(RelativeTime t1, RelativeTime t2); -extern bool reltimene(RelativeTime t1, RelativeTime t2); -extern bool reltimelt(RelativeTime t1, RelativeTime t2); -extern bool reltimegt(RelativeTime t1, RelativeTime t2); -extern bool reltimele(RelativeTime t1, RelativeTime t2); -extern bool reltimege(RelativeTime t1, RelativeTime t2); -extern bool intervalsame(TimeInterval i1, TimeInterval i2); -extern bool intervaleq(TimeInterval i1, TimeInterval i2); -extern bool intervalne(TimeInterval i1, TimeInterval i2); -extern bool intervallt(TimeInterval i1, TimeInterval i2); -extern bool intervalgt(TimeInterval i1, TimeInterval i2); -extern bool intervalle(TimeInterval i1, TimeInterval i2); -extern bool intervalge(TimeInterval i1, TimeInterval i2); -extern bool intervalleneq(TimeInterval i, RelativeTime t); -extern bool intervallenne(TimeInterval i, RelativeTime t); -extern bool intervallenlt(TimeInterval i, RelativeTime t); -extern bool intervallengt(TimeInterval i, RelativeTime t); -extern bool intervallenle(TimeInterval i, RelativeTime t); -extern bool intervallenge(TimeInterval i, RelativeTime t); -extern bool intervalct(TimeInterval i1, TimeInterval i2); -extern bool intervalov(TimeInterval i1, TimeInterval i2); -extern AbsoluteTime intervalstart(TimeInterval i); -extern AbsoluteTime intervalend(TimeInterval i); -extern text *timeofday(void); - /* filename.c */ extern char *filename_in(char *file); extern char *filename_out(char *s); @@ -326,9 +288,6 @@ extern bool float84le(float64 arg1, float32 arg2); extern bool float84gt(float64 arg1, float32 arg2); extern bool float84ge(float64 arg1, float32 arg2); -/* geo_ops.c, geo_selfuncs.c */ -extern double *box_area(BOX *box); - /* misc.c */ extern bool nullvalue(Datum value, bool *isNull); extern bool nonnullvalue(Datum value, bool *isNull); @@ -432,19 +391,6 @@ extern ItemPointer text_tid(const text *); extern ItemPointer currtid_byreloid(Oid relOid, ItemPointer); extern ItemPointer currtid_byrelname(const text* relName, ItemPointer); -/* timestamp.c */ -extern time_t timestamp_in(const char *timestamp_str); -extern char *timestamp_out(time_t timestamp); -extern time_t now(void); -bool timestampeq(time_t t1, time_t t2); -bool timestampne(time_t t1, time_t t2); -bool timestamplt(time_t t1, time_t t2); -bool timestampgt(time_t t1, time_t t2); -bool timestample(time_t t1, time_t t2); -bool timestampge(time_t t1, time_t t2); -DateTime *timestamp_datetime(time_t timestamp); -time_t datetime_timestamp(DateTime *datetime); - /* varchar.c */ extern char *bpcharin(char *s, int dummy, int32 atttypmod); extern char *bpcharout(char *s); @@ -508,38 +454,6 @@ extern int32 byteaGetBit(struct varlena * v, int32 n); extern struct varlena *byteaSetByte(struct varlena * v, int32 n, int32 newByte); extern struct varlena *byteaSetBit(struct varlena * v, int32 n, int32 newBit); -/* datetime.c */ -extern DateADT date_in(char *datestr); -extern char *date_out(DateADT dateVal); -extern bool date_eq(DateADT dateVal1, DateADT dateVal2); -extern bool date_ne(DateADT dateVal1, DateADT dateVal2); -extern bool date_lt(DateADT dateVal1, DateADT dateVal2); -extern bool date_le(DateADT dateVal1, DateADT dateVal2); -extern bool date_gt(DateADT dateVal1, DateADT dateVal2); -extern bool date_ge(DateADT dateVal1, DateADT dateVal2); -extern int date_cmp(DateADT dateVal1, DateADT dateVal2); -extern DateADT date_larger(DateADT dateVal1, DateADT dateVal2); -extern DateADT date_smaller(DateADT dateVal1, DateADT dateVal2); -extern int32 date_mi(DateADT dateVal1, DateADT dateVal2); -extern DateADT date_pli(DateADT dateVal, int32 days); -extern DateADT date_mii(DateADT dateVal, int32 days); -extern DateTime *date_datetime(DateADT date); -extern DateADT datetime_date(DateTime *datetime); -extern DateTime *datetime_datetime(DateADT date, TimeADT *time); -extern DateADT abstime_date(AbsoluteTime abstime); - -extern TimeADT *time_in(char *timestr); -extern char *time_out(TimeADT *time); -extern bool time_eq(TimeADT *time1, TimeADT *time2); -extern bool time_ne(TimeADT *time1, TimeADT *time2); -extern bool time_lt(TimeADT *time1, TimeADT *time2); -extern bool time_le(TimeADT *time1, TimeADT *time2); -extern bool time_gt(TimeADT *time1, TimeADT *time2); -extern bool time_ge(TimeADT *time1, TimeADT *time2); -extern int time_cmp(TimeADT *time1, TimeADT *time2); -extern TimeADT *datetime_time(DateTime *datetime); -extern int32 int4reltime(int32 timevalue); - /* like.c */ extern bool namelike(NameData *n, struct varlena * p); extern bool namenlike(NameData *s, struct varlena * p); diff --git a/src/include/utils/date.h b/src/include/utils/date.h new file mode 100644 index 0000000000..003ee2e026 --- /dev/null +++ b/src/include/utils/date.h @@ -0,0 +1,52 @@ +/*------------------------------------------------------------------------- + * + * date.h + * Definitions for the SQL92 "date" and "time" types. + * + * + * Portions Copyright (c) 1996-2000, PostgreSQL, Inc + * Portions Copyright (c) 1994, Regents of the University of California + * + * $Id: date.h,v 1.1 2000/02/16 17:26:26 thomas Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef DATE_H +#define DATE_H + +typedef int32 DateADT; + +typedef float8 TimeADT; + +/* date.c */ +extern DateADT date_in(char *datestr); +extern char *date_out(DateADT dateVal); +extern bool date_eq(DateADT dateVal1, DateADT dateVal2); +extern bool date_ne(DateADT dateVal1, DateADT dateVal2); +extern bool date_lt(DateADT dateVal1, DateADT dateVal2); +extern bool date_le(DateADT dateVal1, DateADT dateVal2); +extern bool date_gt(DateADT dateVal1, DateADT dateVal2); +extern bool date_ge(DateADT dateVal1, DateADT dateVal2); +extern int date_cmp(DateADT dateVal1, DateADT dateVal2); +extern DateADT date_larger(DateADT dateVal1, DateADT dateVal2); +extern DateADT date_smaller(DateADT dateVal1, DateADT dateVal2); +extern int32 date_mi(DateADT dateVal1, DateADT dateVal2); +extern DateADT date_pli(DateADT dateVal, int32 days); +extern DateADT date_mii(DateADT dateVal, int32 days); +extern Timestamp *date_timestamp(DateADT date); +extern DateADT timestamp_date(Timestamp *timestamp); +extern Timestamp *datetime_timestamp(DateADT date, TimeADT *time); +extern DateADT abstime_date(AbsoluteTime abstime); + +extern TimeADT *time_in(char *timestr); +extern char *time_out(TimeADT *time); +extern bool time_eq(TimeADT *time1, TimeADT *time2); +extern bool time_ne(TimeADT *time1, TimeADT *time2); +extern bool time_lt(TimeADT *time1, TimeADT *time2); +extern bool time_le(TimeADT *time1, TimeADT *time2); +extern bool time_gt(TimeADT *time1, TimeADT *time2); +extern bool time_ge(TimeADT *time1, TimeADT *time2); +extern int time_cmp(TimeADT *time1, TimeADT *time2); +extern TimeADT *timestamp_time(Timestamp *timestamp); + +#endif /* DATE_H */ diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index 2a97f5e0dd..3df9ddf19f 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -1,21 +1,438 @@ /*------------------------------------------------------------------------- * * datetime.h - * Definitions for the datetime + * Definitions for the date/time and other date/time support code. + * The support code is shared with other date data types, + * including abstime, reltime, date, and time. * * * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: datetime.h,v 1.9 2000/01/26 05:58:37 momjian Exp $ + * $Id: datetime.h,v 1.10 2000/02/16 17:26:26 thomas Exp $ * *------------------------------------------------------------------------- */ #ifndef DATETIME_H #define DATETIME_H -typedef int32 DateADT; +#include <time.h> +#include <math.h> +#include <limits.h> +#include "utils/timestamp.h" + +#if 0 + + +/* + * Timestamp represents absolute time. + * TimeSpan represents delta time. Keep track of months (and years) + * separately since the elapsed time spanned is unknown until instantiated + * relative to an absolute time. + * + * Note that Postgres uses "time interval" to mean a bounded interval, + * consisting of a beginning and ending time, not a time span - thomas 97/03/20 + */ + +typedef double Timestamp; + +typedef struct +{ + double time; /* all time units other than months and + * years */ + int4 month; /* months and years, after time for + * alignment */ +} TimeSpan; + + +#endif + + +/* ---------------------------------------------------------------- + * time types + support macros + * + * String definitions for standard time quantities. + * + * These strings are the defaults used to form output time strings. + * Other alternate forms are hardcoded into token tables in datetime.c. + * ---------------------------------------------------------------- + */ + +#define DAGO "ago" +#define DCURRENT "current" +#define EPOCH "epoch" +#define INVALID "invalid" +#define EARLY "-infinity" +#define LATE "infinity" +#define NOW "now" +#define TODAY "today" +#define TOMORROW "tomorrow" +#define YESTERDAY "yesterday" +#define ZULU "zulu" + +#define DMICROSEC "usecond" +#define DMILLISEC "msecond" +#define DSECOND "second" +#define DMINUTE "minute" +#define DHOUR "hour" +#define DDAY "day" +#define DWEEK "week" +#define DMONTH "month" +#define DQUARTER "quarter" +#define DYEAR "year" +#define DDECADE "decade" +#define DCENTURY "century" +#define DMILLENIUM "millenium" +#define DA_D "ad" +#define DB_C "bc" +#define DTIMEZONE "timezone" + +/* + * Fundamental time field definitions for parsing. + * + * Meridian: am, pm, or 24-hour style. + * Millenium: ad, bc + */ + +#define AM 0 +#define PM 1 +#define HR24 2 + +#define AD 0 +#define BC 1 + +/* + * Fields for time decoding. + * Can't have more of these than there are bits in an unsigned int + * since these are turned into bit masks during parsing and decoding. + */ + +#define RESERV 0 +#define MONTH 1 +#define YEAR 2 +#define DAY 3 +#define TIMES 4 /* not used - thomas 1997-07-14 */ +#define TZ 5 +#define DTZ 6 +#define DTZMOD 7 +#define IGNORE 8 +#define AMPM 9 +#define HOUR 10 +#define MINUTE 11 +#define SECOND 12 +#define DOY 13 +#define DOW 14 +#define UNITS 15 +#define ADBC 16 +/* these are only for relative dates */ +#define AGO 17 +#define ABS_BEFORE 18 +#define ABS_AFTER 19 + +/* + * Token field definitions for time parsing and decoding. + * These need to fit into the datetkn table type. + * At the moment, that means keep them within [-127,127]. + * These are also used for bit masks in DecodeDateDelta() + * so actually restrict them to within [0,31] for now. + * - thomas 97/06/19 + * Not all of these fields are used for masks in DecodeDateDelta + * so allow some larger than 31. - thomas 1997-11-17 + */ + +#define DTK_NUMBER 0 +#define DTK_STRING 1 + +#define DTK_DATE 2 +#define DTK_TIME 3 +#define DTK_TZ 4 +#define DTK_AGO 5 + +#define DTK_SPECIAL 6 +#define DTK_INVALID 7 +#define DTK_CURRENT 8 +#define DTK_EARLY 9 +#define DTK_LATE 10 +#define DTK_EPOCH 11 +#define DTK_NOW 12 +#define DTK_YESTERDAY 13 +#define DTK_TODAY 14 +#define DTK_TOMORROW 15 +#define DTK_ZULU 16 + +#define DTK_DELTA 17 +#define DTK_SECOND 18 +#define DTK_MINUTE 19 +#define DTK_HOUR 20 +#define DTK_DAY 21 +#define DTK_WEEK 22 +#define DTK_MONTH 23 +#define DTK_QUARTER 24 +#define DTK_YEAR 25 +#define DTK_DECADE 26 +#define DTK_CENTURY 27 +#define DTK_MILLENIUM 28 +#define DTK_MILLISEC 29 +#define DTK_MICROSEC 30 + +#define DTK_DOW 32 +#define DTK_DOY 33 +#define DTK_TZ_HOUR 34 +#define DTK_TZ_MINUTE 35 + +/* + * Bit mask definitions for time parsing. + */ + +#define DTK_M(t) (0x01 << (t)) + +#define DTK_DATE_M (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY)) +#define DTK_TIME_M (DTK_M(HOUR) | DTK_M(MINUTE) | DTK_M(SECOND)) + +#define MAXDATELEN 47 /* maximum possible length of an input + * date string */ +#define MAXDATEFIELDS 25 /* maximum possible number of fields in a + * date string */ +#define TOKMAXLEN 10 /* only this many chars are stored in + * datetktbl */ + +/* keep this struct small; it gets used a lot */ +typedef struct +{ +#if defined(_AIX) + char *token; +#else + char token[TOKMAXLEN]; +#endif /* _AIX */ + char type; + char value; /* this may be unsigned, alas */ +} datetkn; + + +#if 0 + + +#ifdef NAN +#define TIMESTAMP_INVALID (NAN) +#else +#define TIMESTAMP_INVALID (DBL_MIN+DBL_MIN) +#endif +#ifdef HUGE_VAL +#define TIMESTAMP_NOBEGIN (-HUGE_VAL) +#define TIMESTAMP_NOEND (HUGE_VAL) +#else +#define TIMESTAMP_NOBEGIN (-DBL_MAX) +#define TIMESTAMP_NOEND (DBL_MAX) +#endif +#define TIMESTAMP_CURRENT (DBL_MIN) +#define TIMESTAMP_EPOCH (-DBL_MIN) + +#define TIMESTAMP_INVALID(j) {j = TIMESTAMP_INVALID;} +#ifdef NAN +#define TIMESTAMP_IS_INVALID(j) (isnan(j)) +#else +#define TIMESTAMP_IS_INVALID(j) (j == TIMESTAMP_INVALID) +#endif + +#define TIMESTAMP_NOBEGIN(j) {j = DT_NOBEGIN;} +#define TIMESTAMP_IS_NOBEGIN(j) (j == TIMESTAMP_NOBEGIN) + +#define TIMESTAMP_NOEND(j) {j = TIMESTAMP_NOEND;} +#define TIMESTAMP_IS_NOEND(j) (j == TIMESTAMP_NOEND) + +#define TIMESTAMP_CURRENT(j) {j = TIMESTAMP_CURRENT;} +#if defined(linux) && defined(__powerpc__) +extern int timestamp_is_current(double j); + +#define TIMESTAMP_IS_CURRENT(j) timestamp_is_current(j) +#else +#define TIMESTAMP_IS_CURRENT(j) (j == TIMESTAMP_CURRENT) +#endif + +#define TIMESTAMP_EPOCH(j) {j = TIMESTAMP_EPOCH;} +#if defined(linux) && defined(__powerpc__) +extern int timestamp_is_epoch(double j); + +#define TIMESTAMP_IS_EPOCH(j) timestamp_is_epoch(j) +#else +#define TIMESTAMP_IS_EPOCH(j) (j == TIMESTAMP_EPOCH) +#endif + +#define TIMESTAMP_IS_RELATIVE(j) (TIMESTAMP_IS_CURRENT(j) || TIMESTAMP_IS_EPOCH(j)) +#define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_INVALID(j) \ + || TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j)) +#define TIMESTAMP_IS_RESERVED(j) (TIMESTAMP_IS_RELATIVE(j) || TIMESTAMP_NOT_FINITE(j)) + +#define TIMESPAN_INVALID(j) {(j).time = DT_INVALID;} +#ifdef NAN +#define TIMESPAN_IS_INVALID(j) (isnan((j).time)) +#else +#define TIMESPAN_IS_INVALID(j) ((j).time == DATETIME_INVALID) +#endif +#define TIMESPAN_NOT_FINITE(j) TIMESPAN_IS_INVALID(j) + +#define TIME_PREC_INV 1000000.0 +#define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV) + + +#endif + +/* TMODULO() + * Macro to replace modf(), which is broken on some platforms. + */ +#define TMODULO(t,q,u) \ +do { \ + q = ((t < 0)? ceil(t / u): floor(t / u)); \ + if (q != 0) \ + t -= rint(q * u); \ +} while(0) + + +/* + * Date/time validation + * Include check for leap year. + */ + +extern int day_tab[2][13]; + +#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) + +/* Julian date support for date2j() and j2date() + * Set the minimum year to one greater than the year of the first valid day + * to avoid having to check year and day both. - tgl 97/05/08 + */ + +#define JULIAN_MINYEAR (-4713) +#define JULIAN_MINMONTH (11) +#define JULIAN_MINDAY (23) + +#define IS_VALID_JULIAN(y,m,d) ((y > JULIAN_MINYEAR) \ + || ((y == JULIAN_MINYEAR) && ((m > JULIAN_MINMONTH) \ + || ((m == JULIAN_MINMONTH) && (d >= JULIAN_MINDAY))))) + +#define UTIME_MINYEAR (1901) +#define UTIME_MINMONTH (12) +#define UTIME_MINDAY (14) +#define UTIME_MAXYEAR (2038) +#define UTIME_MAXMONTH (01) +#define UTIME_MAXDAY (18) + +#define IS_VALID_UTIME(y,m,d) (((y > UTIME_MINYEAR) \ + || ((y == UTIME_MINYEAR) && ((m > UTIME_MINMONTH) \ + || ((m == UTIME_MINMONTH) && (d >= UTIME_MINDAY))))) \ + && ((y < UTIME_MAXYEAR) \ + || ((y == UTIME_MAXYEAR) && ((m < UTIME_MAXMONTH) \ + || ((m == UTIME_MAXMONTH) && (d <= UTIME_MAXDAY)))))) + + +#if 0 + + +/* + * datetime.c prototypes + */ + +extern DateTime *datetime_in(char *str); +extern char *datetime_out(DateTime *dt); +extern bool datetime_eq(DateTime *dt1, DateTime *dt2); +extern bool datetime_ne(DateTime *dt1, DateTime *dt2); +extern bool datetime_lt(DateTime *dt1, DateTime *dt2); +extern bool datetime_le(DateTime *dt1, DateTime *dt2); +extern bool datetime_ge(DateTime *dt1, DateTime *dt2); +extern bool datetime_gt(DateTime *dt1, DateTime *dt2); +extern bool datetime_finite(DateTime *datetime); +extern int datetime_cmp(DateTime *dt1, DateTime *dt2); +extern DateTime *datetime_smaller(DateTime *dt1, DateTime *dt2); +extern DateTime *datetime_larger(DateTime *dt1, DateTime *dt2); + +extern TimeSpan *timespan_in(char *str); +extern char *timespan_out(TimeSpan *span); +extern bool timespan_eq(TimeSpan *span1, TimeSpan *span2); +extern bool timespan_ne(TimeSpan *span1, TimeSpan *span2); +extern bool timespan_lt(TimeSpan *span1, TimeSpan *span2); +extern bool timespan_le(TimeSpan *span1, TimeSpan *span2); +extern bool timespan_ge(TimeSpan *span1, TimeSpan *span2); +extern bool timespan_gt(TimeSpan *span1, TimeSpan *span2); +extern bool timespan_finite(TimeSpan *span); +extern int timespan_cmp(TimeSpan *span1, TimeSpan *span2); +extern TimeSpan *timespan_smaller(TimeSpan *span1, TimeSpan *span2); +extern TimeSpan *timespan_larger(TimeSpan *span1, TimeSpan *span2); + +extern text *datetime_text(DateTime *datetime); +extern DateTime *text_datetime(text *str); +extern text *timespan_text(TimeSpan *timespan); +extern TimeSpan *text_timespan(text *str); +extern DateTime *datetime_trunc(text *units, DateTime *datetime); +extern TimeSpan *timespan_trunc(text *units, TimeSpan *timespan); +extern float64 datetime_part(text *units, DateTime *datetime); +extern float64 timespan_part(text *units, TimeSpan *timespan); +extern text *datetime_zone(text *zone, DateTime *datetime); + +extern TimeSpan *timespan_um(TimeSpan *span); +extern TimeSpan *timespan_pl(TimeSpan *span1, TimeSpan *span2); +extern TimeSpan *timespan_mi(TimeSpan *span1, TimeSpan *span2); +extern TimeSpan *timespan_div(TimeSpan *span1, float8 *arg2); + +extern TimeSpan *datetime_mi(DateTime *dt1, DateTime *dt2); +extern DateTime *datetime_pl_span(DateTime *dt, TimeSpan *span); +extern DateTime *datetime_mi_span(DateTime *dt, TimeSpan *span); +extern TimeSpan *datetime_age(DateTime *dt1, DateTime *dt2); + + +#endif + + +extern void GetCurrentTime(struct tm * tm); +extern void j2date(int jd, int *year, int *month, int *day); +extern int date2j(int year, int month, int day); + +extern int ParseDateTime(char *timestr, char *lowstr, + char **field, int *ftype, + int maxfields, int *numfields); +extern int DecodeDateTime(char **field, int *ftype, + int nf, int *dtype, + struct tm * tm, double *fsec, int *tzp); + +extern int DecodeTimeOnly(char **field, int *ftype, int nf, + int *dtype, struct tm * tm, double *fsec); + +extern int DecodeDateDelta(char **field, int *ftype, + int nf, int *dtype, + struct tm * tm, double *fsec); + +extern int EncodeDateOnly(struct tm * tm, int style, char *str); +extern int EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str); +extern int EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, char *str); +extern int EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str); + +extern int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm); +extern int DecodeNumber(int flen, char *field, + int fmask, int *tmask, + struct tm * tm, double *fsec, int *is2digits); +extern int DecodeNumberField(int len, char *str, + int fmask, int *tmask, + struct tm * tm, double *fsec, int *is2digits); +extern int DecodeSpecial(int field, char *lowtoken, int *val); +extern int DecodeTime(char *str, int fmask, int *tmask, + struct tm * tm, double *fsec); +extern int DecodeTimezone(char *str, int *tzp); +extern int DecodeUnits(int field, char *lowtoken, int *val); +extern datetkn *datebsearch(char *key, datetkn *base, unsigned int nel); + +extern int j2day(int jd); + + +#if 0 + + +static int EncodeSpecialTimestamp(Timestamp dt, char *str); +static Timestamp dt2local(Timestamp dt, int timezone); +static void dt2time(Timestamp dt, int *hour, int *min, double *sec); +static int timespan2tm(TimeSpan span, struct tm * tm, float8 *fsec); +static int tm2timespan(struct tm * tm, double fsec, TimeSpan *span); + + +#endif -typedef float8 TimeADT; #endif /* DATETIME_H */ diff --git a/src/include/utils/dt.h b/src/include/utils/dt.h deleted file mode 100644 index 739c3c22ba..0000000000 --- a/src/include/utils/dt.h +++ /dev/null @@ -1,378 +0,0 @@ -/*------------------------------------------------------------------------- - * - * dt.h - * Definitions for the date/time and other date/time support code. - * The support code is shared with other date data types, - * including abstime, reltime, date, and time. - * - * - * Portions Copyright (c) 1996-2000, PostgreSQL, Inc - * Portions Copyright (c) 1994, Regents of the University of California - * - * $Id: dt.h,v 1.42 2000/01/26 05:58:37 momjian Exp $ - * - *------------------------------------------------------------------------- - */ -#ifndef DT_H -#define DT_H - -#include <time.h> -#include <math.h> -#include <limits.h> - -/* - * DateTime represents absolute time. - * TimeSpan represents delta time. Keep track of months (and years) - * separately since the elapsed time spanned is unknown until instantiated - * relative to an absolute time. - * - * Note that Postgres uses "time interval" to mean a bounded interval, - * consisting of a beginning and ending time, not a time span - thomas 97/03/20 - */ - -typedef double DateTime; - -typedef struct -{ - double time; /* all time units other than months and - * years */ - int4 month; /* months and years, after time for - * alignment */ -} TimeSpan; - - -/* ---------------------------------------------------------------- - * time types + support macros - * - * String definitions for standard time quantities. - * - * These strings are the defaults used to form output time strings. - * Other alternate forms are hardcoded into token tables in dt.c. - * ---------------------------------------------------------------- - */ - -#define DAGO "ago" -#define DCURRENT "current" -#define EPOCH "epoch" -#define INVALID "invalid" -#define EARLY "-infinity" -#define LATE "infinity" -#define NOW "now" -#define TODAY "today" -#define TOMORROW "tomorrow" -#define YESTERDAY "yesterday" -#define ZULU "zulu" - -#define DMICROSEC "usecond" -#define DMILLISEC "msecond" -#define DSECOND "second" -#define DMINUTE "minute" -#define DHOUR "hour" -#define DDAY "day" -#define DWEEK "week" -#define DMONTH "month" -#define DQUARTER "quarter" -#define DYEAR "year" -#define DDECADE "decade" -#define DCENTURY "century" -#define DMILLENIUM "millenium" -#define DA_D "ad" -#define DB_C "bc" -#define DTIMEZONE "timezone" - -/* - * Fundamental time field definitions for parsing. - * - * Meridian: am, pm, or 24-hour style. - * Millenium: ad, bc - */ - -#define AM 0 -#define PM 1 -#define HR24 2 - -#define AD 0 -#define BC 1 - -/* - * Fields for time decoding. - * Can't have more of these than there are bits in an unsigned int - * since these are turned into bit masks during parsing and decoding. - */ - -#define RESERV 0 -#define MONTH 1 -#define YEAR 2 -#define DAY 3 -#define TIMES 4 /* not used - thomas 1997-07-14 */ -#define TZ 5 -#define DTZ 6 -#define DTZMOD 7 -#define IGNORE 8 -#define AMPM 9 -#define HOUR 10 -#define MINUTE 11 -#define SECOND 12 -#define DOY 13 -#define DOW 14 -#define UNITS 15 -#define ADBC 16 -/* these are only for relative dates */ -#define AGO 17 -#define ABS_BEFORE 18 -#define ABS_AFTER 19 - -/* - * Token field definitions for time parsing and decoding. - * These need to fit into the datetkn table type. - * At the moment, that means keep them within [-127,127]. - * These are also used for bit masks in DecodeDateDelta() - * so actually restrict them to within [0,31] for now. - * - thomas 97/06/19 - * Not all of these fields are used for masks in DecodeDateDelta - * so allow some larger than 31. - thomas 1997-11-17 - */ - -#define DTK_NUMBER 0 -#define DTK_STRING 1 - -#define DTK_DATE 2 -#define DTK_TIME 3 -#define DTK_TZ 4 -#define DTK_AGO 5 - -#define DTK_SPECIAL 6 -#define DTK_INVALID 7 -#define DTK_CURRENT 8 -#define DTK_EARLY 9 -#define DTK_LATE 10 -#define DTK_EPOCH 11 -#define DTK_NOW 12 -#define DTK_YESTERDAY 13 -#define DTK_TODAY 14 -#define DTK_TOMORROW 15 -#define DTK_ZULU 16 - -#define DTK_DELTA 17 -#define DTK_SECOND 18 -#define DTK_MINUTE 19 -#define DTK_HOUR 20 -#define DTK_DAY 21 -#define DTK_WEEK 22 -#define DTK_MONTH 23 -#define DTK_QUARTER 24 -#define DTK_YEAR 25 -#define DTK_DECADE 26 -#define DTK_CENTURY 27 -#define DTK_MILLENIUM 28 -#define DTK_MILLISEC 29 -#define DTK_MICROSEC 30 - -#define DTK_DOW 32 -#define DTK_DOY 33 -#define DTK_TZ_HOUR 34 -#define DTK_TZ_MINUTE 35 - -/* - * Bit mask definitions for time parsing. - */ - -#define DTK_M(t) (0x01 << (t)) - -#define DTK_DATE_M (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY)) -#define DTK_TIME_M (DTK_M(HOUR) | DTK_M(MINUTE) | DTK_M(SECOND)) - -#define MAXDATELEN 47 /* maximum possible length of an input - * date string */ -#define MAXDATEFIELDS 25 /* maximum possible number of fields in a - * date string */ -#define TOKMAXLEN 10 /* only this many chars are stored in - * datetktbl */ - -/* keep this struct small; it gets used a lot */ -typedef struct -{ -#if defined(_AIX) - char *token; -#else - char token[TOKMAXLEN]; -#endif /* _AIX */ - char type; - char value; /* this may be unsigned, alas */ -} datetkn; - -#ifdef NAN -#define DT_INVALID (NAN) -#else -#define DT_INVALID (DBL_MIN+DBL_MIN) -#endif -#ifdef HUGE_VAL -#define DT_NOBEGIN (-HUGE_VAL) -#define DT_NOEND (HUGE_VAL) -#else -#define DT_NOBEGIN (-DBL_MAX) -#define DT_NOEND (DBL_MAX) -#endif -#define DT_CURRENT (DBL_MIN) -#define DT_EPOCH (-DBL_MIN) - -#define DATETIME_INVALID(j) {j = DT_INVALID;} -#ifdef NAN -#define DATETIME_IS_INVALID(j) (isnan(j)) -#else -#define DATETIME_IS_INVALID(j) (j == DT_INVALID) -#endif - -#define DATETIME_NOBEGIN(j) {j = DT_NOBEGIN;} -#define DATETIME_IS_NOBEGIN(j) (j == DT_NOBEGIN) - -#define DATETIME_NOEND(j) {j = DT_NOEND;} -#define DATETIME_IS_NOEND(j) (j == DT_NOEND) - -#define DATETIME_CURRENT(j) {j = DT_CURRENT;} -#if defined(linux) && defined(__powerpc__) -extern int datetime_is_current(double j); - -#define DATETIME_IS_CURRENT(j) datetime_is_current(j) -#else -#define DATETIME_IS_CURRENT(j) (j == DT_CURRENT) -#endif - -#define DATETIME_EPOCH(j) {j = DT_EPOCH;} -#if defined(linux) && defined(__powerpc__) -extern int datetime_is_epoch(double j); - -#define DATETIME_IS_EPOCH(j) datetime_is_epoch(j) -#else -#define DATETIME_IS_EPOCH(j) (j == DT_EPOCH) -#endif - -#define DATETIME_IS_RELATIVE(j) (DATETIME_IS_CURRENT(j) || DATETIME_IS_EPOCH(j)) -#define DATETIME_NOT_FINITE(j) (DATETIME_IS_INVALID(j) \ - || DATETIME_IS_NOBEGIN(j) || DATETIME_IS_NOEND(j)) -#define DATETIME_IS_RESERVED(j) (DATETIME_IS_RELATIVE(j) || DATETIME_NOT_FINITE(j)) - -#define TIMESPAN_INVALID(j) {(j).time = DT_INVALID;} -#ifdef NAN -#define TIMESPAN_IS_INVALID(j) (isnan((j).time)) -#else -#define TIMESPAN_IS_INVALID(j) ((j).time == DT_INVALID) -#endif -#define TIMESPAN_NOT_FINITE(j) TIMESPAN_IS_INVALID(j) - -#define TIME_PREC_INV 1000000.0 -#define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV) - - - -/* - * Date/time validation - * Include check for leap year. - */ - -extern int day_tab[2][13]; - -#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) - -/* Julian date support for date2j() and j2date() - * Set the minimum year to one greater than the year of the first valid day - * to avoid having to check year and day both. - tgl 97/05/08 - */ - -#define JULIAN_MINYEAR (-4713) -#define JULIAN_MINMONTH (11) -#define JULIAN_MINDAY (23) - -#define IS_VALID_JULIAN(y,m,d) ((y > JULIAN_MINYEAR) \ - || ((y == JULIAN_MINYEAR) && ((m > JULIAN_MINMONTH) \ - || ((m == JULIAN_MINMONTH) && (d >= JULIAN_MINDAY))))) - -#define UTIME_MINYEAR (1901) -#define UTIME_MINMONTH (12) -#define UTIME_MINDAY (14) -#define UTIME_MAXYEAR (2038) -#define UTIME_MAXMONTH (01) -#define UTIME_MAXDAY (18) - -#define IS_VALID_UTIME(y,m,d) (((y > UTIME_MINYEAR) \ - || ((y == UTIME_MINYEAR) && ((m > UTIME_MINMONTH) \ - || ((m == UTIME_MINMONTH) && (d >= UTIME_MINDAY))))) \ - && ((y < UTIME_MAXYEAR) \ - || ((y == UTIME_MAXYEAR) && ((m < UTIME_MAXMONTH) \ - || ((m == UTIME_MAXMONTH) && (d <= UTIME_MAXDAY)))))) - -/* - * dt.c prototypes - */ - -extern DateTime *datetime_in(char *str); -extern char *datetime_out(DateTime *dt); -extern bool datetime_eq(DateTime *dt1, DateTime *dt2); -extern bool datetime_ne(DateTime *dt1, DateTime *dt2); -extern bool datetime_lt(DateTime *dt1, DateTime *dt2); -extern bool datetime_le(DateTime *dt1, DateTime *dt2); -extern bool datetime_ge(DateTime *dt1, DateTime *dt2); -extern bool datetime_gt(DateTime *dt1, DateTime *dt2); -extern bool datetime_finite(DateTime *datetime); -extern int datetime_cmp(DateTime *dt1, DateTime *dt2); -extern DateTime *datetime_smaller(DateTime *dt1, DateTime *dt2); -extern DateTime *datetime_larger(DateTime *dt1, DateTime *dt2); - -extern TimeSpan *timespan_in(char *str); -extern char *timespan_out(TimeSpan *span); -extern bool timespan_eq(TimeSpan *span1, TimeSpan *span2); -extern bool timespan_ne(TimeSpan *span1, TimeSpan *span2); -extern bool timespan_lt(TimeSpan *span1, TimeSpan *span2); -extern bool timespan_le(TimeSpan *span1, TimeSpan *span2); -extern bool timespan_ge(TimeSpan *span1, TimeSpan *span2); -extern bool timespan_gt(TimeSpan *span1, TimeSpan *span2); -extern bool timespan_finite(TimeSpan *span); -extern int timespan_cmp(TimeSpan *span1, TimeSpan *span2); -extern TimeSpan *timespan_smaller(TimeSpan *span1, TimeSpan *span2); -extern TimeSpan *timespan_larger(TimeSpan *span1, TimeSpan *span2); - -extern text *datetime_text(DateTime *datetime); -extern DateTime *text_datetime(text *str); -extern text *timespan_text(TimeSpan *timespan); -extern TimeSpan *text_timespan(text *str); -extern DateTime *datetime_trunc(text *units, DateTime *datetime); -extern TimeSpan *timespan_trunc(text *units, TimeSpan *timespan); -extern float64 datetime_part(text *units, DateTime *datetime); -extern float64 timespan_part(text *units, TimeSpan *timespan); -extern text *datetime_zone(text *zone, DateTime *datetime); - -extern TimeSpan *timespan_um(TimeSpan *span); -extern TimeSpan *timespan_pl(TimeSpan *span1, TimeSpan *span2); -extern TimeSpan *timespan_mi(TimeSpan *span1, TimeSpan *span2); -extern TimeSpan *timespan_div(TimeSpan *span1, float8 *arg2); - -extern TimeSpan *datetime_mi(DateTime *dt1, DateTime *dt2); -extern DateTime *datetime_pl_span(DateTime *dt, TimeSpan *span); -extern DateTime *datetime_mi_span(DateTime *dt, TimeSpan *span); -extern TimeSpan *datetime_age(DateTime *dt1, DateTime *dt2); - -extern void GetCurrentTime(struct tm * tm); -extern DateTime SetDateTime(DateTime datetime); -extern int tm2datetime(struct tm * tm, double fsec, int *tzp, DateTime *dt); -extern int datetime2tm(DateTime dt, int *tzp, struct tm * tm, double *fsec, char **tzn); - -extern void j2date(int jd, int *year, int *month, int *day); -extern int date2j(int year, int month, int day); - -extern int ParseDateTime(char *timestr, char *lowstr, - char **field, int *ftype, int maxfields, int *numfields); -extern int DecodeDateTime(char **field, int *ftype, - int nf, int *dtype, struct tm * tm, double *fsec, int *tzp); - -extern int DecodeTimeOnly(char **field, int *ftype, int nf, - int *dtype, struct tm * tm, double *fsec); - -extern int DecodeDateDelta(char **field, int *ftype, - int nf, int *dtype, struct tm * tm, double *fsec); - -extern int EncodeDateOnly(struct tm * tm, int style, char *str); -extern int EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str); -extern int EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, char *str); -extern int EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str); - -#endif /* DT_H */ diff --git a/src/include/utils/formatting.h b/src/include/utils/formatting.h index 51c649fd9d..39259afff2 100644 --- a/src/include/utils/formatting.h +++ b/src/include/utils/formatting.h @@ -2,7 +2,7 @@ /* ----------------------------------------------------------------------- * formatting.h * - * $Id: formatting.h,v 1.2 2000/02/08 15:56:57 momjian Exp $ + * $Id: formatting.h,v 1.3 2000/02/16 17:26:26 thomas Exp $ * * * Portions Copyright (c) 1999-2000, PostgreSQL, Inc @@ -18,16 +18,14 @@ #ifndef _FORMATTING_H_ #define _FORMATTING_H_ -extern text *datetime_to_char(DateTime *dt, text *fmt); -extern text *timestamp_to_char(time_t dt, text *fmt); -extern DateTime *to_datetime(text *date_str, text *fmt); -extern time_t to_timestamp(text *date_str, text *fmt); -extern DateADT to_date(text *date_str, text *fmt); -extern Numeric numeric_to_number(text *value, text *fmt); -extern text *numeric_to_char(Numeric value, text *fmt); -extern text *int4_to_char(int32 value, text *fmt); -extern text *int8_to_char(int64 *value, text *fmt); -extern text *float4_to_char(float32 value, text *fmt); -extern text *float8_to_char(float64 value, text *fmt); +extern text *timestamp_to_char(Timestamp *dt, text *fmt); +extern Timestamp *to_timestamp(text *date_str, text *fmt); +extern DateADT to_date(text *date_str, text *fmt); +extern Numeric numeric_to_number(text *value, text *fmt); +extern text *numeric_to_char(Numeric value, text *fmt); +extern text *int4_to_char(int32 value, text *fmt); +extern text *int8_to_char(int64 *value, text *fmt); +extern text *float4_to_char(float32 value, text *fmt); +extern text *float8_to_char(float64 value, text *fmt); #endif diff --git a/src/include/utils/nabstime.h b/src/include/utils/nabstime.h index 4da1c28343..09eea75ec6 100644 --- a/src/include/utils/nabstime.h +++ b/src/include/utils/nabstime.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: nabstime.h,v 1.22 2000/01/26 05:58:38 momjian Exp $ + * $Id: nabstime.h,v 1.23 2000/02/16 17:26:26 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -15,7 +15,8 @@ #define NABSTIME_H #include <time.h> -#include "utils/dt.h" +#include "utils/timestamp.h" +#include "utils/datetime.h" /* ---------------------------------------------------------------- @@ -119,11 +120,51 @@ extern bool abstimele(AbsoluteTime t1, AbsoluteTime t2); extern bool abstimege(AbsoluteTime t1, AbsoluteTime t2); extern bool abstime_finite(AbsoluteTime time); -extern AbsoluteTime datetime_abstime(DateTime *datetime); -extern DateTime *abstime_datetime(AbsoluteTime abstime); +extern AbsoluteTime timestamp_abstime(Timestamp *timestamp); +extern Timestamp *abstime_timestamp(AbsoluteTime abstime); extern bool AbsoluteTimeIsBefore(AbsoluteTime time1, AbsoluteTime time2); extern void abstime2tm(AbsoluteTime time, int *tzp, struct tm * tm, char *tzn); +extern RelativeTime reltimein(char *timestring); +extern char *reltimeout(RelativeTime timevalue); +extern TimeInterval tintervalin(char *intervalstr); +extern char *tintervalout(TimeInterval interval); +extern RelativeTime interval_reltime(Interval *interval); +extern Interval *reltime_interval(RelativeTime reltime); +extern TimeInterval mktinterval(AbsoluteTime t1, AbsoluteTime t2); +extern AbsoluteTime timepl(AbsoluteTime t1, RelativeTime t2); +extern AbsoluteTime timemi(AbsoluteTime t1, RelativeTime t2); + +/* extern RelativeTime abstimemi(AbsoluteTime t1, AbsoluteTime t2); static*/ +extern int intinterval(AbsoluteTime t, TimeInterval interval); +extern RelativeTime tintervalrel(TimeInterval interval); +extern AbsoluteTime timenow(void); +extern bool reltimeeq(RelativeTime t1, RelativeTime t2); +extern bool reltimene(RelativeTime t1, RelativeTime t2); +extern bool reltimelt(RelativeTime t1, RelativeTime t2); +extern bool reltimegt(RelativeTime t1, RelativeTime t2); +extern bool reltimele(RelativeTime t1, RelativeTime t2); +extern bool reltimege(RelativeTime t1, RelativeTime t2); +extern bool tintervalsame(TimeInterval i1, TimeInterval i2); +extern bool tintervaleq(TimeInterval i1, TimeInterval i2); +extern bool tintervalne(TimeInterval i1, TimeInterval i2); +extern bool tintervallt(TimeInterval i1, TimeInterval i2); +extern bool tintervalgt(TimeInterval i1, TimeInterval i2); +extern bool tintervalle(TimeInterval i1, TimeInterval i2); +extern bool tintervalge(TimeInterval i1, TimeInterval i2); +extern bool tintervalleneq(TimeInterval i, RelativeTime t); +extern bool tintervallenne(TimeInterval i, RelativeTime t); +extern bool tintervallenlt(TimeInterval i, RelativeTime t); +extern bool tintervallengt(TimeInterval i, RelativeTime t); +extern bool tintervallenle(TimeInterval i, RelativeTime t); +extern bool tintervallenge(TimeInterval i, RelativeTime t); +extern bool tintervalct(TimeInterval i1, TimeInterval i2); +extern bool tintervalov(TimeInterval i1, TimeInterval i2); +extern AbsoluteTime tintervalstart(TimeInterval i); +extern AbsoluteTime tintervalend(TimeInterval i); +extern int32 int4reltime(int32 timevalue); +extern text *timeofday(void); + #endif /* NABSTIME_H */ diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h new file mode 100644 index 0000000000..27a5288cf3 --- /dev/null +++ b/src/include/utils/timestamp.h @@ -0,0 +1,208 @@ +/*------------------------------------------------------------------------- + * + * timestamp.h + * Definitions for the SQL92 "timestamp" and "interval" types. + * + * Portions Copyright (c) 1996-2000, PostgreSQL, Inc + * Portions Copyright (c) 1994, Regents of the University of California + * + * $Id: timestamp.h,v 1.1 2000/02/16 17:26:26 thomas Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef TIMESTAMP_H +#define TIMESTAMP_H + +#include <time.h> +#include <math.h> +#include <limits.h> + +/* + * Timestamp represents absolute time. + * Interval represents delta time. Keep track of months (and years) + * separately since the elapsed time spanned is unknown until instantiated + * relative to an absolute time. + * + * Note that Postgres uses "time interval" to mean a bounded interval, + * consisting of a beginning and ending time, not a time span - thomas 97/03/20 + */ + +typedef double Timestamp; + +typedef struct +{ + double time; /* all time units other than months and + * years */ + int4 month; /* months and years, after time for + * alignment */ +} Interval; + + +#ifdef NAN +#define DT_INVALID (NAN) +#else +#define DT_INVALID (DBL_MIN+DBL_MIN) +#endif +#ifdef HUGE_VAL +#define DT_NOBEGIN (-HUGE_VAL) +#define DT_NOEND (HUGE_VAL) +#else +#define DT_NOBEGIN (-DBL_MAX) +#define DT_NOEND (DBL_MAX) +#endif +#define DT_CURRENT (DBL_MIN) +#define DT_EPOCH (-DBL_MIN) + +#define TIMESTAMP_INVALID(j) {j = DT_INVALID;} +#ifdef NAN +#define TIMESTAMP_IS_INVALID(j) (isnan(j)) +#else +#define TIMESTAMP_IS_INVALID(j) (j == DT_INVALID) +#endif + +#define TIMESTAMP_NOBEGIN(j) {j = DT_NOBEGIN;} +#define TIMESTAMP_IS_NOBEGIN(j) (j == DT_NOBEGIN) + +#define TIMESTAMP_NOEND(j) {j = DT_NOEND;} +#define TIMESTAMP_IS_NOEND(j) (j == DT_NOEND) + +#define TIMESTAMP_CURRENT(j) {j = DT_CURRENT;} +#if defined(linux) && defined(__powerpc__) +extern int timestamp_is_current(double j); + +#define TIMESTAMP_IS_CURRENT(j) timestamp_is_current(j) +#else +#define TIMESTAMP_IS_CURRENT(j) (j == DT_CURRENT) +#endif + +#define TIMESTAMP_EPOCH(j) {j = DT_EPOCH;} +#if defined(linux) && defined(__powerpc__) +extern int timestamp_is_epoch(double j); + +#define TIMESTAMP_IS_EPOCH(j) timestamp_is_epoch(j) +#else +#define TIMESTAMP_IS_EPOCH(j) (j == DT_EPOCH) +#endif + +#define TIMESTAMP_IS_RELATIVE(j) (TIMESTAMP_IS_CURRENT(j) || TIMESTAMP_IS_EPOCH(j)) +#define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_INVALID(j) \ + || TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j)) +#define TIMESTAMP_IS_RESERVED(j) (TIMESTAMP_IS_RELATIVE(j) || TIMESTAMP_NOT_FINITE(j)) + +#define INTERVAL_INVALID(j) {(j).time = DT_INVALID;} +#ifdef NAN +#define INTERVAL_IS_INVALID(j) (isnan((j).time)) +#else +#define INTERVAL_IS_INVALID(j) ((j).time == DT_INVALID) +#endif +#define INTERVAL_NOT_FINITE(j) INTERVAL_IS_INVALID(j) + +#define TIME_PREC_INV 1000000.0 +#define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV) + + +#if 0 + + +/* + * Date/time validation + * Include check for leap year. + */ + +extern int day_tab[2][13]; + +#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) + +/* Julian date support for date2j() and j2date() + * Set the minimum year to one greater than the year of the first valid day + * to avoid having to check year and day both. - tgl 97/05/08 + */ + +#define JULIAN_MINYEAR (-4713) +#define JULIAN_MINMONTH (11) +#define JULIAN_MINDAY (23) + +#define IS_VALID_JULIAN(y,m,d) ((y > JULIAN_MINYEAR) \ + || ((y == JULIAN_MINYEAR) && ((m > JULIAN_MINMONTH) \ + || ((m == JULIAN_MINMONTH) && (d >= JULIAN_MINDAY))))) + +#define UTIME_MINYEAR (1901) +#define UTIME_MINMONTH (12) +#define UTIME_MINDAY (14) +#define UTIME_MAXYEAR (2038) +#define UTIME_MAXMONTH (01) +#define UTIME_MAXDAY (18) + +#define IS_VALID_UTIME(y,m,d) (((y > UTIME_MINYEAR) \ + || ((y == UTIME_MINYEAR) && ((m > UTIME_MINMONTH) \ + || ((m == UTIME_MINMONTH) && (d >= UTIME_MINDAY))))) \ + && ((y < UTIME_MAXYEAR) \ + || ((y == UTIME_MAXYEAR) && ((m < UTIME_MAXMONTH) \ + || ((m == UTIME_MAXMONTH) && (d <= UTIME_MAXDAY)))))) + + +#endif + + +/* + * timestamp.c prototypes + */ + +extern Timestamp *timestamp_in(char *str); +extern char *timestamp_out(Timestamp *dt); +extern bool timestamp_eq(Timestamp *dt1, Timestamp *dt2); +extern bool timestamp_ne(Timestamp *dt1, Timestamp *dt2); +extern bool timestamp_lt(Timestamp *dt1, Timestamp *dt2); +extern bool timestamp_le(Timestamp *dt1, Timestamp *dt2); +extern bool timestamp_ge(Timestamp *dt1, Timestamp *dt2); +extern bool timestamp_gt(Timestamp *dt1, Timestamp *dt2); +extern bool timestamp_finite(Timestamp *timestamp); +extern int timestamp_cmp(Timestamp *dt1, Timestamp *dt2); +extern Timestamp *timestamp_smaller(Timestamp *dt1, Timestamp *dt2); +extern Timestamp *timestamp_larger(Timestamp *dt1, Timestamp *dt2); + +extern Interval *interval_in(char *str); +extern char *interval_out(Interval *span); +extern bool interval_eq(Interval *span1, Interval *span2); +extern bool interval_ne(Interval *span1, Interval *span2); +extern bool interval_lt(Interval *span1, Interval *span2); +extern bool interval_le(Interval *span1, Interval *span2); +extern bool interval_ge(Interval *span1, Interval *span2); +extern bool interval_gt(Interval *span1, Interval *span2); +extern bool interval_finite(Interval *span); +extern int interval_cmp(Interval *span1, Interval *span2); +extern Interval *interval_smaller(Interval *span1, Interval *span2); +extern Interval *interval_larger(Interval *span1, Interval *span2); + +extern text *timestamp_text(Timestamp *timestamp); +extern Timestamp *text_timestamp(text *str); +extern text *interval_text(Interval *interval); +extern Interval *text_interval(text *str); +extern Timestamp *timestamp_trunc(text *units, Timestamp *timestamp); +extern Interval *interval_trunc(text *units, Interval *interval); +extern float64 timestamp_part(text *units, Timestamp *timestamp); +extern float64 interval_part(text *units, Interval *interval); +extern text *timestamp_zone(text *zone, Timestamp *timestamp); + +extern Interval *interval_um(Interval *span); +extern Interval *interval_pl(Interval *span1, Interval *span2); +extern Interval *interval_mi(Interval *span1, Interval *span2); +extern Interval *interval_div(Interval *span1, float8 *arg2); + +extern Interval *timestamp_mi(Timestamp *dt1, Timestamp *dt2); +extern Timestamp *timestamp_pl_span(Timestamp *dt, Interval *span); +extern Timestamp *timestamp_mi_span(Timestamp *dt, Interval *span); +extern Interval *timestamp_age(Timestamp *dt1, Timestamp *dt2); + +extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt); +extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn); + +extern Timestamp SetTimestamp(Timestamp timestamp); +extern Timestamp dt2local(Timestamp dt, int timezone); +extern void dt2time(Timestamp dt, int *hour, int *min, double *sec); +extern int EncodeSpecialTimestamp(Timestamp dt, char *str); +extern int interval2tm(Interval span, struct tm * tm, float8 *fsec); +extern int tm2interval(struct tm * tm, double fsec, Interval *span); +extern Timestamp *now(void); + +#endif /* TIMESTAMP_H */ |
