#include "postgres.h"#include <ctype.h>#include <float.h>#include <limits.h>#include <time.h>#include "libpq/pqformat.h"#include "miscadmin.h"#include "utils/builtins.h"#include "utils/datetime.h"#include "utils/nabstime.h"
Go to the source code of this file.
Defines | |
| #define | MIN_DAYNUM (-24856) |
| #define | MAX_DAYNUM 24854 |
| #define | IsSpace(C) ((C) == ' ') |
| #define | T_INTERVAL_INVAL 0 |
| #define | T_INTERVAL_VALID 1 |
| #define | T_INTERVAL_LEN 80 |
| #define | INVALID_INTERVAL_STR "Undefined Range" |
| #define | INVALID_INTERVAL_STR_LEN (sizeof(INVALID_INTERVAL_STR)-1) |
| #define | ABSTIMEMIN(t1, t2) |
| #define | ABSTIMEMAX(t1, t2) |
Functions | |
| static AbsoluteTime | tm2abstime (struct pg_tm *tm, int tz) |
| static void | reltime2tm (RelativeTime time, struct pg_tm *tm) |
| static void | parsetinterval (char *i_string, AbsoluteTime *i_start, AbsoluteTime *i_end) |
| AbsoluteTime | GetCurrentAbsoluteTime (void) |
| void | abstime2tm (AbsoluteTime _time, int *tzp, struct pg_tm *tm, char **tzn) |
| Datum | abstimein (PG_FUNCTION_ARGS) |
| Datum | abstimeout (PG_FUNCTION_ARGS) |
| Datum | abstimerecv (PG_FUNCTION_ARGS) |
| Datum | abstimesend (PG_FUNCTION_ARGS) |
| Datum | abstime_finite (PG_FUNCTION_ARGS) |
| static int | abstime_cmp_internal (AbsoluteTime a, AbsoluteTime b) |
| Datum | abstimeeq (PG_FUNCTION_ARGS) |
| Datum | abstimene (PG_FUNCTION_ARGS) |
| Datum | abstimelt (PG_FUNCTION_ARGS) |
| Datum | abstimegt (PG_FUNCTION_ARGS) |
| Datum | abstimele (PG_FUNCTION_ARGS) |
| Datum | abstimege (PG_FUNCTION_ARGS) |
| Datum | btabstimecmp (PG_FUNCTION_ARGS) |
| Datum | timestamp_abstime (PG_FUNCTION_ARGS) |
| Datum | abstime_timestamp (PG_FUNCTION_ARGS) |
| Datum | timestamptz_abstime (PG_FUNCTION_ARGS) |
| Datum | abstime_timestamptz (PG_FUNCTION_ARGS) |
| Datum | reltimein (PG_FUNCTION_ARGS) |
| Datum | reltimeout (PG_FUNCTION_ARGS) |
| Datum | reltimerecv (PG_FUNCTION_ARGS) |
| Datum | reltimesend (PG_FUNCTION_ARGS) |
| Datum | tintervalin (PG_FUNCTION_ARGS) |
| Datum | tintervalout (PG_FUNCTION_ARGS) |
| Datum | tintervalrecv (PG_FUNCTION_ARGS) |
| Datum | tintervalsend (PG_FUNCTION_ARGS) |
| Datum | interval_reltime (PG_FUNCTION_ARGS) |
| Datum | reltime_interval (PG_FUNCTION_ARGS) |
| Datum | mktinterval (PG_FUNCTION_ARGS) |
| Datum | timepl (PG_FUNCTION_ARGS) |
| Datum | timemi (PG_FUNCTION_ARGS) |
| Datum | intinterval (PG_FUNCTION_ARGS) |
| Datum | tintervalrel (PG_FUNCTION_ARGS) |
| Datum | timenow (PG_FUNCTION_ARGS) |
| static int | reltime_cmp_internal (RelativeTime a, RelativeTime b) |
| Datum | reltimeeq (PG_FUNCTION_ARGS) |
| Datum | reltimene (PG_FUNCTION_ARGS) |
| Datum | reltimelt (PG_FUNCTION_ARGS) |
| Datum | reltimegt (PG_FUNCTION_ARGS) |
| Datum | reltimele (PG_FUNCTION_ARGS) |
| Datum | reltimege (PG_FUNCTION_ARGS) |
| Datum | btreltimecmp (PG_FUNCTION_ARGS) |
| Datum | tintervalsame (PG_FUNCTION_ARGS) |
| static int | tinterval_cmp_internal (TimeInterval a, TimeInterval b) |
| Datum | tintervaleq (PG_FUNCTION_ARGS) |
| Datum | tintervalne (PG_FUNCTION_ARGS) |
| Datum | tintervallt (PG_FUNCTION_ARGS) |
| Datum | tintervalle (PG_FUNCTION_ARGS) |
| Datum | tintervalgt (PG_FUNCTION_ARGS) |
| Datum | tintervalge (PG_FUNCTION_ARGS) |
| Datum | bttintervalcmp (PG_FUNCTION_ARGS) |
| Datum | tintervalleneq (PG_FUNCTION_ARGS) |
| Datum | tintervallenne (PG_FUNCTION_ARGS) |
| Datum | tintervallenlt (PG_FUNCTION_ARGS) |
| Datum | tintervallengt (PG_FUNCTION_ARGS) |
| Datum | tintervallenle (PG_FUNCTION_ARGS) |
| Datum | tintervallenge (PG_FUNCTION_ARGS) |
| Datum | tintervalct (PG_FUNCTION_ARGS) |
| Datum | tintervalov (PG_FUNCTION_ARGS) |
| Datum | tintervalstart (PG_FUNCTION_ARGS) |
| Datum | tintervalend (PG_FUNCTION_ARGS) |
| Datum | timeofday (PG_FUNCTION_ARGS) |
| #define ABSTIMEMAX | ( | t1, | ||
| t2 | ||||
| ) |
(DatumGetBool(DirectFunctionCall2(abstimelt, \ AbsoluteTimeGetDatum(t1), \ AbsoluteTimeGetDatum(t2))) ? (t2) : (t1))
Definition at line 63 of file nabstime.c.
Referenced by mktinterval(), and tintervalin().
| #define ABSTIMEMIN | ( | t1, | ||
| t2 | ||||
| ) |
(DatumGetBool(DirectFunctionCall2(abstimele, \ AbsoluteTimeGetDatum(t1), \ AbsoluteTimeGetDatum(t2))) ? (t1) : (t2))
Definition at line 59 of file nabstime.c.
Referenced by mktinterval(), and tintervalin().
| #define INVALID_INTERVAL_STR "Undefined Range" |
Definition at line 56 of file nabstime.c.
Referenced by parsetinterval(), and tintervalout().
| #define INVALID_INTERVAL_STR_LEN (sizeof(INVALID_INTERVAL_STR)-1) |
Definition at line 57 of file nabstime.c.
| #define IsSpace | ( | C | ) | ((C) == ' ') |
Definition at line 43 of file nabstime.c.
Referenced by parsetinterval().
| #define MAX_DAYNUM 24854 |
Definition at line 32 of file nabstime.c.
Referenced by tm2abstime().
| #define MIN_DAYNUM (-24856) |
Definition at line 31 of file nabstime.c.
| #define T_INTERVAL_INVAL 0 |
Definition at line 45 of file nabstime.c.
Referenced by tinterval_cmp_internal(), tintervalct(), tintervalend(), tintervalleneq(), tintervallenge(), tintervallengt(), tintervallenle(), tintervallenlt(), tintervallenne(), tintervalout(), tintervalov(), tintervalsame(), and tintervalstart().
| #define T_INTERVAL_LEN 80 |
Definition at line 55 of file nabstime.c.
Referenced by tintervalout().
| #define T_INTERVAL_VALID 1 |
Definition at line 46 of file nabstime.c.
Referenced by intinterval(), and tintervalrel().
| void abstime2tm | ( | AbsoluteTime | _time, | |
| int * | tzp, | |||
| struct pg_tm * | tm, | |||
| char ** | tzn | |||
| ) |
Definition at line 98 of file nabstime.c.
References CTimeZone, ereport, errcode(), errmsg(), HasCTZSet, MAXTZLEN, NULL, pg_gmtime(), pg_localtime(), session_timezone, StrNCpy, pg_tm::tm_gmtoff, pg_tm::tm_hour, pg_tm::tm_isdst, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, pg_tm::tm_year, pg_tm::tm_zone, and WARNING.
Referenced by abstime_date(), abstime_timestamp(), abstime_timestamptz(), abstimeout(), and GetCurrentDateTime().
{
pg_time_t time = (pg_time_t) _time;
struct pg_tm *tx;
/*
* If HasCTZSet is true then we have a brute force time zone specified. Go
* ahead and rotate to the local time zone since we will later bypass any
* calls which adjust the tm fields.
*/
if (HasCTZSet && (tzp != NULL))
time -= CTimeZone;
if (!HasCTZSet && tzp != NULL)
tx = pg_localtime(&time, session_timezone);
else
tx = pg_gmtime(&time);
tm->tm_year = tx->tm_year + 1900;
tm->tm_mon = tx->tm_mon + 1;
tm->tm_mday = tx->tm_mday;
tm->tm_hour = tx->tm_hour;
tm->tm_min = tx->tm_min;
tm->tm_sec = tx->tm_sec;
tm->tm_isdst = tx->tm_isdst;
tm->tm_gmtoff = tx->tm_gmtoff;
tm->tm_zone = tx->tm_zone;
if (tzp != NULL)
{
/*
* We have a brute force time zone per SQL99? Then use it without
* change since we have already rotated to the time zone.
*/
if (HasCTZSet)
{
*tzp = CTimeZone;
tm->tm_gmtoff = CTimeZone;
tm->tm_isdst = 0;
tm->tm_zone = NULL;
if (tzn != NULL)
*tzn = NULL;
}
else
{
*tzp = -tm->tm_gmtoff; /* tm_gmtoff is Sun/DEC-ism */
/*
* XXX FreeBSD man pages indicate that this should work - tgl
* 97/04/23
*/
if (tzn != NULL)
{
/*
* Copy no more than MAXTZLEN bytes of timezone to tzn, in
* case it contains an error message, which doesn't fit in the
* buffer
*/
StrNCpy(*tzn, tm->tm_zone, MAXTZLEN + 1);
if (strlen(tm->tm_zone) > MAXTZLEN)
ereport(WARNING,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid time zone name: \"%s\"",
tm->tm_zone)));
}
}
}
else
tm->tm_isdst = -1;
}
| static int abstime_cmp_internal | ( | AbsoluteTime | a, | |
| AbsoluteTime | b | |||
| ) | [static] |
Definition at line 365 of file nabstime.c.
References INVALID_ABSTIME.
Referenced by abstimeeq(), abstimege(), abstimegt(), abstimele(), abstimelt(), abstimene(), and btabstimecmp().
{
/*
* We consider all INVALIDs to be equal and larger than any non-INVALID.
* This is somewhat arbitrary; the important thing is to have a consistent
* sort order.
*/
if (a == INVALID_ABSTIME)
{
if (b == INVALID_ABSTIME)
return 0; /* INVALID = INVALID */
else
return 1; /* INVALID > non-INVALID */
}
if (b == INVALID_ABSTIME)
return -1; /* non-INVALID < INVALID */
if (a > b)
return 1;
else if (a == b)
return 0;
else
return -1;
}
| Datum abstime_finite | ( | PG_FUNCTION_ARGS | ) |
Definition at line 351 of file nabstime.c.
References INVALID_ABSTIME, NOEND_ABSTIME, NOSTART_ABSTIME, PG_GETARG_ABSOLUTETIME, and PG_RETURN_BOOL.
{
AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
PG_RETURN_BOOL(abstime != INVALID_ABSTIME &&
abstime != NOSTART_ABSTIME &&
abstime != NOEND_ABSTIME);
}
| Datum abstime_timestamp | ( | PG_FUNCTION_ARGS | ) |
Definition at line 492 of file nabstime.c.
References abstime2tm(), ereport, errcode(), errmsg(), ERROR, INVALID_ABSTIME, MAXDATELEN, NOEND_ABSTIME, NOSTART_ABSTIME, NULL, PG_GETARG_ABSOLUTETIME, PG_RETURN_TIMESTAMP, TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, tm, and tm2timestamp().
Referenced by convert_timevalue_to_scalar().
{
AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
Timestamp result;
struct pg_tm tt,
*tm = &tt;
int tz;
char zone[MAXDATELEN + 1],
*tzn = zone;
switch (abstime)
{
case INVALID_ABSTIME:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot convert abstime \"invalid\" to timestamp")));
TIMESTAMP_NOBEGIN(result);
break;
case NOSTART_ABSTIME:
TIMESTAMP_NOBEGIN(result);
break;
case NOEND_ABSTIME:
TIMESTAMP_NOEND(result);
break;
default:
abstime2tm(abstime, &tz, tm, &tzn);
if (tm2timestamp(tm, 0, NULL, &result) != 0)
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg("timestamp out of range")));
break;
};
PG_RETURN_TIMESTAMP(result);
}
| Datum abstime_timestamptz | ( | PG_FUNCTION_ARGS | ) |
Definition at line 565 of file nabstime.c.
References abstime2tm(), ereport, errcode(), errmsg(), ERROR, INVALID_ABSTIME, MAXDATELEN, NOEND_ABSTIME, NOSTART_ABSTIME, PG_GETARG_ABSOLUTETIME, PG_RETURN_TIMESTAMP, TIMESTAMP_NOBEGIN, TIMESTAMP_NOEND, tm, and tm2timestamp().
{
AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
TimestampTz result;
struct pg_tm tt,
*tm = &tt;
int tz;
char zone[MAXDATELEN + 1],
*tzn = zone;
switch (abstime)
{
case INVALID_ABSTIME:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot convert abstime \"invalid\" to timestamp")));
TIMESTAMP_NOBEGIN(result);
break;
case NOSTART_ABSTIME:
TIMESTAMP_NOBEGIN(result);
break;
case NOEND_ABSTIME:
TIMESTAMP_NOEND(result);
break;
default:
abstime2tm(abstime, &tz, tm, &tzn);
if (tm2timestamp(tm, 0, &tz, &result) != 0)
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg("timestamp out of range")));
break;
};
PG_RETURN_TIMESTAMP(result);
}
| Datum abstimeeq | ( | PG_FUNCTION_ARGS | ) |
Definition at line 392 of file nabstime.c.
References abstime_cmp_internal(), PG_GETARG_ABSOLUTETIME, and PG_RETURN_BOOL.
Referenced by tintervalsame().
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
PG_RETURN_BOOL(abstime_cmp_internal(t1, t2) == 0);
}
| Datum abstimege | ( | PG_FUNCTION_ARGS | ) |
Definition at line 437 of file nabstime.c.
References abstime_cmp_internal(), PG_GETARG_ABSOLUTETIME, and PG_RETURN_BOOL.
Referenced by intinterval(), and tintervalct().
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
PG_RETURN_BOOL(abstime_cmp_internal(t1, t2) >= 0);
}
| Datum abstimegt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 419 of file nabstime.c.
References abstime_cmp_internal(), PG_GETARG_ABSOLUTETIME, and PG_RETURN_BOOL.
Referenced by tintervalov().
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
PG_RETURN_BOOL(abstime_cmp_internal(t1, t2) > 0);
}
| Datum abstimein | ( | PG_FUNCTION_ARGS | ) |
Definition at line 221 of file nabstime.c.
References DateTimeParseError(), DecodeDateTime(), DTK_DATE, DTK_EARLY, DTK_EPOCH, DTK_INVALID, DTK_LATE, elog, ERROR, MAXDATEFIELDS, MAXDATELEN, ParseDateTime(), PG_GETARG_CSTRING, PG_RETURN_ABSOLUTETIME, tm, and tm2abstime().
Referenced by parsetinterval().
{
char *str = PG_GETARG_CSTRING(0);
AbsoluteTime result;
fsec_t fsec;
int tz = 0;
struct pg_tm date,
*tm = &date;
int dterr;
char *field[MAXDATEFIELDS];
char workbuf[MAXDATELEN + 1];
int dtype;
int nf,
ftype[MAXDATEFIELDS];
dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
field, ftype, MAXDATEFIELDS, &nf);
if (dterr == 0)
dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz);
if (dterr != 0)
DateTimeParseError(dterr, str, "abstime");
switch (dtype)
{
case DTK_DATE:
result = tm2abstime(tm, tz);
break;
case DTK_EPOCH:
/*
* Don't bother retaining this as a reserved value, but instead
* just set to the actual epoch time (1970-01-01)
*/
result = 0;
break;
case DTK_LATE:
result = NOEND_ABSTIME;
break;
case DTK_EARLY:
result = NOSTART_ABSTIME;
break;
case DTK_INVALID:
result = INVALID_ABSTIME;
break;
default:
elog(ERROR, "unexpected dtype %d while parsing abstime \"%s\"",
dtype, str);
result = INVALID_ABSTIME;
break;
};
PG_RETURN_ABSOLUTETIME(result);
}
| Datum abstimele | ( | PG_FUNCTION_ARGS | ) |
Definition at line 428 of file nabstime.c.
References abstime_cmp_internal(), PG_GETARG_ABSOLUTETIME, and PG_RETURN_BOOL.
Referenced by intinterval(), and tintervalct().
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
PG_RETURN_BOOL(abstime_cmp_internal(t1, t2) <= 0);
}
| Datum abstimelt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 410 of file nabstime.c.
References abstime_cmp_internal(), PG_GETARG_ABSOLUTETIME, and PG_RETURN_BOOL.
Referenced by tintervalov().
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
PG_RETURN_BOOL(abstime_cmp_internal(t1, t2) < 0);
}
| Datum abstimene | ( | PG_FUNCTION_ARGS | ) |
Definition at line 401 of file nabstime.c.
References abstime_cmp_internal(), PG_GETARG_ABSOLUTETIME, and PG_RETURN_BOOL.
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
PG_RETURN_BOOL(abstime_cmp_internal(t1, t2) != 0);
}
| Datum abstimeout | ( | PG_FUNCTION_ARGS | ) |
Definition at line 285 of file nabstime.c.
References abstime2tm(), buf, DateStyle, EARLY, EncodeDateTime(), INVALID, INVALID_ABSTIME, LATE, MAXDATELEN, NOEND_ABSTIME, NOSTART_ABSTIME, PG_GETARG_ABSOLUTETIME, PG_RETURN_CSTRING, pstrdup(), and tm.
Referenced by tintervalout().
{
AbsoluteTime time = PG_GETARG_ABSOLUTETIME(0);
char *result;
int tz;
double fsec = 0;
struct pg_tm tt,
*tm = &tt;
char buf[MAXDATELEN + 1];
char zone[MAXDATELEN + 1],
*tzn = zone;
switch (time)
{
/*
* Note that timestamp no longer supports 'invalid'. Retain
* 'invalid' for abstime for now, but dump it someday.
*/
case INVALID_ABSTIME:
strcpy(buf, INVALID);
break;
case NOEND_ABSTIME:
strcpy(buf, LATE);
break;
case NOSTART_ABSTIME:
strcpy(buf, EARLY);
break;
default:
abstime2tm(time, &tz, tm, &tzn);
EncodeDateTime(tm, fsec, true, tz, tzn, DateStyle, buf);
break;
}
result = pstrdup(buf);
PG_RETURN_CSTRING(result);
}
| Datum abstimerecv | ( | PG_FUNCTION_ARGS | ) |
Definition at line 326 of file nabstime.c.
References buf, PG_GETARG_POINTER, PG_RETURN_ABSOLUTETIME, and pq_getmsgint().
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
PG_RETURN_ABSOLUTETIME((AbsoluteTime) pq_getmsgint(buf, sizeof(AbsoluteTime)));
}
| Datum abstimesend | ( | PG_FUNCTION_ARGS | ) |
Definition at line 337 of file nabstime.c.
References buf, PG_GETARG_ABSOLUTETIME, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), and pq_sendint().
{
AbsoluteTime time = PG_GETARG_ABSOLUTETIME(0);
StringInfoData buf;
pq_begintypsend(&buf);
pq_sendint(&buf, time, sizeof(time));
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
| Datum btabstimecmp | ( | PG_FUNCTION_ARGS | ) |
Definition at line 446 of file nabstime.c.
References abstime_cmp_internal(), PG_GETARG_ABSOLUTETIME, and PG_RETURN_INT32.
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
PG_RETURN_INT32(abstime_cmp_internal(t1, t2));
}
| Datum btreltimecmp | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1124 of file nabstime.c.
References PG_GETARG_RELATIVETIME, PG_RETURN_INT32, and reltime_cmp_internal().
{
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
PG_RETURN_INT32(reltime_cmp_internal(t1, t2));
}
| Datum bttintervalcmp | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1273 of file nabstime.c.
References PG_GETARG_TIMEINTERVAL, PG_RETURN_INT32, and tinterval_cmp_internal().
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
PG_RETURN_INT32(tinterval_cmp_internal(i1, i2));
}
| AbsoluteTime GetCurrentAbsoluteTime | ( | void | ) |
Definition at line 88 of file nabstime.c.
References NULL.
Referenced by timenow(), and timetravel().
{
time_t now;
now = time(NULL);
return (AbsoluteTime) now;
}
| Datum interval_reltime | ( | PG_FUNCTION_ARGS | ) |
Definition at line 834 of file nabstime.c.
References Interval::day, DAYS_PER_MONTH, DAYS_PER_YEAR, INT64CONST, Interval::month, PG_GETARG_INTERVAL_P, PG_RETURN_RELATIVETIME, SECS_PER_DAY, Interval::time, and USECS_PER_SEC.
{
Interval *interval = PG_GETARG_INTERVAL_P(0);
RelativeTime time;
int year,
month,
day;
TimeOffset span;
year = interval->month / MONTHS_PER_YEAR;
month = interval->month % MONTHS_PER_YEAR;
day = interval->day;
#ifdef HAVE_INT64_TIMESTAMP
span = ((INT64CONST(365250000) * year + INT64CONST(30000000) * month +
INT64CONST(1000000) * day) * INT64CONST(86400)) +
interval->time;
span /= USECS_PER_SEC;
#else
span = (DAYS_PER_YEAR * year + (double) DAYS_PER_MONTH * month + day) * SECS_PER_DAY + interval->time;
#endif
if (span < INT_MIN || span > INT_MAX)
time = INVALID_RELTIME;
else
time = span;
PG_RETURN_RELATIVETIME(time);
}
| Datum intinterval | ( | PG_FUNCTION_ARGS | ) |
Definition at line 989 of file nabstime.c.
References AbsoluteTimeGetDatum, abstimege(), abstimele(), TimeIntervalData::data, DatumGetBool, DirectFunctionCall2, INVALID_ABSTIME, PG_GETARG_ABSOLUTETIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, and T_INTERVAL_VALID.
{
AbsoluteTime t = PG_GETARG_ABSOLUTETIME(0);
TimeInterval tinterval = PG_GETARG_TIMEINTERVAL(1);
if (tinterval->status == T_INTERVAL_VALID && t != INVALID_ABSTIME)
{
if (DatumGetBool(DirectFunctionCall2(abstimege,
AbsoluteTimeGetDatum(t),
AbsoluteTimeGetDatum(tinterval->data[0]))) &&
DatumGetBool(DirectFunctionCall2(abstimele,
AbsoluteTimeGetDatum(t),
AbsoluteTimeGetDatum(tinterval->data[1]))))
PG_RETURN_BOOL(true);
}
PG_RETURN_BOOL(false);
}
| Datum mktinterval | ( | PG_FUNCTION_ARGS | ) |
Definition at line 917 of file nabstime.c.
References ABSTIMEMAX, ABSTIMEMIN, TimeIntervalData::data, INVALID_ABSTIME, palloc(), PG_GETARG_ABSOLUTETIME, PG_RETURN_TIMEINTERVAL, and TimeIntervalData::status.
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
AbsoluteTime tstart = ABSTIMEMIN(t1, t2);
AbsoluteTime tend = ABSTIMEMAX(t1, t2);
TimeInterval tinterval;
tinterval = (TimeInterval) palloc(sizeof(TimeIntervalData));
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
tinterval->status = T_INTERVAL_INVAL;
else
{
tinterval->status = T_INTERVAL_VALID;
tinterval->data[0] = tstart;
tinterval->data[1] = tend;
}
PG_RETURN_TIMEINTERVAL(tinterval);
}
| static void parsetinterval | ( | char * | i_string, | |
| AbsoluteTime * | i_start, | |||
| AbsoluteTime * | i_end | |||
| ) | [static] |
Definition at line 1469 of file nabstime.c.
References abstimein(), CStringGetDatum, DatumGetAbsoluteTime, DirectFunctionCall1, ereport, errcode(), errmsg(), ERROR, INVALID_INTERVAL_STR, and IsSpace.
Referenced by tintervalin().
{
char *p,
*p1;
char c;
p = i_string;
/* skip leading blanks up to '[' */
while ((c = *p) != '\0')
{
if (IsSpace(c))
p++;
else if (c != '[')
goto bogus; /* syntax error */
else
break;
}
if (c == '\0')
goto bogus; /* syntax error */
p++;
/* skip leading blanks up to '"' */
while ((c = *p) != '\0')
{
if (IsSpace(c))
p++;
else if (c != '"')
goto bogus; /* syntax error */
else
break;
}
if (c == '\0')
goto bogus; /* syntax error */
p++;
if (strncmp(INVALID_INTERVAL_STR, p, strlen(INVALID_INTERVAL_STR)) == 0)
goto bogus; /* undefined range, handled like a syntax err. */
/* search for the end of the first date and change it to a \0 */
p1 = p;
while ((c = *p1) != '\0')
{
if (c == '"')
break;
p1++;
}
if (c == '\0')
goto bogus; /* syntax error */
*p1 = '\0';
/* get the first date */
*i_start = DatumGetAbsoluteTime(DirectFunctionCall1(abstimein,
CStringGetDatum(p)));
/* undo change to \0 */
*p1 = c;
p = ++p1;
/* skip blanks up to '"', beginning of second date */
while ((c = *p) != '\0')
{
if (IsSpace(c))
p++;
else if (c != '"')
goto bogus; /* syntax error */
else
break;
}
if (c == '\0')
goto bogus; /* syntax error */
p++;
/* search for the end of the second date and change it to a \0 */
p1 = p;
while ((c = *p1) != '\0')
{
if (c == '"')
break;
p1++;
}
if (c == '\0')
goto bogus; /* syntax error */
*p1 = '\0';
/* get the second date */
*i_end = DatumGetAbsoluteTime(DirectFunctionCall1(abstimein,
CStringGetDatum(p)));
/* undo change to \0 */
*p1 = c;
p = ++p1;
/* skip blanks up to ']' */
while ((c = *p) != '\0')
{
if (IsSpace(c))
p++;
else if (c != ']')
goto bogus; /* syntax error */
else
break;
}
if (c == '\0')
goto bogus; /* syntax error */
p++;
c = *p;
if (c != '\0')
goto bogus; /* syntax error */
/* it seems to be a valid tinterval */
return;
bogus:
ereport(ERROR,
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
errmsg("invalid input syntax for type tinterval: \"%s\"",
i_string)));
*i_start = *i_end = INVALID_ABSTIME; /* keep compiler quiet */
}
| static void reltime2tm | ( | RelativeTime | time, | |
| struct pg_tm * | tm | |||
| ) | [static] |
Definition at line 708 of file nabstime.c.
References FMODULO, SECS_PER_DAY, SECS_PER_HOUR, SECS_PER_MINUTE, pg_tm::tm_hour, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, and pg_tm::tm_year.
Referenced by reltimeout().
{
double dtime = time;
FMODULO(dtime, tm->tm_year, 31557600);
FMODULO(dtime, tm->tm_mon, 2592000);
FMODULO(dtime, tm->tm_mday, SECS_PER_DAY);
FMODULO(dtime, tm->tm_hour, SECS_PER_HOUR);
FMODULO(dtime, tm->tm_min, SECS_PER_MINUTE);
FMODULO(dtime, tm->tm_sec, 1);
}
| static int reltime_cmp_internal | ( | RelativeTime | a, | |
| RelativeTime | b | |||
| ) | [static] |
Definition at line 1043 of file nabstime.c.
References INVALID_RELTIME.
Referenced by btreltimecmp(), reltimeeq(), reltimege(), reltimegt(), reltimele(), reltimelt(), and reltimene().
{
/*
* We consider all INVALIDs to be equal and larger than any non-INVALID.
* This is somewhat arbitrary; the important thing is to have a consistent
* sort order.
*/
if (a == INVALID_RELTIME)
{
if (b == INVALID_RELTIME)
return 0; /* INVALID = INVALID */
else
return 1; /* INVALID > non-INVALID */
}
if (b == INVALID_RELTIME)
return -1; /* non-INVALID < INVALID */
if (a > b)
return 1;
else if (a == b)
return 0;
else
return -1;
}
| Datum reltime_interval | ( | PG_FUNCTION_ARGS | ) |
Definition at line 866 of file nabstime.c.
References Interval::day, DAYS_PER_MONTH, ereport, errcode(), errmsg(), ERROR, INVALID_RELTIME, Interval::month, MONTHS_PER_YEAR, palloc(), PG_GETARG_RELATIVETIME, PG_RETURN_INTERVAL_P, Interval::time, and TMODULO.
{
RelativeTime reltime = PG_GETARG_RELATIVETIME(0);
Interval *result;
int year,
month,
day;
result = (Interval *) palloc(sizeof(Interval));
switch (reltime)
{
case INVALID_RELTIME:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot convert reltime \"invalid\" to interval")));
result->time = 0;
result->day = 0;
result->month = 0;
break;
default:
#ifdef HAVE_INT64_TIMESTAMP
year = reltime / SECS_PER_YEAR;
reltime -= year * SECS_PER_YEAR;
month = reltime / (DAYS_PER_MONTH * SECS_PER_DAY);
reltime -= month * (DAYS_PER_MONTH * SECS_PER_DAY);
day = reltime / SECS_PER_DAY;
reltime -= day * SECS_PER_DAY;
result->time = (reltime * USECS_PER_SEC);
#else
TMODULO(reltime, year, SECS_PER_YEAR);
TMODULO(reltime, month, DAYS_PER_MONTH * SECS_PER_DAY);
TMODULO(reltime, day, SECS_PER_DAY);
result->time = reltime;
#endif
result->month = MONTHS_PER_YEAR * year + month;
result->day = day;
break;
}
PG_RETURN_INTERVAL_P(result);
}
| Datum reltimeeq | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1070 of file nabstime.c.
References PG_GETARG_RELATIVETIME, PG_RETURN_BOOL, and reltime_cmp_internal().
{
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
PG_RETURN_BOOL(reltime_cmp_internal(t1, t2) == 0);
}
| Datum reltimege | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1115 of file nabstime.c.
References PG_GETARG_RELATIVETIME, PG_RETURN_BOOL, and reltime_cmp_internal().
{
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
PG_RETURN_BOOL(reltime_cmp_internal(t1, t2) >= 0);
}
| Datum reltimegt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1097 of file nabstime.c.
References PG_GETARG_RELATIVETIME, PG_RETURN_BOOL, and reltime_cmp_internal().
{
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
PG_RETURN_BOOL(reltime_cmp_internal(t1, t2) > 0);
}
| Datum reltimein | ( | PG_FUNCTION_ARGS | ) |
Definition at line 613 of file nabstime.c.
References DateTimeParseError(), DecodeInterval(), DecodeISO8601Interval(), DTERR_BAD_FORMAT, DTERR_FIELD_OVERFLOW, DTK_DELTA, elog, ERROR, INTERVAL_FULL_RANGE, MAXDATEFIELDS, MAXDATELEN, MINS_PER_HOUR, ParseDateTime(), PG_GETARG_CSTRING, PG_RETURN_RELATIVETIME, SECS_PER_MINUTE, SECS_PER_YEAR, tm, pg_tm::tm_hour, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, and pg_tm::tm_year.
{
char *str = PG_GETARG_CSTRING(0);
RelativeTime result;
struct pg_tm tt,
*tm = &tt;
fsec_t fsec;
int dtype;
int dterr;
char *field[MAXDATEFIELDS];
int nf,
ftype[MAXDATEFIELDS];
char workbuf[MAXDATELEN + 1];
dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
field, ftype, MAXDATEFIELDS, &nf);
if (dterr == 0)
dterr = DecodeInterval(field, ftype, nf, INTERVAL_FULL_RANGE,
&dtype, tm, &fsec);
/* if those functions think it's a bad format, try ISO8601 style */
if (dterr == DTERR_BAD_FORMAT)
dterr = DecodeISO8601Interval(str,
&dtype, tm, &fsec);
if (dterr != 0)
{
if (dterr == DTERR_FIELD_OVERFLOW)
dterr = DTERR_INTERVAL_OVERFLOW;
DateTimeParseError(dterr, str, "reltime");
}
switch (dtype)
{
case DTK_DELTA:
result = ((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec;
result += tm->tm_year * SECS_PER_YEAR + ((tm->tm_mon * DAYS_PER_MONTH) + tm->tm_mday) * SECS_PER_DAY;
break;
default:
elog(ERROR, "unexpected dtype %d while parsing reltime \"%s\"",
dtype, str);
result = INVALID_RELTIME;
break;
}
PG_RETURN_RELATIVETIME(result);
}
| Datum reltimele | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1106 of file nabstime.c.
References PG_GETARG_RELATIVETIME, PG_RETURN_BOOL, and reltime_cmp_internal().
{
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
PG_RETURN_BOOL(reltime_cmp_internal(t1, t2) <= 0);
}
| Datum reltimelt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1088 of file nabstime.c.
References PG_GETARG_RELATIVETIME, PG_RETURN_BOOL, and reltime_cmp_internal().
{
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
PG_RETURN_BOOL(reltime_cmp_internal(t1, t2) < 0);
}
| Datum reltimene | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1079 of file nabstime.c.
References PG_GETARG_RELATIVETIME, PG_RETURN_BOOL, and reltime_cmp_internal().
{
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
PG_RETURN_BOOL(reltime_cmp_internal(t1, t2) != 0);
}
| Datum reltimeout | ( | PG_FUNCTION_ARGS | ) |
Definition at line 666 of file nabstime.c.
References buf, EncodeInterval(), IntervalStyle, MAXDATELEN, PG_GETARG_RELATIVETIME, PG_RETURN_CSTRING, pstrdup(), reltime2tm(), and tm.
{
RelativeTime time = PG_GETARG_RELATIVETIME(0);
char *result;
struct pg_tm tt,
*tm = &tt;
char buf[MAXDATELEN + 1];
reltime2tm(time, tm);
EncodeInterval(tm, 0, IntervalStyle, buf);
result = pstrdup(buf);
PG_RETURN_CSTRING(result);
}
| Datum reltimerecv | ( | PG_FUNCTION_ARGS | ) |
Definition at line 685 of file nabstime.c.
References buf, PG_GETARG_POINTER, PG_RETURN_RELATIVETIME, and pq_getmsgint().
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
PG_RETURN_RELATIVETIME((RelativeTime) pq_getmsgint(buf, sizeof(RelativeTime)));
}
| Datum reltimesend | ( | PG_FUNCTION_ARGS | ) |
Definition at line 696 of file nabstime.c.
References buf, PG_GETARG_RELATIVETIME, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), and pq_sendint().
{
RelativeTime time = PG_GETARG_RELATIVETIME(0);
StringInfoData buf;
pq_begintypsend(&buf);
pq_sendint(&buf, time, sizeof(time));
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
| Datum timemi | ( | PG_FUNCTION_ARGS | ) |
Definition at line 970 of file nabstime.c.
References AbsoluteTimeIsReal, INVALID_ABSTIME, NOEND_ABSTIME, NOSTART_ABSTIME, PG_GETARG_ABSOLUTETIME, PG_GETARG_RELATIVETIME, PG_RETURN_ABSOLUTETIME, and RelativeTimeIsValid.
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (AbsoluteTimeIsReal(t1) &&
RelativeTimeIsValid(t2) &&
((t2 > 0 && t1 > NOSTART_ABSTIME + t2) ||
(t2 <= 0 && t1 < NOEND_ABSTIME + t2))) /* prevent overflow */
PG_RETURN_ABSOLUTETIME(t1 - t2);
PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
}
| Datum timenow | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1034 of file nabstime.c.
References GetCurrentAbsoluteTime(), and PG_RETURN_ABSOLUTETIME.
| Datum timeofday | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1594 of file nabstime.c.
References buf, cstring_to_text(), gettimeofday(), NULL, pg_localtime(), PG_RETURN_TEXT_P, pg_strftime(), session_timezone, and snprintf().
{
struct timeval tp;
char templ[128];
char buf[128];
pg_time_t tt;
gettimeofday(&tp, NULL);
tt = (pg_time_t) tp.tv_sec;
pg_strftime(templ, sizeof(templ), "%a %b %d %H:%M:%S.%%06d %Y %Z",
pg_localtime(&tt, session_timezone));
snprintf(buf, sizeof(buf), templ, tp.tv_usec);
PG_RETURN_TEXT_P(cstring_to_text(buf));
}
| Datum timepl | ( | PG_FUNCTION_ARGS | ) |
Definition at line 951 of file nabstime.c.
References AbsoluteTimeIsReal, INVALID_ABSTIME, NOEND_ABSTIME, NOSTART_ABSTIME, PG_GETARG_ABSOLUTETIME, PG_GETARG_RELATIVETIME, PG_RETURN_ABSOLUTETIME, and RelativeTimeIsValid.
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (AbsoluteTimeIsReal(t1) &&
RelativeTimeIsValid(t2) &&
((t2 > 0 && t1 < NOEND_ABSTIME - t2) ||
(t2 <= 0 && t1 > NOSTART_ABSTIME - t2))) /* prevent overflow */
PG_RETURN_ABSOLUTETIME(t1 + t2);
PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
}
| Datum timestamp_abstime | ( | PG_FUNCTION_ARGS | ) |
Definition at line 459 of file nabstime.c.
References DetermineTimeZoneOffset(), ereport, errcode(), errmsg(), ERROR, NULL, PG_GETARG_TIMESTAMP, PG_RETURN_ABSOLUTETIME, session_timezone, timestamp2tm(), TIMESTAMP_IS_NOBEGIN, TIMESTAMP_IS_NOEND, tm, and tm2abstime().
{
Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
AbsoluteTime result;
fsec_t fsec;
int tz;
struct pg_tm tt,
*tm = &tt;
if (TIMESTAMP_IS_NOBEGIN(timestamp))
result = NOSTART_ABSTIME;
else if (TIMESTAMP_IS_NOEND(timestamp))
result = NOEND_ABSTIME;
else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
{
tz = DetermineTimeZoneOffset(tm, session_timezone);
result = tm2abstime(tm, tz);
}
else
{
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg("timestamp out of range")));
result = INVALID_ABSTIME;
}
PG_RETURN_ABSOLUTETIME(result);
}
| Datum timestamptz_abstime | ( | PG_FUNCTION_ARGS | ) |
Definition at line 536 of file nabstime.c.
References ereport, errcode(), errmsg(), ERROR, NULL, PG_GETARG_TIMESTAMP, PG_RETURN_ABSOLUTETIME, timestamp2tm(), TIMESTAMP_IS_NOBEGIN, TIMESTAMP_IS_NOEND, tm, and tm2abstime().
{
TimestampTz timestamp = PG_GETARG_TIMESTAMP(0);
AbsoluteTime result;
fsec_t fsec;
struct pg_tm tt,
*tm = &tt;
if (TIMESTAMP_IS_NOBEGIN(timestamp))
result = NOSTART_ABSTIME;
else if (TIMESTAMP_IS_NOEND(timestamp))
result = NOEND_ABSTIME;
else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
result = tm2abstime(tm, 0);
else
{
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg("timestamp out of range")));
result = INVALID_ABSTIME;
}
PG_RETURN_ABSOLUTETIME(result);
}
| static int tinterval_cmp_internal | ( | TimeInterval | a, | |
| TimeInterval | b | |||
| ) | [static] |
Definition at line 1177 of file nabstime.c.
References TimeIntervalData::data, INVALID_ABSTIME, TimeIntervalData::status, and T_INTERVAL_INVAL.
Referenced by bttintervalcmp(), tintervaleq(), tintervalge(), tintervalgt(), tintervalle(), tintervallt(), and tintervalne().
{
bool a_invalid;
bool b_invalid;
AbsoluteTime a_len;
AbsoluteTime b_len;
/*
* We consider all INVALIDs to be equal and larger than any non-INVALID.
* This is somewhat arbitrary; the important thing is to have a consistent
* sort order.
*/
a_invalid = a->status == T_INTERVAL_INVAL ||
a->data[0] == INVALID_ABSTIME ||
a->data[1] == INVALID_ABSTIME;
b_invalid = b->status == T_INTERVAL_INVAL ||
b->data[0] == INVALID_ABSTIME ||
b->data[1] == INVALID_ABSTIME;
if (a_invalid)
{
if (b_invalid)
return 0; /* INVALID = INVALID */
else
return 1; /* INVALID > non-INVALID */
}
if (b_invalid)
return -1; /* non-INVALID < INVALID */
a_len = a->data[1] - a->data[0];
b_len = b->data[1] - b->data[0];
if (a_len > b_len)
return 1;
else if (a_len == b_len)
return 0;
else
return -1;
}
| Datum tintervalct | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1384 of file nabstime.c.
References AbsoluteTimeGetDatum, abstimege(), abstimele(), TimeIntervalData::data, DatumGetBool, DirectFunctionCall2, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, and T_INTERVAL_INVAL.
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
PG_RETURN_BOOL(false);
if (DatumGetBool(DirectFunctionCall2(abstimele,
AbsoluteTimeGetDatum(i1->data[0]),
AbsoluteTimeGetDatum(i2->data[0]))) &&
DatumGetBool(DirectFunctionCall2(abstimege,
AbsoluteTimeGetDatum(i1->data[1]),
AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(true);
PG_RETURN_BOOL(false);
}
| Datum tintervalend | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1439 of file nabstime.c.
References TimeIntervalData::data, i, INVALID_ABSTIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_ABSOLUTETIME, TimeIntervalData::status, and T_INTERVAL_INVAL.
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
if (i->status == T_INTERVAL_INVAL)
PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
PG_RETURN_ABSOLUTETIME(i->data[1]);
}
| Datum tintervaleq | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1219 of file nabstime.c.
References PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, and tinterval_cmp_internal().
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
PG_RETURN_BOOL(tinterval_cmp_internal(i1, i2) == 0);
}
| Datum tintervalge | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1264 of file nabstime.c.
References PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, and tinterval_cmp_internal().
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
PG_RETURN_BOOL(tinterval_cmp_internal(i1, i2) >= 0);
}
| Datum tintervalgt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1255 of file nabstime.c.
References PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, and tinterval_cmp_internal().
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
PG_RETURN_BOOL(tinterval_cmp_internal(i1, i2) > 0);
}
| Datum tintervalin | ( | PG_FUNCTION_ARGS | ) |
Definition at line 725 of file nabstime.c.
References ABSTIMEMAX, ABSTIMEMIN, TimeIntervalData::data, INVALID_ABSTIME, palloc(), parsetinterval(), PG_GETARG_CSTRING, PG_RETURN_TIMEINTERVAL, and TimeIntervalData::status.
{
char *tintervalstr = PG_GETARG_CSTRING(0);
TimeInterval tinterval;
AbsoluteTime i_start,
i_end,
t1,
t2;
parsetinterval(tintervalstr, &t1, &t2);
tinterval = (TimeInterval) palloc(sizeof(TimeIntervalData));
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
tinterval->status = T_INTERVAL_INVAL; /* undefined */
else
tinterval->status = T_INTERVAL_VALID;
i_start = ABSTIMEMIN(t1, t2);
i_end = ABSTIMEMAX(t1, t2);
tinterval->data[0] = i_start;
tinterval->data[1] = i_end;
PG_RETURN_TIMEINTERVAL(tinterval);
}
| Datum tintervalle | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1246 of file nabstime.c.
References PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, and tinterval_cmp_internal().
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
PG_RETURN_BOOL(tinterval_cmp_internal(i1, i2) <= 0);
}
| Datum tintervalleneq | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1297 of file nabstime.c.
References DatumGetRelativeTime, DirectFunctionCall1, i, INVALID_RELTIME, PG_GETARG_RELATIVETIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, T_INTERVAL_INVAL, TimeIntervalGetDatum, and tintervalrel().
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt;
if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt == t);
}
| Datum tintervallenge | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1367 of file nabstime.c.
References DatumGetRelativeTime, DirectFunctionCall1, i, INVALID_RELTIME, PG_GETARG_RELATIVETIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, T_INTERVAL_INVAL, TimeIntervalGetDatum, and tintervalrel().
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt;
if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt >= t);
}
| Datum tintervallengt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1339 of file nabstime.c.
References DatumGetRelativeTime, DirectFunctionCall1, i, INVALID_RELTIME, PG_GETARG_RELATIVETIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, T_INTERVAL_INVAL, TimeIntervalGetDatum, and tintervalrel().
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt;
if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt > t);
}
| Datum tintervallenle | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1353 of file nabstime.c.
References DatumGetRelativeTime, DirectFunctionCall1, i, INVALID_RELTIME, PG_GETARG_RELATIVETIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, T_INTERVAL_INVAL, TimeIntervalGetDatum, and tintervalrel().
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt;
if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt <= t);
}
| Datum tintervallenlt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1325 of file nabstime.c.
References DatumGetRelativeTime, DirectFunctionCall1, i, INVALID_RELTIME, PG_GETARG_RELATIVETIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, T_INTERVAL_INVAL, TimeIntervalGetDatum, and tintervalrel().
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt;
if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt < t);
}
| Datum tintervallenne | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1311 of file nabstime.c.
References DatumGetRelativeTime, DirectFunctionCall1, i, INVALID_RELTIME, PG_GETARG_RELATIVETIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, T_INTERVAL_INVAL, TimeIntervalGetDatum, and tintervalrel().
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt;
if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt != t);
}
| Datum tintervallt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1237 of file nabstime.c.
References PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, and tinterval_cmp_internal().
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
PG_RETURN_BOOL(tinterval_cmp_internal(i1, i2) < 0);
}
| Datum tintervalne | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1228 of file nabstime.c.
References PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, and tinterval_cmp_internal().
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
PG_RETURN_BOOL(tinterval_cmp_internal(i1, i2) != 0);
}
| Datum tintervalout | ( | PG_FUNCTION_ARGS | ) |
Definition at line 756 of file nabstime.c.
References AbsoluteTimeGetDatum, abstimeout(), TimeIntervalData::data, DatumGetCString, DirectFunctionCall1, INVALID_INTERVAL_STR, palloc(), pfree(), PG_GETARG_TIMEINTERVAL, PG_RETURN_CSTRING, TimeIntervalData::status, T_INTERVAL_INVAL, and T_INTERVAL_LEN.
{
TimeInterval tinterval = PG_GETARG_TIMEINTERVAL(0);
char *i_str,
*p;
i_str = (char *) palloc(T_INTERVAL_LEN); /* ["..." "..."] */
strcpy(i_str, "[\"");
if (tinterval->status == T_INTERVAL_INVAL)
strcat(i_str, INVALID_INTERVAL_STR);
else
{
p = DatumGetCString(DirectFunctionCall1(abstimeout,
AbsoluteTimeGetDatum(tinterval->data[0])));
strcat(i_str, p);
pfree(p);
strcat(i_str, "\" \"");
p = DatumGetCString(DirectFunctionCall1(abstimeout,
AbsoluteTimeGetDatum(tinterval->data[1])));
strcat(i_str, p);
pfree(p);
}
strcat(i_str, "\"]");
PG_RETURN_CSTRING(i_str);
}
| Datum tintervalov | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1405 of file nabstime.c.
References AbsoluteTimeGetDatum, abstimegt(), abstimelt(), TimeIntervalData::data, DatumGetBool, DirectFunctionCall2, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, and T_INTERVAL_INVAL.
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
PG_RETURN_BOOL(false);
if (DatumGetBool(DirectFunctionCall2(abstimelt,
AbsoluteTimeGetDatum(i1->data[1]),
AbsoluteTimeGetDatum(i2->data[0]))) ||
DatumGetBool(DirectFunctionCall2(abstimegt,
AbsoluteTimeGetDatum(i1->data[0]),
AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(false);
PG_RETURN_BOOL(true);
}
| Datum tintervalrecv | ( | PG_FUNCTION_ARGS | ) |
Definition at line 786 of file nabstime.c.
References buf, TimeIntervalData::data, ereport, errcode(), errmsg(), ERROR, INVALID_ABSTIME, palloc(), PG_GETARG_POINTER, PG_RETURN_TIMEINTERVAL, pq_getmsgint(), and TimeIntervalData::status.
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
TimeInterval tinterval;
int32 status;
tinterval = (TimeInterval) palloc(sizeof(TimeIntervalData));
tinterval->status = pq_getmsgint(buf, sizeof(tinterval->status));
tinterval->data[0] = pq_getmsgint(buf, sizeof(tinterval->data[0]));
tinterval->data[1] = pq_getmsgint(buf, sizeof(tinterval->data[1]));
if (tinterval->data[0] == INVALID_ABSTIME ||
tinterval->data[1] == INVALID_ABSTIME)
status = T_INTERVAL_INVAL; /* undefined */
else
status = T_INTERVAL_VALID;
if (status != tinterval->status)
ereport(ERROR,
(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
errmsg("invalid status in external \"tinterval\" value")));
PG_RETURN_TIMEINTERVAL(tinterval);
}
| Datum tintervalrel | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1011 of file nabstime.c.
References AbsoluteTimeIsReal, TimeIntervalData::data, INVALID_RELTIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_RELATIVETIME, TimeIntervalData::status, and T_INTERVAL_VALID.
Referenced by tintervalleneq(), tintervallenge(), tintervallengt(), tintervallenle(), tintervallenlt(), and tintervallenne().
{
TimeInterval tinterval = PG_GETARG_TIMEINTERVAL(0);
AbsoluteTime t1 = tinterval->data[0];
AbsoluteTime t2 = tinterval->data[1];
if (tinterval->status != T_INTERVAL_VALID)
PG_RETURN_RELATIVETIME(INVALID_RELTIME);
if (AbsoluteTimeIsReal(t1) &&
AbsoluteTimeIsReal(t2))
PG_RETURN_RELATIVETIME(t2 - t1);
PG_RETURN_RELATIVETIME(INVALID_RELTIME);
}
| Datum tintervalsame | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1138 of file nabstime.c.
References AbsoluteTimeGetDatum, abstimeeq(), TimeIntervalData::data, DatumGetBool, DirectFunctionCall2, PG_GETARG_TIMEINTERVAL, PG_RETURN_BOOL, TimeIntervalData::status, and T_INTERVAL_INVAL.
{
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
PG_RETURN_BOOL(false);
if (DatumGetBool(DirectFunctionCall2(abstimeeq,
AbsoluteTimeGetDatum(i1->data[0]),
AbsoluteTimeGetDatum(i2->data[0]))) &&
DatumGetBool(DirectFunctionCall2(abstimeeq,
AbsoluteTimeGetDatum(i1->data[1]),
AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(true);
PG_RETURN_BOOL(false);
}
| Datum tintervalsend | ( | PG_FUNCTION_ARGS | ) |
Definition at line 816 of file nabstime.c.
References buf, TimeIntervalData::data, PG_GETARG_TIMEINTERVAL, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), pq_sendint(), and TimeIntervalData::status.
{
TimeInterval tinterval = PG_GETARG_TIMEINTERVAL(0);
StringInfoData buf;
pq_begintypsend(&buf);
pq_sendint(&buf, tinterval->status, sizeof(tinterval->status));
pq_sendint(&buf, tinterval->data[0], sizeof(tinterval->data[0]));
pq_sendint(&buf, tinterval->data[1], sizeof(tinterval->data[1]));
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
| Datum tintervalstart | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1426 of file nabstime.c.
References TimeIntervalData::data, i, INVALID_ABSTIME, PG_GETARG_TIMEINTERVAL, PG_RETURN_ABSOLUTETIME, TimeIntervalData::status, and T_INTERVAL_INVAL.
{
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
if (i->status == T_INTERVAL_INVAL)
PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
PG_RETURN_ABSOLUTETIME(i->data[0]);
}
| static AbsoluteTime tm2abstime | ( | struct pg_tm * | tm, | |
| int | tz | |||
| ) | [static] |
Definition at line 176 of file nabstime.c.
References AbsoluteTimeIsReal, date2j(), HOURS_PER_DAY, INVALID_ABSTIME, MAX_DAYNUM, MINS_PER_HOUR, MONTHS_PER_YEAR, SECS_PER_MINUTE, pg_tm::tm_hour, pg_tm::tm_mday, pg_tm::tm_min, pg_tm::tm_mon, pg_tm::tm_sec, and pg_tm::tm_year.
Referenced by abstimein(), timestamp_abstime(), and timestamptz_abstime().
{
int day;
AbsoluteTime sec;
/* validate, before going out of range on some members */
if (tm->tm_year < 1901 || tm->tm_year > 2038 ||
tm->tm_mon < 1 || tm->tm_mon > MONTHS_PER_YEAR ||
tm->tm_mday < 1 || tm->tm_mday > 31 ||
tm->tm_hour < 0 ||
tm->tm_hour > HOURS_PER_DAY || /* test for > 24:00:00 */
(tm->tm_hour == HOURS_PER_DAY && (tm->tm_min > 0 || tm->tm_sec > 0)) ||
tm->tm_min < 0 || tm->tm_min > MINS_PER_HOUR - 1 ||
tm->tm_sec < 0 || tm->tm_sec > SECS_PER_MINUTE)
return INVALID_ABSTIME;
day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - UNIX_EPOCH_JDATE;
/* check for time out of range */
if (day < MIN_DAYNUM || day > MAX_DAYNUM)
return INVALID_ABSTIME;
/* convert to seconds */
sec = tm->tm_sec + tz + (tm->tm_min + (day * HOURS_PER_DAY + tm->tm_hour) * MINS_PER_HOUR) * SECS_PER_MINUTE;
/*
* check for overflow. We need a little slop here because the H/M/S plus
* TZ offset could add up to more than 1 day.
*/
if ((day >= MAX_DAYNUM - 10 && sec < 0) ||
(day <= MIN_DAYNUM + 10 && sec > 0))
return INVALID_ABSTIME;
/* check for reserved values (e.g. "current" on edge of usual range */
if (!AbsoluteTimeIsReal(sec))
return INVALID_ABSTIME;
return sec;
}
1.7.1