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