00001 /*------------------------------------------------------------------------- 00002 * 00003 * nabstime.h 00004 * Definitions for the "new" abstime code. 00005 * 00006 * 00007 * Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group 00008 * Portions Copyright (c) 1994, Regents of the University of California 00009 * 00010 * src/include/utils/nabstime.h 00011 * 00012 *------------------------------------------------------------------------- 00013 */ 00014 #ifndef NABSTIME_H 00015 #define NABSTIME_H 00016 00017 #include <limits.h> 00018 00019 #include "fmgr.h" 00020 #include "pgtime.h" 00021 00022 00023 /* ---------------------------------------------------------------- 00024 * 00025 * time types + support macros 00026 * 00027 * ---------------------------------------------------------------- 00028 */ 00029 00030 /* 00031 * Although time_t generally is a long int on 64 bit systems, these two 00032 * types must be 4 bytes, because that's what pg_type.h assumes. They 00033 * should be yanked (long) before 2038 and be replaced by timestamp and 00034 * interval. 00035 */ 00036 typedef int32 AbsoluteTime; 00037 typedef int32 RelativeTime; 00038 00039 typedef struct 00040 { 00041 int32 status; 00042 AbsoluteTime data[2]; 00043 } TimeIntervalData; 00044 00045 typedef TimeIntervalData *TimeInterval; 00046 00047 /* 00048 * Macros for fmgr-callable functions. 00049 */ 00050 #define DatumGetAbsoluteTime(X) ((AbsoluteTime) DatumGetInt32(X)) 00051 #define DatumGetRelativeTime(X) ((RelativeTime) DatumGetInt32(X)) 00052 #define DatumGetTimeInterval(X) ((TimeInterval) DatumGetPointer(X)) 00053 00054 #define AbsoluteTimeGetDatum(X) Int32GetDatum(X) 00055 #define RelativeTimeGetDatum(X) Int32GetDatum(X) 00056 #define TimeIntervalGetDatum(X) PointerGetDatum(X) 00057 00058 #define PG_GETARG_ABSOLUTETIME(n) DatumGetAbsoluteTime(PG_GETARG_DATUM(n)) 00059 #define PG_GETARG_RELATIVETIME(n) DatumGetRelativeTime(PG_GETARG_DATUM(n)) 00060 #define PG_GETARG_TIMEINTERVAL(n) DatumGetTimeInterval(PG_GETARG_DATUM(n)) 00061 00062 #define PG_RETURN_ABSOLUTETIME(x) return AbsoluteTimeGetDatum(x) 00063 #define PG_RETURN_RELATIVETIME(x) return RelativeTimeGetDatum(x) 00064 #define PG_RETURN_TIMEINTERVAL(x) return TimeIntervalGetDatum(x) 00065 00066 /* 00067 * Reserved values 00068 * Epoch is Unix system time zero, but needs to be kept as a reserved 00069 * value rather than converting to time since timezone calculations 00070 * might move it away from 1970-01-01 00:00:00Z - tgl 97/02/20 00071 * 00072 * Pre-v6.1 code had large decimal numbers for reserved values. 00073 * These were chosen as special 32-bit bit patterns, 00074 * so redefine them explicitly using these bit patterns. - tgl 97/02/24 00075 */ 00076 #define INVALID_ABSTIME ((AbsoluteTime) 0x7FFFFFFE) /* 2147483647 (2^31 - 1) */ 00077 #define NOEND_ABSTIME ((AbsoluteTime) 0x7FFFFFFC) /* 2147483645 (2^31 - 3) */ 00078 #define NOSTART_ABSTIME ((AbsoluteTime) INT_MIN) /* -2147483648 */ 00079 00080 #define INVALID_RELTIME ((RelativeTime) 0x7FFFFFFE) /* 2147483647 (2^31 - 1) */ 00081 00082 #define AbsoluteTimeIsValid(time) \ 00083 ((bool) ((time) != INVALID_ABSTIME)) 00084 00085 /* 00086 * Because NOSTART_ABSTIME is defined as INT_MIN, there can't be any 00087 * AbsoluteTime values less than it. Therefore, we can code the test 00088 * "time > NOSTART_ABSTIME" as "time != NOSTART_ABSTIME", which avoids 00089 * compiler bugs on some platforms. --- tgl & az, 11/2000 00090 */ 00091 #define AbsoluteTimeIsReal(time) \ 00092 ((bool) (((AbsoluteTime) (time)) < NOEND_ABSTIME && \ 00093 ((AbsoluteTime) (time)) != NOSTART_ABSTIME)) 00094 00095 #define RelativeTimeIsValid(time) \ 00096 ((bool) (((RelativeTime) (time)) != INVALID_RELTIME)) 00097 00098 00099 /* 00100 * nabstime.c prototypes 00101 */ 00102 extern Datum abstimein(PG_FUNCTION_ARGS); 00103 extern Datum abstimeout(PG_FUNCTION_ARGS); 00104 extern Datum abstimerecv(PG_FUNCTION_ARGS); 00105 extern Datum abstimesend(PG_FUNCTION_ARGS); 00106 00107 extern Datum abstimeeq(PG_FUNCTION_ARGS); 00108 extern Datum abstimene(PG_FUNCTION_ARGS); 00109 extern Datum abstimelt(PG_FUNCTION_ARGS); 00110 extern Datum abstimegt(PG_FUNCTION_ARGS); 00111 extern Datum abstimele(PG_FUNCTION_ARGS); 00112 extern Datum abstimege(PG_FUNCTION_ARGS); 00113 extern Datum abstime_finite(PG_FUNCTION_ARGS); 00114 00115 extern Datum timestamp_abstime(PG_FUNCTION_ARGS); 00116 extern Datum abstime_timestamp(PG_FUNCTION_ARGS); 00117 extern Datum timestamptz_abstime(PG_FUNCTION_ARGS); 00118 extern Datum abstime_timestamptz(PG_FUNCTION_ARGS); 00119 00120 extern Datum reltimein(PG_FUNCTION_ARGS); 00121 extern Datum reltimeout(PG_FUNCTION_ARGS); 00122 extern Datum reltimerecv(PG_FUNCTION_ARGS); 00123 extern Datum reltimesend(PG_FUNCTION_ARGS); 00124 extern Datum tintervalin(PG_FUNCTION_ARGS); 00125 extern Datum tintervalout(PG_FUNCTION_ARGS); 00126 extern Datum tintervalrecv(PG_FUNCTION_ARGS); 00127 extern Datum tintervalsend(PG_FUNCTION_ARGS); 00128 extern Datum interval_reltime(PG_FUNCTION_ARGS); 00129 extern Datum reltime_interval(PG_FUNCTION_ARGS); 00130 extern Datum mktinterval(PG_FUNCTION_ARGS); 00131 extern Datum timepl(PG_FUNCTION_ARGS); 00132 extern Datum timemi(PG_FUNCTION_ARGS); 00133 00134 extern Datum intinterval(PG_FUNCTION_ARGS); 00135 extern Datum tintervalrel(PG_FUNCTION_ARGS); 00136 extern Datum timenow(PG_FUNCTION_ARGS); 00137 extern Datum reltimeeq(PG_FUNCTION_ARGS); 00138 extern Datum reltimene(PG_FUNCTION_ARGS); 00139 extern Datum reltimelt(PG_FUNCTION_ARGS); 00140 extern Datum reltimegt(PG_FUNCTION_ARGS); 00141 extern Datum reltimele(PG_FUNCTION_ARGS); 00142 extern Datum reltimege(PG_FUNCTION_ARGS); 00143 extern Datum tintervalsame(PG_FUNCTION_ARGS); 00144 extern Datum tintervaleq(PG_FUNCTION_ARGS); 00145 extern Datum tintervalne(PG_FUNCTION_ARGS); 00146 extern Datum tintervallt(PG_FUNCTION_ARGS); 00147 extern Datum tintervalgt(PG_FUNCTION_ARGS); 00148 extern Datum tintervalle(PG_FUNCTION_ARGS); 00149 extern Datum tintervalge(PG_FUNCTION_ARGS); 00150 extern Datum tintervalleneq(PG_FUNCTION_ARGS); 00151 extern Datum tintervallenne(PG_FUNCTION_ARGS); 00152 extern Datum tintervallenlt(PG_FUNCTION_ARGS); 00153 extern Datum tintervallengt(PG_FUNCTION_ARGS); 00154 extern Datum tintervallenle(PG_FUNCTION_ARGS); 00155 extern Datum tintervallenge(PG_FUNCTION_ARGS); 00156 extern Datum tintervalct(PG_FUNCTION_ARGS); 00157 extern Datum tintervalov(PG_FUNCTION_ARGS); 00158 extern Datum tintervalstart(PG_FUNCTION_ARGS); 00159 extern Datum tintervalend(PG_FUNCTION_ARGS); 00160 extern Datum timeofday(PG_FUNCTION_ARGS); 00161 00162 /* non-fmgr-callable support routines */ 00163 extern AbsoluteTime GetCurrentAbsoluteTime(void); 00164 extern void abstime2tm(AbsoluteTime time, int *tzp, struct pg_tm * tm, char **tzn); 00165 00166 #endif /* NABSTIME_H */