1 /*-------------------------------------------------------------------------
4 * Definitions for the "new" abstime code.
7 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
12 *-------------------------------------------------------------------------
20 #include "utils/timestamp.h"
21 #include "utils/datetime.h"
24 /* ----------------------------------------------------------------
26 * time types + support macros
28 * ----------------------------------------------------------------
32 * Although time_t generally is a long int on 64 bit systems, these two
33 * types must be 4 bytes, because that's what pg_type.h assumes. They
34 * should be yanked (long) before 2038 and be replaced by timestamp and
37 typedef int32 AbsoluteTime
;
38 typedef int32 RelativeTime
;
46 typedef TimeIntervalData
*TimeInterval
;
49 * Macros for fmgr-callable functions.
51 #define DatumGetAbsoluteTime(X) ((AbsoluteTime) DatumGetInt32(X))
52 #define DatumGetRelativeTime(X) ((RelativeTime) DatumGetInt32(X))
53 #define DatumGetTimeInterval(X) ((TimeInterval) DatumGetPointer(X))
55 #define AbsoluteTimeGetDatum(X) Int32GetDatum(X)
56 #define RelativeTimeGetDatum(X) Int32GetDatum(X)
57 #define TimeIntervalGetDatum(X) PointerGetDatum(X)
59 #define PG_GETARG_ABSOLUTETIME(n) DatumGetAbsoluteTime(PG_GETARG_DATUM(n))
60 #define PG_GETARG_RELATIVETIME(n) DatumGetRelativeTime(PG_GETARG_DATUM(n))
61 #define PG_GETARG_TIMEINTERVAL(n) DatumGetTimeInterval(PG_GETARG_DATUM(n))
63 #define PG_RETURN_ABSOLUTETIME(x) return AbsoluteTimeGetDatum(x)
64 #define PG_RETURN_RELATIVETIME(x) return RelativeTimeGetDatum(x)
65 #define PG_RETURN_TIMEINTERVAL(x) return TimeIntervalGetDatum(x)
69 * Epoch is Unix system time zero, but needs to be kept as a reserved
70 * value rather than converting to time since timezone calculations
71 * might move it away from 1970-01-01 00:00:00Z - tgl 97/02/20
73 * Pre-v6.1 code had large decimal numbers for reserved values.
74 * These were chosen as special 32-bit bit patterns,
75 * so redefine them explicitly using these bit patterns. - tgl 97/02/24
77 #define INVALID_ABSTIME ((AbsoluteTime) 0x7FFFFFFE) /* 2147483647 (2^31 - 1) */
78 #define NOEND_ABSTIME ((AbsoluteTime) 0x7FFFFFFC) /* 2147483645 (2^31 - 3) */
79 #define NOSTART_ABSTIME ((AbsoluteTime) INT_MIN) /* -2147483648 */
81 #define INVALID_RELTIME ((RelativeTime) 0x7FFFFFFE) /* 2147483647 (2^31 - 1) */
83 #define AbsoluteTimeIsValid(time) \
84 ((bool) ((time) != INVALID_ABSTIME))
87 * Because NOSTART_ABSTIME is defined as INT_MIN, there can't be any
88 * AbsoluteTime values less than it. Therefore, we can code the test
89 * "time > NOSTART_ABSTIME" as "time != NOSTART_ABSTIME", which avoids
90 * compiler bugs on some platforms. --- tgl & az, 11/2000
92 #define AbsoluteTimeIsReal(time) \
93 ((bool) (((AbsoluteTime) (time)) < NOEND_ABSTIME && \
94 ((AbsoluteTime) (time)) != NOSTART_ABSTIME))
96 #define RelativeTimeIsValid(time) \
97 ((bool) (((RelativeTime) (time)) != INVALID_RELTIME))
101 * nabstime.c prototypes
103 extern Datum
abstimein(PG_FUNCTION_ARGS
);
104 extern Datum
abstimeout(PG_FUNCTION_ARGS
);
105 extern Datum
abstimerecv(PG_FUNCTION_ARGS
);
106 extern Datum
abstimesend(PG_FUNCTION_ARGS
);
108 extern Datum
abstimeeq(PG_FUNCTION_ARGS
);
109 extern Datum
abstimene(PG_FUNCTION_ARGS
);
110 extern Datum
abstimelt(PG_FUNCTION_ARGS
);
111 extern Datum
abstimegt(PG_FUNCTION_ARGS
);
112 extern Datum
abstimele(PG_FUNCTION_ARGS
);
113 extern Datum
abstimege(PG_FUNCTION_ARGS
);
114 extern Datum
abstime_finite(PG_FUNCTION_ARGS
);
116 extern Datum
timestamp_abstime(PG_FUNCTION_ARGS
);
117 extern Datum
abstime_timestamp(PG_FUNCTION_ARGS
);
118 extern Datum
timestamptz_abstime(PG_FUNCTION_ARGS
);
119 extern Datum
abstime_timestamptz(PG_FUNCTION_ARGS
);
121 extern Datum
reltimein(PG_FUNCTION_ARGS
);
122 extern Datum
reltimeout(PG_FUNCTION_ARGS
);
123 extern Datum
reltimerecv(PG_FUNCTION_ARGS
);
124 extern Datum
reltimesend(PG_FUNCTION_ARGS
);
125 extern Datum
tintervalin(PG_FUNCTION_ARGS
);
126 extern Datum
tintervalout(PG_FUNCTION_ARGS
);
127 extern Datum
tintervalrecv(PG_FUNCTION_ARGS
);
128 extern Datum
tintervalsend(PG_FUNCTION_ARGS
);
129 extern Datum
interval_reltime(PG_FUNCTION_ARGS
);
130 extern Datum
reltime_interval(PG_FUNCTION_ARGS
);
131 extern Datum
mktinterval(PG_FUNCTION_ARGS
);
132 extern Datum
timepl(PG_FUNCTION_ARGS
);
133 extern Datum
timemi(PG_FUNCTION_ARGS
);
135 extern Datum
intinterval(PG_FUNCTION_ARGS
);
136 extern Datum
tintervalrel(PG_FUNCTION_ARGS
);
137 extern Datum
timenow(PG_FUNCTION_ARGS
);
138 extern Datum
reltimeeq(PG_FUNCTION_ARGS
);
139 extern Datum
reltimene(PG_FUNCTION_ARGS
);
140 extern Datum
reltimelt(PG_FUNCTION_ARGS
);
141 extern Datum
reltimegt(PG_FUNCTION_ARGS
);
142 extern Datum
reltimele(PG_FUNCTION_ARGS
);
143 extern Datum
reltimege(PG_FUNCTION_ARGS
);
144 extern Datum
tintervalsame(PG_FUNCTION_ARGS
);
145 extern Datum
tintervaleq(PG_FUNCTION_ARGS
);
146 extern Datum
tintervalne(PG_FUNCTION_ARGS
);
147 extern Datum
tintervallt(PG_FUNCTION_ARGS
);
148 extern Datum
tintervalgt(PG_FUNCTION_ARGS
);
149 extern Datum
tintervalle(PG_FUNCTION_ARGS
);
150 extern Datum
tintervalge(PG_FUNCTION_ARGS
);
151 extern Datum
tintervalleneq(PG_FUNCTION_ARGS
);
152 extern Datum
tintervallenne(PG_FUNCTION_ARGS
);
153 extern Datum
tintervallenlt(PG_FUNCTION_ARGS
);
154 extern Datum
tintervallengt(PG_FUNCTION_ARGS
);
155 extern Datum
tintervallenle(PG_FUNCTION_ARGS
);
156 extern Datum
tintervallenge(PG_FUNCTION_ARGS
);
157 extern Datum
tintervalct(PG_FUNCTION_ARGS
);
158 extern Datum
tintervalov(PG_FUNCTION_ARGS
);
159 extern Datum
tintervalstart(PG_FUNCTION_ARGS
);
160 extern Datum
tintervalend(PG_FUNCTION_ARGS
);
161 extern Datum
timeofday(PG_FUNCTION_ARGS
);
163 /* non-fmgr-callable support routines */
164 extern AbsoluteTime
GetCurrentAbsoluteTime(void);
165 extern void abstime2tm(AbsoluteTime time
, int *tzp
, struct pg_tm
* tm
, char **tzn
);
167 #endif /* NABSTIME_H */