summaryrefslogtreecommitdiff
path: root/src/include/utils/dt.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/utils/dt.h')
-rw-r--r--src/include/utils/dt.h373
1 files changed, 193 insertions, 180 deletions
diff --git a/src/include/utils/dt.h b/src/include/utils/dt.h
index 2065e62d05f..b30e3a18627 100644
--- a/src/include/utils/dt.h
+++ b/src/include/utils/dt.h
@@ -1,14 +1,14 @@
/*-------------------------------------------------------------------------
*
* 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.
+ * 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.
*
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: dt.h,v 1.18 1997/09/04 18:44:29 thomas Exp $
+ * $Id: dt.h,v 1.19 1997/09/07 05:02:19 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -21,23 +21,26 @@
/*
* 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.
+ * 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 - tgl 97/03/20
+ * consisting of a beginning and ending time, not a time span - tgl 97/03/20
*/
-typedef double DateTime;
+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;
+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
+ * time types + support macros
*
* String definitions for standard time quantities.
*
@@ -46,196 +49,202 @@ typedef struct {
* ----------------------------------------------------------------
*/
-#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"
+#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
+ * Meridian: am, pm, or 24-hour style.
+ * Millenium: ad, bc
*/
-#define AM 0
-#define PM 1
+#define AM 0
+#define PM 1
#define HR24 2
-#define AD 0
-#define BC 1
+#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.
+ * 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 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 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
+#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.
+ * so actually restrict them to within [0,31] for now.
* - tgl 97/06/19
*/
-#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_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_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_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 31
+#define DTK_DOW 31
/*
* Bit mask definitions for time parsing.
*/
-#define DTK_M(t) (0x01 << (t))
+#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 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 */
+#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 {
+typedef struct
+{
#if defined(aix)
- char *token;
+ char *token;
#else
- char token[TOKMAXLEN];
-#endif /* aix */
- char type;
- char value; /* this may be unsigned, alas */
-} datetkn;
+ char token[TOKMAXLEN];
+#endif /* aix */
+ char type;
+ char value; /* this may be unsigned, alas */
+} datetkn;
#ifdef NAN
-#define DT_INVALID (NAN)
+#define DT_INVALID (NAN)
#else
-#define DT_INVALID (DBL_MIN+DBL_MIN)
+#define DT_INVALID (DBL_MIN+DBL_MIN)
#endif
#ifdef HUGE_VAL
-#define DT_NOBEGIN (-HUGE_VAL)
-#define DT_NOEND (HUGE_VAL)
+#define DT_NOBEGIN (-HUGE_VAL)
+#define DT_NOEND (HUGE_VAL)
#else
-#define DT_NOBEGIN (-DBL_MAX)
-#define DT_NOEND (DBL_MAX)
+#define DT_NOBEGIN (-DBL_MAX)
+#define DT_NOEND (DBL_MAX)
#endif
-#define DT_CURRENT (DBL_MIN)
-#define DT_EPOCH (-DBL_MIN)
+#define DT_CURRENT (DBL_MIN)
+#define DT_EPOCH (-DBL_MIN)
-#define DATETIME_INVALID(j) {j = DT_INVALID;}
+#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_NOBEGIN(j) {j = DT_NOBEGIN;}
#define DATETIME_IS_NOBEGIN(j) (j == DT_NOBEGIN)
-#define DATETIME_NOEND(j) {j = DT_NOEND;}
+#define DATETIME_NOEND(j) {j = DT_NOEND;}
#define DATETIME_IS_NOEND(j) (j == DT_NOEND)
-#define DATETIME_CURRENT(j) {j = DT_CURRENT;}
+#define DATETIME_CURRENT(j) {j = DT_CURRENT;}
#if defined(linux) && defined(PPC)
-extern int datetime_is_current(double j);
+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;}
+#define DATETIME_EPOCH(j) {j = DT_EPOCH;}
#if defined(linux) && defined(PPC)
-extern int datetime_is_epoch(double j);
+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_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))
+ || 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;}
+#define TIMESPAN_INVALID(j) {(j).time = DT_INVALID;}
#ifdef NAN
#define TIMESPAN_IS_INVALID(j) (isnan((j).time))
#else
@@ -247,76 +256,80 @@ extern int datetime_is_epoch(double j);
#define JROUND(j) (rint(((double) (j))/TIME_PREC)*TIME_PREC)
/*
- * dt.c prototypes
+ * 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 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 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 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 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 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 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 tm2datetime(struct tm * tm, double fsec, int *tzp, DateTime * dt);
-extern void j2date( int jd, int *year, int *month, int *day);
-extern int date2j( int year, int month, int day);
+extern void j2date(int jd, int *year, int *month, int *day);
+extern int date2j(int year, int month, int day);
-extern double time2t(const int hour, const int min, const double sec);
+extern double time2t(const int hour, const int min, const double sec);
-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
+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
+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
+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 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 */
+#endif /* DT_H */