Datum tstz_dist(PG_FUNCTION_ARGS) { TimestampTz a = PG_GETARG_TIMESTAMPTZ(0); TimestampTz b = PG_GETARG_TIMESTAMPTZ(1); Interval *r; if (TIMESTAMP_NOT_FINITE(a) || TIMESTAMP_NOT_FINITE(b)) { Interval *p = palloc(sizeof(Interval)); p->day = INT_MAX; p->month = INT_MAX; #ifdef HAVE_INT64_TIMESTAMP p->time = INT64CONST(0x7FFFFFFFFFFFFFFF); #else p->time = DBL_MAX; #endif PG_RETURN_INTERVAL_P(p); } r = DatumGetIntervalP(DirectFunctionCall2(timestamp_mi, PG_GETARG_DATUM(0), PG_GETARG_DATUM(1))); PG_RETURN_INTERVAL_P(abs_interval(r)); }
Datum interval_dist(PG_FUNCTION_ARGS) { Datum diff = DirectFunctionCall2(interval_mi, PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)); PG_RETURN_INTERVAL_P(abs_interval(DatumGetIntervalP(diff))); }
Datum ts_dist(PG_FUNCTION_ARGS) { Timestamp a = PG_GETARG_TIMESTAMP(0); Timestamp b = PG_GETARG_TIMESTAMP(1); Interval *r; if (TIMESTAMP_NOT_FINITE(a) || TIMESTAMP_NOT_FINITE(b)) { Interval *p = palloc(sizeof(Interval)); p->day = INT_MAX; p->month = INT_MAX; p->time = PG_INT64_MAX; PG_RETURN_INTERVAL_P(p); } else r = DatumGetIntervalP(DirectFunctionCall2(timestamp_mi, PG_GETARG_DATUM(0), PG_GETARG_DATUM(1))); PG_RETURN_INTERVAL_P(abs_interval(r)); }