aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/nabstime.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/nabstime.c')
-rw-r--r--src/backend/utils/adt/nabstime.c752
1 files changed, 286 insertions, 466 deletions
diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c
index 0f8ed87e5ba..ca8d728454b 100644
--- a/src/backend/utils/adt/nabstime.c
+++ b/src/backend/utils/adt/nabstime.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.85 2001/05/03 19:00:36 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.86 2001/09/28 08:09:11 thomas Exp $
*
* NOTES
*
@@ -179,6 +179,84 @@ GetCurrentAbsoluteTime(void)
} /* GetCurrentAbsoluteTime() */
+/* GetCurrentAbsoluteTime()
+ * Get the current system time. Set timezone parameters if not specified elsewhere.
+ * Define HasTZSet to allow clients to specify the default timezone.
+ *
+ * Returns the number of seconds since epoch (January 1 1970 GMT)
+ */
+AbsoluteTime
+GetCurrentAbsoluteTimeUsec(int *usec)
+{
+ time_t now;
+ struct timeval tp;
+// struct timezone tpz;
+#if defined(HAVE_TM_ZONE) || defined(HAVE_INT_TIMEZONE)
+ struct tm *tm;
+#else
+ struct timeb tb; /* the old V7-ism */
+#endif
+
+ gettimeofday(&tp, NULL);
+
+ now = tp.tv_sec;
+ *usec = tp.tv_usec;
+
+#ifdef NOT_USED
+#if defined(HAVE_TM_ZONE) || defined(HAVE_INT_TIMEZONE)
+ now = time(NULL);
+#else
+ ftime(&tb);
+ now = tb.time;
+#endif
+#endif
+
+ if (!HasCTZSet)
+ {
+#if defined(HAVE_TM_ZONE)
+ tm = localtime(&now);
+
+ CTimeZone = -tm->tm_gmtoff; /* tm_gmtoff is Sun/DEC-ism */
+ CDayLight = (tm->tm_isdst > 0);
+
+#ifdef NOT_USED
+
+ /*
+ * XXX is there a better way to get local timezone string w/o
+ * tzname? - tgl 97/03/18
+ */
+ strftime(CTZName, MAXTZLEN, "%Z", tm);
+#endif
+
+ /*
+ * XXX FreeBSD man pages indicate that this should work - thomas
+ * 1998-12-12
+ */
+ strcpy(CTZName, tm->tm_zone);
+
+#elif defined(HAVE_INT_TIMEZONE)
+ tm = localtime(&now);
+
+ CDayLight = tm->tm_isdst;
+ CTimeZone = ((tm->tm_isdst > 0) ? (TIMEZONE_GLOBAL - 3600) : TIMEZONE_GLOBAL);
+ strcpy(CTZName, tzname[tm->tm_isdst]);
+#else /* neither HAVE_TM_ZONE nor
+ * HAVE_INT_TIMEZONE */
+ CTimeZone = tb.timezone * 60;
+ CDayLight = (tb.dstflag != 0);
+
+ /*
+ * XXX does this work to get the local timezone string in V7? -
+ * tgl 97/03/18
+ */
+ strftime(CTZName, MAXTZLEN, "%Z", localtime(&now));
+#endif
+ };
+
+ return (AbsoluteTime) now;
+} /* GetCurrentAbsoluteTime() */
+
+
void
GetCurrentTime(struct tm * tm)
{
@@ -191,6 +269,19 @@ GetCurrentTime(struct tm * tm)
void
+GetCurrentTimeUsec(struct tm *tm, double *fsec)
+{
+ int tz;
+ int usec;
+
+ abstime2tm(GetCurrentTransactionStartTimeUsec(&usec), &tz, tm, NULL);
+ *fsec = usec * 1.0e-6;
+
+ return;
+} /* GetCurrentTimeUsec() */
+
+
+void
abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char *tzn)
{
time_t time = (time_t) _time;
@@ -357,11 +448,9 @@ nabstimein(PG_FUNCTION_ARGS)
break;
case DTK_EPOCH:
- result = EPOCH_ABSTIME;
- break;
-
- case DTK_CURRENT:
- result = CURRENT_ABSTIME;
+ /* 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:
@@ -404,15 +493,12 @@ nabstimeout(PG_FUNCTION_ARGS)
switch (time)
{
- case EPOCH_ABSTIME:
- strcpy(buf, EPOCH);
- break;
+ /* 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 CURRENT_ABSTIME:
- strcpy(buf, DCURRENT);
- break;
case NOEND_ABSTIME:
strcpy(buf, LATE);
break;
@@ -449,37 +535,37 @@ abstime_finite(PG_FUNCTION_ARGS)
static int
abstime_cmp_internal(AbsoluteTime a, AbsoluteTime b)
{
- /*
- * 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.
- */
+/*
+ * 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 */
- }
- else if (b == INVALID_ABSTIME)
- {
- return -1; /* non-INVALID < INVALID */
+ if (b == INVALID_ABSTIME)
+ return 0; /* INVALID = INVALID */
+ else
+ return 1; /* INVALID > non-INVALID */
}
+
+ if (b == INVALID_ABSTIME)
+ return -1; /* non-INVALID < INVALID */
+
+#if 0
+/* CURRENT is no longer stored internally... */
+ /* XXX this is broken, should go away: */
+ if (a == CURRENT_ABSTIME)
+ a = GetCurrentTransactionStartTime();
+ if (b == CURRENT_ABSTIME)
+ b = GetCurrentTransactionStartTime();
+#endif
+
+ if (a > b)
+ return 1;
+ else if (a == b)
+ return 0;
else
- {
- /* XXX this is broken, should go away: */
- if (a == CURRENT_ABSTIME)
- a = GetCurrentTransactionStartTime();
- if (b == CURRENT_ABSTIME)
- b = GetCurrentTransactionStartTime();
-
- if (a > b)
- return 1;
- else if (a == b)
- return 0;
- else
- return -1;
- }
+ return -1;
}
Datum
@@ -546,7 +632,7 @@ btabstimecmp(PG_FUNCTION_ARGS)
}
-/* datetime_abstime()
+/* timestamp_abstime()
* Convert timestamp to abstime.
*/
Datum
@@ -555,26 +641,23 @@ timestamp_abstime(PG_FUNCTION_ARGS)
Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
AbsoluteTime result;
double fsec;
+ int tz;
struct tm tt,
*tm = &tt;
- if (TIMESTAMP_IS_INVALID(timestamp))
- result = INVALID_ABSTIME;
- else if (TIMESTAMP_IS_NOBEGIN(timestamp))
+ 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) == 0)
+ {
+ tz = DetermineLocalTimeZone(tm);
+ result = tm2abstime(tm, tz);
+ }
else
{
- if (TIMESTAMP_IS_RELATIVE(timestamp))
- {
- timestamp2tm(SetTimestamp(timestamp), NULL, tm, &fsec, NULL);
- result = tm2abstime(tm, 0);
- }
- else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL) == 0)
- result = tm2abstime(tm, 0);
- else
- result = INVALID_ABSTIME;
+ elog(ERROR, "Unable to convert timestamp to abstime");
+ result = INVALID_ABSTIME;
}
PG_RETURN_ABSOLUTETIME(result);
@@ -588,11 +671,16 @@ abstime_timestamp(PG_FUNCTION_ARGS)
{
AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
Timestamp result;
+ struct tm tt,
+ *tm = &tt;
+ int tz;
+ char tzn[MAXTZLEN];
switch (abstime)
{
case INVALID_ABSTIME:
- TIMESTAMP_INVALID(result);
+ elog(ERROR, "Unable to convert abstime 'invalid' to timestamp");
+ TIMESTAMP_NOBEGIN(result);
break;
case NOSTART_ABSTIME:
@@ -603,12 +691,65 @@ abstime_timestamp(PG_FUNCTION_ARGS)
TIMESTAMP_NOEND(result);
break;
- case EPOCH_ABSTIME:
- TIMESTAMP_EPOCH(result);
+ default:
+ abstime2tm(abstime, &tz, tm, tzn);
+ result = abstime + ((date2j(1970, 1, 1) - date2j(2000, 1, 1)) * 86400) + tz;
break;
+ };
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+
+/* timestamptz_abstime()
+ * Convert timestamp with time zone to abstime.
+ */
+Datum
+timestamptz_abstime(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMP(0);
+ AbsoluteTime result;
+ double fsec;
+ struct tm tt,
+ *tm = &tt;
- case CURRENT_ABSTIME:
- TIMESTAMP_CURRENT(result);
+ 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) == 0)
+ result = tm2abstime(tm, 0);
+ else
+ {
+ elog(ERROR, "Unable to convert timestamp to abstime");
+ result = INVALID_ABSTIME;
+ }
+
+ PG_RETURN_ABSOLUTETIME(result);
+}
+
+/* abstime_timestamptz()
+ * Convert abstime to timestamp.
+ */
+Datum
+abstime_timestamptz(PG_FUNCTION_ARGS)
+{
+ AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
+ TimestampTz result;
+
+ switch (abstime)
+ {
+ case INVALID_ABSTIME:
+ elog(ERROR, "Unable to convert abstime 'invalid' to timestamptz");
+ TIMESTAMP_NOBEGIN(result);
+ break;
+
+ case NOSTART_ABSTIME:
+ TIMESTAMP_NOBEGIN(result);
+ break;
+
+ case NOEND_ABSTIME:
+ TIMESTAMP_NOEND(result);
break;
default:
@@ -653,14 +794,15 @@ reltimein(PG_FUNCTION_ARGS)
case DTK_DELTA:
result = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec);
result += (((tm->tm_year * 365) + (tm->tm_mon * 30) + tm->tm_mday) * (24 * 60 * 60));
- PG_RETURN_RELATIVETIME(result);
+ break;
default:
- PG_RETURN_RELATIVETIME(INVALID_RELTIME);
+ elog(ERROR, "Bad reltime (internal coding error) '%s'", str);
+ result = INVALID_RELTIME;
+ break;
}
- elog(ERROR, "Bad reltime (internal coding error) '%s'", str);
- PG_RETURN_RELATIVETIME(INVALID_RELTIME);
+ PG_RETURN_RELATIVETIME(result);
}
@@ -676,13 +818,8 @@ reltimeout(PG_FUNCTION_ARGS)
*tm = &tt;
char buf[MAXDATELEN + 1];
- if (time == INVALID_RELTIME)
- strcpy(buf, INVALID_RELTIME_STR);
- else
- {
- reltime2tm(time, tm);
- EncodeTimeSpan(tm, 0, DateStyle, buf);
- }
+ reltime2tm(time, tm);
+ EncodeTimeSpan(tm, 0, DateStyle, buf);
result = pstrdup(buf);
PG_RETURN_CSTRING(result);
@@ -702,44 +839,6 @@ reltime2tm(RelativeTime time, struct tm * tm)
return;
} /* reltime2tm() */
-#ifdef NOT_USED
-int
-dummyfunc()
-{
- char *timestring;
- long quantity;
- int i;
- int unitnr;
-
- timestring = (char *) palloc(Max(strlen(INVALID_RELTIME_STR),
- UNITMAXLEN) + 1);
- if (timevalue == INVALID_RELTIME)
- {
- strcpy(timestring, INVALID_RELTIME_STR);
- return timestring;
- }
-
- if (timevalue == 0)
- i = 1; /* unit = 'seconds' */
- else
- for (i = 12; i >= 0; i = i - 2)
- if ((timevalue % sec_tab[i]) == 0)
- break; /* appropriate unit found */
- unitnr = i;
- quantity = (timevalue / sec_tab[unitnr]);
- if (quantity > 1 || quantity < -1)
- unitnr++; /* adjust index for PLURAL of unit */
- if (quantity >= 0)
- sprintf(timestring, "%c %lu %s", RELTIME_LABEL,
- quantity, unit_tab[unitnr]);
- else
- sprintf(timestring, "%c %lu %s %s", RELTIME_LABEL,
- (quantity * -1), unit_tab[unitnr], RELTIME_PAST);
- return timestring;
-}
-
-#endif
-
/*
* tintervalin - converts an interval string to internal format
@@ -749,26 +848,25 @@ tintervalin(PG_FUNCTION_ARGS)
{
char *intervalstr = PG_GETARG_CSTRING(0);
TimeInterval interval;
- int error;
AbsoluteTime i_start,
i_end,
t1,
t2;
interval = (TimeInterval) palloc(sizeof(TimeIntervalData));
- error = istinterval(intervalstr, &t1, &t2);
- if (error == 0)
- interval->status = T_INTERVAL_INVAL;
+ if (istinterval(intervalstr, &t1, &t2) == 0)
+ elog(ERROR, "Unable to decode tinterval '%s'", intervalstr);
+
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
- interval->status = T_INTERVAL_INVAL; /* undefined */
+ interval->status = T_INTERVAL_INVAL; /* undefined */
else
- {
- i_start = ABSTIMEMIN(t1, t2);
- i_end = ABSTIMEMAX(t1, t2);
- interval->data[0] = i_start;
- interval->data[1] = i_end;
interval->status = T_INTERVAL_VALID;
- }
+
+ i_start = ABSTIMEMIN(t1, t2);
+ i_end = ABSTIMEMAX(t1, t2);
+ interval->data[0] = i_start;
+ interval->data[1] = i_end;
+
PG_RETURN_TIMEINTERVAL(interval);
}
@@ -818,30 +916,28 @@ interval_reltime(PG_FUNCTION_ARGS)
month;
double span;
- if (INTERVAL_IS_INVALID(*interval))
- time = INVALID_RELTIME;
+ if (interval->month == 0)
+ {
+ year = 0;
+ month = 0;
+ }
+ else if (abs(interval->month) >= 12)
+ {
+ year = (interval->month / 12);
+ month = (interval->month % 12);
+ }
else
{
- if (interval->month == 0)
- {
- year = 0;
- month = 0;
- }
- else if (abs(interval->month) >= 12)
- {
- year = (interval->month / 12);
- month = (interval->month % 12);
- }
- else
- {
- year = 0;
- month = interval->month;
- }
+ year = 0;
+ month = interval->month;
+ }
- span = (((((double) 365 * year) + ((double) 30 * month)) * 86400) + interval->time);
+ span = (((((double) 365 * year) + ((double) 30 * month)) * 86400) + interval->time);
- time = (((span > INT_MIN) && (span < INT_MAX)) ? span : INVALID_RELTIME);
- }
+ if ((span < INT_MIN) || (span > INT_MAX))
+ time = INVALID_RELTIME;
+ else
+ time = span;
PG_RETURN_RELATIVETIME(time);
}
@@ -860,7 +956,9 @@ reltime_interval(PG_FUNCTION_ARGS)
switch (reltime)
{
case INVALID_RELTIME:
- INTERVAL_INVALID(*result);
+ elog(ERROR, "Unable to convert reltime 'invalid' to interval");
+ result->time = 0;
+ result->month = 0;
break;
default:
@@ -884,11 +982,12 @@ mktinterval(PG_FUNCTION_ARGS)
{
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
- AbsoluteTime tstart = ABSTIMEMIN(t1, t2),
- tend = ABSTIMEMAX(t1, t2);
+ AbsoluteTime tstart = ABSTIMEMIN(t1, t2);
+ AbsoluteTime tend = ABSTIMEMAX(t1, t2);
TimeInterval interval;
interval = (TimeInterval) palloc(sizeof(TimeIntervalData));
+
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
interval->status = T_INTERVAL_INVAL;
else
@@ -909,7 +1008,7 @@ mktinterval(PG_FUNCTION_ARGS)
*/
/*
- * timepl - returns the value of (abstime t1 + relime t2)
+ * timepl - returns the value of (abstime t1 + reltime t2)
*/
Datum
timepl(PG_FUNCTION_ARGS)
@@ -917,8 +1016,10 @@ timepl(PG_FUNCTION_ARGS)
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
+#if 0
if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime();
+#endif
if (AbsoluteTimeIsReal(t1) &&
RelativeTimeIsValid(t2) &&
@@ -939,8 +1040,10 @@ timemi(PG_FUNCTION_ARGS)
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
+#if 0
if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime();
+#endif
if (AbsoluteTimeIsReal(t1) &&
RelativeTimeIsValid(t2) &&
@@ -953,27 +1056,6 @@ timemi(PG_FUNCTION_ARGS)
/*
- * abstimemi - returns the value of (abstime t1 - abstime t2)
- *
- * This is not exported, so it's not been made fmgr-compatible.
- */
-static RelativeTime
-abstimemi(AbsoluteTime t1, AbsoluteTime t2)
-{
- if (t1 == CURRENT_ABSTIME)
- t1 = GetCurrentTransactionStartTime();
- if (t2 == CURRENT_ABSTIME)
- t2 = GetCurrentTransactionStartTime();
-
- if (AbsoluteTimeIsReal(t1) &&
- AbsoluteTimeIsReal(t2))
- return t1 - t2;
-
- return INVALID_RELTIME;
-}
-
-
-/*
* intinterval - returns true iff absolute date is in the interval
*/
Datum
@@ -1002,13 +1084,20 @@ Datum
tintervalrel(PG_FUNCTION_ARGS)
{
TimeInterval interval = PG_GETARG_TIMEINTERVAL(0);
+ AbsoluteTime t1 = interval->data[0];
+ AbsoluteTime t2 = interval->data[1];
if (interval->status != T_INTERVAL_VALID)
PG_RETURN_RELATIVETIME(INVALID_RELTIME);
- PG_RETURN_RELATIVETIME(abstimemi(interval->data[1], interval->data[0]));
+ if (AbsoluteTimeIsReal(t1) &&
+ AbsoluteTimeIsReal(t2))
+ PG_RETURN_RELATIVETIME(t2 - t1);
+
+ PG_RETURN_RELATIVETIME(INVALID_RELTIME);
}
+
/*
* timenow - returns time "now", internal format
*
@@ -1021,6 +1110,7 @@ timenow(PG_FUNCTION_ARGS)
if (time(&sec) < 0)
PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
+
PG_RETURN_ABSOLUTETIME((AbsoluteTime) sec);
}
@@ -1113,11 +1203,11 @@ tintervalsame(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
if (DatumGetBool(DirectFunctionCall2(abstimeeq,
- AbsoluteTimeGetDatum(i1->data[0]),
- AbsoluteTimeGetDatum(i2->data[0]))) &&
+ AbsoluteTimeGetDatum(i1->data[0]),
+ AbsoluteTimeGetDatum(i2->data[0]))) &&
DatumGetBool(DirectFunctionCall2(abstimeeq,
- AbsoluteTimeGetDatum(i1->data[1]),
- AbsoluteTimeGetDatum(i2->data[1]))))
+ AbsoluteTimeGetDatum(i1->data[1]),
+ AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(true);
PG_RETURN_BOOL(false);
}
@@ -1133,9 +1223,9 @@ tintervaleq(PG_FUNCTION_ARGS)
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10,
- t11,
- t20,
- t21;
+ t11,
+ t20,
+ t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
PG_RETURN_BOOL(false);
@@ -1145,19 +1235,10 @@ tintervaleq(PG_FUNCTION_ARGS)
t20 = i2->data[0];
t21 = i2->data[1];
- if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
+ if ((t10 == INVALID_ABSTIME) || (t11 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
PG_RETURN_BOOL(false);
- if (t10 == CURRENT_ABSTIME)
- t10 = GetCurrentTransactionStartTime();
- if (t11 == CURRENT_ABSTIME)
- t11 = GetCurrentTransactionStartTime();
- if (t20 == CURRENT_ABSTIME)
- t20 = GetCurrentTransactionStartTime();
- if (t21 == CURRENT_ABSTIME)
- t21 = GetCurrentTransactionStartTime();
-
PG_RETURN_BOOL((t11 - t10) == (t21 - t20));
}
@@ -1167,9 +1248,9 @@ tintervalne(PG_FUNCTION_ARGS)
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10,
- t11,
- t20,
- t21;
+ t11,
+ t20,
+ t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
PG_RETURN_BOOL(false);
@@ -1179,19 +1260,10 @@ tintervalne(PG_FUNCTION_ARGS)
t20 = i2->data[0];
t21 = i2->data[1];
- if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
+ if ((t10 == INVALID_ABSTIME) || (t11 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
PG_RETURN_BOOL(false);
- if (t10 == CURRENT_ABSTIME)
- t10 = GetCurrentTransactionStartTime();
- if (t11 == CURRENT_ABSTIME)
- t11 = GetCurrentTransactionStartTime();
- if (t20 == CURRENT_ABSTIME)
- t20 = GetCurrentTransactionStartTime();
- if (t21 == CURRENT_ABSTIME)
- t21 = GetCurrentTransactionStartTime();
-
PG_RETURN_BOOL((t11 - t10) != (t21 - t20));
}
@@ -1201,9 +1273,9 @@ tintervallt(PG_FUNCTION_ARGS)
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10,
- t11,
- t20,
- t21;
+ t11,
+ t20,
+ t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
PG_RETURN_BOOL(false);
@@ -1213,19 +1285,10 @@ tintervallt(PG_FUNCTION_ARGS)
t20 = i2->data[0];
t21 = i2->data[1];
- if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
+ if ((t10 == INVALID_ABSTIME) || (t11 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
PG_RETURN_BOOL(false);
- if (t10 == CURRENT_ABSTIME)
- t10 = GetCurrentTransactionStartTime();
- if (t11 == CURRENT_ABSTIME)
- t11 = GetCurrentTransactionStartTime();
- if (t20 == CURRENT_ABSTIME)
- t20 = GetCurrentTransactionStartTime();
- if (t21 == CURRENT_ABSTIME)
- t21 = GetCurrentTransactionStartTime();
-
PG_RETURN_BOOL((t11 - t10) < (t21 - t20));
}
@@ -1235,9 +1298,9 @@ tintervalle(PG_FUNCTION_ARGS)
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10,
- t11,
- t20,
- t21;
+ t11,
+ t20,
+ t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
PG_RETURN_BOOL(false);
@@ -1247,19 +1310,10 @@ tintervalle(PG_FUNCTION_ARGS)
t20 = i2->data[0];
t21 = i2->data[1];
- if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
+ if ((t10 == INVALID_ABSTIME) || (t11 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
PG_RETURN_BOOL(false);
- if (t10 == CURRENT_ABSTIME)
- t10 = GetCurrentTransactionStartTime();
- if (t11 == CURRENT_ABSTIME)
- t11 = GetCurrentTransactionStartTime();
- if (t20 == CURRENT_ABSTIME)
- t20 = GetCurrentTransactionStartTime();
- if (t21 == CURRENT_ABSTIME)
- t21 = GetCurrentTransactionStartTime();
-
PG_RETURN_BOOL((t11 - t10) <= (t21 - t20));
}
@@ -1281,19 +1335,10 @@ tintervalgt(PG_FUNCTION_ARGS)
t20 = i2->data[0];
t21 = i2->data[1];
- if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
+ if ((t10 == INVALID_ABSTIME) || (t11 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
PG_RETURN_BOOL(false);
- if (t10 == CURRENT_ABSTIME)
- t10 = GetCurrentTransactionStartTime();
- if (t11 == CURRENT_ABSTIME)
- t11 = GetCurrentTransactionStartTime();
- if (t20 == CURRENT_ABSTIME)
- t20 = GetCurrentTransactionStartTime();
- if (t21 == CURRENT_ABSTIME)
- t21 = GetCurrentTransactionStartTime();
-
PG_RETURN_BOOL((t11 - t10) > (t21 - t20));
}
@@ -1315,19 +1360,10 @@ tintervalge(PG_FUNCTION_ARGS)
t20 = i2->data[0];
t21 = i2->data[1];
- if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
+ if ((t10 == INVALID_ABSTIME) || (t11 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
PG_RETURN_BOOL(false);
- if (t10 == CURRENT_ABSTIME)
- t10 = GetCurrentTransactionStartTime();
- if (t11 == CURRENT_ABSTIME)
- t11 = GetCurrentTransactionStartTime();
- if (t20 == CURRENT_ABSTIME)
- t20 = GetCurrentTransactionStartTime();
- if (t21 == CURRENT_ABSTIME)
- t21 = GetCurrentTransactionStartTime();
-
PG_RETURN_BOOL((t11 - t10) >= (t21 - t20));
}
@@ -1356,8 +1392,8 @@ tintervalleneq(PG_FUNCTION_ARGS)
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);
+ TimeIntervalGetDatum(i)));
+ PG_RETURN_BOOL((rt != INVALID_RELTIME) && (rt == t));
}
Datum
@@ -1371,7 +1407,7 @@ tintervallenne(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
- PG_RETURN_BOOL(rt != INVALID_RELTIME && rt != t);
+ PG_RETURN_BOOL((rt != INVALID_RELTIME) && (rt != t));
}
Datum
@@ -1385,7 +1421,7 @@ tintervallenlt(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
- PG_RETURN_BOOL(rt != INVALID_RELTIME && rt < t);
+ PG_RETURN_BOOL((rt != INVALID_RELTIME) && (rt < t));
}
Datum
@@ -1399,7 +1435,7 @@ tintervallengt(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
- PG_RETURN_BOOL(rt != INVALID_RELTIME && rt > t);
+ PG_RETURN_BOOL((rt != INVALID_RELTIME) && (rt > t));
}
Datum
@@ -1413,7 +1449,7 @@ tintervallenle(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
- PG_RETURN_BOOL(rt != INVALID_RELTIME && rt <= t);
+ PG_RETURN_BOOL((rt != INVALID_RELTIME) && (rt <= t));
}
Datum
@@ -1427,7 +1463,7 @@ tintervallenge(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
TimeIntervalGetDatum(i)));
- PG_RETURN_BOOL(rt != INVALID_RELTIME && rt >= t);
+ PG_RETURN_BOOL((rt != INVALID_RELTIME) && (rt >= t));
}
/*
@@ -1463,11 +1499,11 @@ tintervalov(PG_FUNCTION_ARGS)
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]))) ||
+ AbsoluteTimeGetDatum(i1->data[1]),
+ AbsoluteTimeGetDatum(i2->data[0]))) ||
DatumGetBool(DirectFunctionCall2(abstimegt,
- AbsoluteTimeGetDatum(i1->data[0]),
- AbsoluteTimeGetDatum(i2->data[1]))))
+ AbsoluteTimeGetDatum(i1->data[0]),
+ AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(false);
PG_RETURN_BOOL(true);
}
@@ -1503,222 +1539,6 @@ tintervalend(PG_FUNCTION_ARGS)
* PRIVATE ROUTINES *
*****************************************************************************/
-#ifdef NOT_USED
-/*
- * isreltime - returns 1, iff datestring is of type reltime
- * 2, iff datestring is 'invalid time' identifier
- * 0, iff datestring contains a syntax error
- * VALID time less or equal +/- `@ 68 years'
- *
- */
-int
-isreltime(char *str)
-{
- struct tm tt,
- *tm = &tt;
- double fsec;
- int dtype;
- char *field[MAXDATEFIELDS];
- int nf,
- ftype[MAXDATEFIELDS];
- char lowstr[MAXDATELEN + 1];
-
- if (!PointerIsValid(str))
- return 0;
-
- if (strlen(str) > MAXDATELEN)
- return 0;
-
- if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
- || (DecodeDateDelta(field, ftype, nf, &dtype, tm, &fsec) != 0))
- return 0;
-
- switch (dtype)
- {
- case (DTK_DELTA):
- return (abs(tm->tm_year) <= 68) ? 1 : 0;
- break;
-
- case (DTK_INVALID):
- return 2;
- break;
-
- default:
- return 0;
- break;
- }
-
- return 0;
-} /* isreltime() */
-
-#endif
-
-#ifdef NOT_USED
-int
-dummyfunc()
-{
- char *p;
- char c;
- int i;
- char unit[UNITMAXLEN];
- char direction[DIRMAXLEN];
- int localSign;
- int localUnitNumber;
- long localQuantity;
-
- if (!PointerIsValid(sign))
- sign = &localSign;
-
- if (!PointerIsValid(unitnr))
- unitnr = &localUnitNumber;
-
- if (!PointerIsValid(quantity))
- quantity = &localQuantity;
-
- unit[0] = '\0';
- direction[0] = '\0';
- p = timestring;
- /* skip leading blanks */
- while ((c = *p) != '\0')
- {
- if (c != ' ')
- break;
- p++;
- }
-
- /* Test whether 'invalid time' identifier or not */
- if (!strncmp(INVALID_RELTIME_STR, p, strlen(INVALID_RELTIME_STR) + 1))
- return 2; /* correct 'invalid time' identifier found */
-
- /* handle label of relative time */
- if (c != RELTIME_LABEL)
- return 0; /* syntax error */
- c = *++p;
- if (c != ' ')
- return 0; /* syntax error */
- p++;
- /* handle the quantity */
- *quantity = 0;
- for (;;)
- {
- c = *p;
- if (isdigit((unsigned char) c))
- {
- *quantity = *quantity * 10 + (c - '0');
- p++;
- }
- else
- {
- if (c == ' ')
- break; /* correct quantity found */
- else
- return 0; /* syntax error */
- }
- }
-
- /* handle unit */
- p++;
- i = 0;
- for (;;)
- {
- c = *p;
- if (c >= 'a' && c <= 'z' && i <= (UNITMAXLEN - 1))
- {
- unit[i] = c;
- p++;
- i++;
- }
- else
- {
- if ((c == ' ' || c == '\0')
- && correct_unit(unit, unitnr))
- break; /* correct unit found */
- else
- return 0; /* syntax error */
- }
- }
-
- /* handle optional direction */
- if (c == ' ')
- p++;
- i = 0;
- *sign = 1;
- for (;;)
- {
- c = *p;
- if (c >= 'a' && c <= 'z' && i <= (DIRMAXLEN - 1))
- {
- direction[i] = c;
- p++;
- i++;
- }
- else
- {
- if ((c == ' ' || c == '\0') && i == 0)
- {
- *sign = 1;
- break; /* no direction specified */
- }
- if ((c == ' ' || c == '\0') && i != 0)
- {
- direction[i] = '\0';
- correct_dir(direction, sign);
- break; /* correct direction found */
- }
- else
- return 0; /* syntax error */
- }
- }
-
- return 1;
-}
-
-/*
- * correct_unit - returns 1, iff unit is a correct unit description
- *
- * output parameter:
- * unptr: points to an integer which is the appropriate unit number
- * (see function isreltime())
- */
-static int
-correct_unit(char *unit, int *unptr)
-{
- int j = 0;
-
- while (j < NUNITS)
- {
- if (strncmp(unit, unit_tab[j], strlen(unit_tab[j])) == 0)
- {
- *unptr = j;
- return 1;
- }
- j++;
- }
- return 0; /* invalid unit descriptor */
-}
-
-/*
- * correct_dir - returns 1, iff direction is a correct identifier
- *
- * output parameter:
- * signptr: points to -1 if dir corresponds to past tense
- * else to 1
- */
-static int
-correct_dir(char *direction, int *signptr)
-{
- *signptr = 1;
- if (strncmp(RELTIME_PAST, direction, strlen(RELTIME_PAST) + 1) == 0)
- {
- *signptr = -1;
- return 1;
- }
- else
- return 0; /* invalid direction descriptor */
-}
-
-#endif
-
/*
* istinterval - returns 1, iff i_string is a valid interval descr.
* 0, iff i_string is NOT a valid interval desc.