Fix xslt_process() to ensure that it inserts a NULL terminator after the
[PostgreSQL.git] / src / include / utils / datetime.h
blobdb297f26425bcfdf062b5c4ec7cdf5f2cdabc4ab
1 /*-------------------------------------------------------------------------
3 * datetime.h
4 * Definitions for the date/time and other date/time support code.
5 * The support code is shared with other date data types,
6 * including abstime, reltime, date, and time.
9 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
10 * Portions Copyright (c) 1994, Regents of the University of California
12 * $PostgreSQL$
14 *-------------------------------------------------------------------------
16 #ifndef DATETIME_H
17 #define DATETIME_H
19 #include <limits.h>
20 #include <math.h>
22 #include "utils/timestamp.h"
23 #include "utils/tzparser.h"
26 /* ----------------------------------------------------------------
27 * time types + support macros
29 * String definitions for standard time quantities.
31 * These strings are the defaults used to form output time strings.
32 * Other alternative forms are hardcoded into token tables in datetime.c.
33 * ----------------------------------------------------------------
36 #define DAGO "ago"
37 #define DCURRENT "current"
38 #define EPOCH "epoch"
39 #define INVALID "invalid"
40 #define EARLY "-infinity"
41 #define LATE "infinity"
42 #define NOW "now"
43 #define TODAY "today"
44 #define TOMORROW "tomorrow"
45 #define YESTERDAY "yesterday"
46 #define ZULU "zulu"
48 #define DMICROSEC "usecond"
49 #define DMILLISEC "msecond"
50 #define DSECOND "second"
51 #define DMINUTE "minute"
52 #define DHOUR "hour"
53 #define DDAY "day"
54 #define DWEEK "week"
55 #define DMONTH "month"
56 #define DQUARTER "quarter"
57 #define DYEAR "year"
58 #define DDECADE "decade"
59 #define DCENTURY "century"
60 #define DMILLENNIUM "millennium"
61 #define DA_D "ad"
62 #define DB_C "bc"
63 #define DTIMEZONE "timezone"
66 * Fundamental time field definitions for parsing.
68 * Meridian: am, pm, or 24-hour style.
69 * Millennium: ad, bc
72 #define AM 0
73 #define PM 1
74 #define HR24 2
76 #define AD 0
77 #define BC 1
80 * Fields for time decoding.
82 * Can't have more of these than there are bits in an unsigned int
83 * since these are turned into bit masks during parsing and decoding.
85 * Furthermore, the values for YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
86 * must be in the range 0..14 so that the associated bitmasks can fit
87 * into the left half of an INTERVAL's typmod value. Since those bits
88 * are stored in typmods, you can't change them without initdb!
91 #define RESERV 0
92 #define MONTH 1
93 #define YEAR 2
94 #define DAY 3
95 #define JULIAN 4
96 #define TZ 5
97 #define DTZ 6
98 #define DTZMOD 7
99 #define IGNORE_DTF 8
100 #define AMPM 9
101 #define HOUR 10
102 #define MINUTE 11
103 #define SECOND 12
104 #define MILLISECOND 13
105 #define MICROSECOND 14
106 #define DOY 15
107 #define DOW 16
108 #define UNITS 17
109 #define ADBC 18
110 /* these are only for relative dates */
111 #define AGO 19
112 #define ABS_BEFORE 20
113 #define ABS_AFTER 21
114 /* generic fields to help with parsing */
115 #define ISODATE 22
116 #define ISOTIME 23
117 /* these are only for parsing intervals */
118 #define WEEK 24
119 #define DECADE 25
120 #define CENTURY 26
121 #define MILLENNIUM 27
122 /* reserved for unrecognized string values */
123 #define UNKNOWN_FIELD 31
126 * Token field definitions for time parsing and decoding.
127 * These need to fit into the datetkn table type.
128 * At the moment, that means keep them within [-127,127].
129 * These are also used for bit masks in DecodeDateDelta()
130 * so actually restrict them to within [0,31] for now.
131 * - thomas 97/06/19
132 * Not all of these fields are used for masks in DecodeDateDelta
133 * so allow some larger than 31. - thomas 1997-11-17
136 #define DTK_NUMBER 0
137 #define DTK_STRING 1
139 #define DTK_DATE 2
140 #define DTK_TIME 3
141 #define DTK_TZ 4
142 #define DTK_AGO 5
144 #define DTK_SPECIAL 6
145 #define DTK_INVALID 7
146 #define DTK_CURRENT 8
147 #define DTK_EARLY 9
148 #define DTK_LATE 10
149 #define DTK_EPOCH 11
150 #define DTK_NOW 12
151 #define DTK_YESTERDAY 13
152 #define DTK_TODAY 14
153 #define DTK_TOMORROW 15
154 #define DTK_ZULU 16
156 #define DTK_DELTA 17
157 #define DTK_SECOND 18
158 #define DTK_MINUTE 19
159 #define DTK_HOUR 20
160 #define DTK_DAY 21
161 #define DTK_WEEK 22
162 #define DTK_MONTH 23
163 #define DTK_QUARTER 24
164 #define DTK_YEAR 25
165 #define DTK_DECADE 26
166 #define DTK_CENTURY 27
167 #define DTK_MILLENNIUM 28
168 #define DTK_MILLISEC 29
169 #define DTK_MICROSEC 30
170 #define DTK_JULIAN 31
172 #define DTK_DOW 32
173 #define DTK_DOY 33
174 #define DTK_TZ_HOUR 34
175 #define DTK_TZ_MINUTE 35
176 #define DTK_ISOYEAR 36
177 #define DTK_ISODOW 37
181 * Bit mask definitions for time parsing.
184 #define DTK_M(t) (0x01 << (t))
186 /* Convenience: a second, plus any fractional component */
187 #define DTK_ALL_SECS_M (DTK_M(SECOND) | DTK_M(MILLISECOND) | DTK_M(MICROSECOND))
188 #define DTK_DATE_M (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY))
189 #define DTK_TIME_M (DTK_M(HOUR) | DTK_M(MINUTE) | DTK_ALL_SECS_M)
191 #define MAXDATELEN 63 /* maximum possible length of an input date
192 * string (not counting tr. null) */
193 #define MAXDATEFIELDS 25 /* maximum possible number of fields in a date
194 * string */
195 #define TOKMAXLEN 10 /* only this many chars are stored in
196 * datetktbl */
198 /* keep this struct small; it gets used a lot */
199 typedef struct
201 char token[TOKMAXLEN];
202 char type;
203 char value; /* this may be unsigned, alas */
204 } datetkn;
207 /* FMODULO()
208 * Macro to replace modf(), which is broken on some platforms.
209 * t = input and remainder
210 * q = integer part
211 * u = divisor
213 #define FMODULO(t,q,u) \
214 do { \
215 (q) = (((t) < 0) ? ceil((t) / (u)) : floor((t) / (u))); \
216 if ((q) != 0) (t) -= rint((q) * (u)); \
217 } while(0)
219 /* TMODULO()
220 * Like FMODULO(), but work on the timestamp datatype (either int64 or float8).
221 * We assume that int64 follows the C99 semantics for division (negative
222 * quotients truncate towards zero).
224 #ifdef HAVE_INT64_TIMESTAMP
225 #define TMODULO(t,q,u) \
226 do { \
227 (q) = ((t) / (u)); \
228 if ((q) != 0) (t) -= ((q) * (u)); \
229 } while(0)
230 #else
231 #define TMODULO(t,q,u) \
232 do { \
233 (q) = (((t) < 0) ? ceil((t) / (u)) : floor((t) / (u))); \
234 if ((q) != 0) (t) -= rint((q) * (u)); \
235 } while(0)
236 #endif
239 * Date/time validation
240 * Include check for leap year.
243 extern const int day_tab[2][13];
245 #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
248 /* Julian date support for date2j() and j2date()
250 * IS_VALID_JULIAN checks the minimum date exactly, but is a bit sloppy
251 * about the maximum, since it's far enough out to not be especially
252 * interesting.
255 #define JULIAN_MINYEAR (-4713)
256 #define JULIAN_MINMONTH (11)
257 #define JULIAN_MINDAY (24)
258 #define JULIAN_MAXYEAR (5874898)
260 #define IS_VALID_JULIAN(y,m,d) ((((y) > JULIAN_MINYEAR) \
261 || (((y) == JULIAN_MINYEAR) && (((m) > JULIAN_MINMONTH) \
262 || (((m) == JULIAN_MINMONTH) && ((d) >= JULIAN_MINDAY))))) \
263 && ((y) < JULIAN_MAXYEAR))
265 /* Julian-date equivalents of Day 0 in Unix and Postgres reckoning */
266 #define UNIX_EPOCH_JDATE 2440588 /* == date2j(1970, 1, 1) */
267 #define POSTGRES_EPOCH_JDATE 2451545 /* == date2j(2000, 1, 1) */
271 * Datetime input parsing routines (ParseDateTime, DecodeDateTime, etc)
272 * return zero or a positive value on success. On failure, they return
273 * one of these negative code values. DateTimeParseError may be used to
274 * produce a correct ereport.
276 #define DTERR_BAD_FORMAT (-1)
277 #define DTERR_FIELD_OVERFLOW (-2)
278 #define DTERR_MD_FIELD_OVERFLOW (-3) /* triggers hint about DateStyle */
279 #define DTERR_INTERVAL_OVERFLOW (-4)
280 #define DTERR_TZDISP_OVERFLOW (-5)
283 extern void GetCurrentDateTime(struct pg_tm * tm);
284 extern void GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp);
285 extern void j2date(int jd, int *year, int *month, int *day);
286 extern int date2j(int year, int month, int day);
288 extern int ParseDateTime(const char *timestr, char *workbuf, size_t buflen,
289 char **field, int *ftype,
290 int maxfields, int *numfields);
291 extern int DecodeDateTime(char **field, int *ftype,
292 int nf, int *dtype,
293 struct pg_tm * tm, fsec_t *fsec, int *tzp);
294 extern int DecodeTimeOnly(char **field, int *ftype,
295 int nf, int *dtype,
296 struct pg_tm * tm, fsec_t *fsec, int *tzp);
297 extern int DecodeInterval(char **field, int *ftype, int nf, int range,
298 int *dtype, struct pg_tm * tm, fsec_t *fsec);
299 extern int DecodeISO8601Interval(char *str,
300 int *dtype, struct pg_tm * tm, fsec_t *fsec);
302 extern void DateTimeParseError(int dterr, const char *str,
303 const char *datatype);
305 extern int DetermineTimeZoneOffset(struct pg_tm * tm, pg_tz *tzp);
307 extern void EncodeDateOnly(struct pg_tm * tm, int style, char *str);
308 extern void EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str);
309 extern void EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, char *str);
310 extern void EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str);
312 extern int DecodeSpecial(int field, char *lowtoken, int *val);
313 extern int DecodeUnits(int field, char *lowtoken, int *val);
315 extern int j2day(int jd);
317 extern bool CheckDateTokenTables(void);
318 extern void InstallTimeZoneAbbrevs(tzEntry *abbrevs, int n);
320 extern Datum pg_timezone_abbrevs(PG_FUNCTION_ARGS);
321 extern Datum pg_timezone_names(PG_FUNCTION_ARGS);
323 #endif /* DATETIME_H */