|
|
|
@ -8,7 +8,7 @@ |
|
|
|
|
* |
|
|
|
|
* |
|
|
|
|
* IDENTIFICATION |
|
|
|
|
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.112 2004/08/29 05:06:49 momjian Exp $ |
|
|
|
|
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.113 2004/08/30 02:54:39 momjian Exp $ |
|
|
|
|
* |
|
|
|
|
*------------------------------------------------------------------------- |
|
|
|
|
*/ |
|
|
|
@ -173,6 +173,7 @@ timestamp_recv(PG_FUNCTION_ARGS) |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
timestamp = (Timestamp) pq_getmsgint64(buf); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
timestamp = (Timestamp) pq_getmsgfloat8(buf); |
|
|
|
|
#endif |
|
|
|
@ -416,6 +417,7 @@ timestamptz_recv(PG_FUNCTION_ARGS) |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
timestamp = (TimestampTz) pq_getmsgint64(buf); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
timestamp = (TimestampTz) pq_getmsgfloat8(buf); |
|
|
|
|
#endif |
|
|
|
@ -578,6 +580,7 @@ interval_recv(PG_FUNCTION_ARGS) |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
interval ->time = pq_getmsgint64(buf); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
interval ->time = pq_getmsgfloat8(buf); |
|
|
|
|
#endif |
|
|
|
@ -687,12 +690,15 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
/* YEAR TO MONTH */ |
|
|
|
|
else if (range == (INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH))) |
|
|
|
|
interval ->time = 0; |
|
|
|
|
|
|
|
|
|
else if (range == INTERVAL_MASK(DAY)) |
|
|
|
|
{ |
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
interval ->time = (((int) (interval->time / INT64CONST(86400000000))) |
|
|
|
|
* INT64CONST(86400000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
interval ->time = (((int) (interval->time / 86400)) * 86400); |
|
|
|
|
#endif |
|
|
|
@ -707,11 +713,13 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
day = (interval->time / INT64CONST(86400000000)); |
|
|
|
|
interval ->time -= (day * INT64CONST(86400000000)); |
|
|
|
|
interval ->time = ((interval->time / INT64CONST(3600000000)) |
|
|
|
|
*INT64CONST(3600000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
TMODULO(interval->time, day, 86400.0); |
|
|
|
|
interval ->time = (((int) (interval->time / 3600)) * 3600.0); |
|
|
|
@ -727,11 +735,13 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
hour = (interval->time / INT64CONST(3600000000)); |
|
|
|
|
interval ->time -= (hour * INT64CONST(3600000000)); |
|
|
|
|
interval ->time = ((interval->time / INT64CONST(60000000)) |
|
|
|
|
*INT64CONST(60000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
TMODULO(interval->time, hour, 3600.0); |
|
|
|
|
interval ->time = (((int) (interval->time / 60)) * 60); |
|
|
|
@ -747,9 +757,11 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
minute = (interval->time / INT64CONST(60000000)); |
|
|
|
|
interval ->time -= (minute * INT64CONST(60000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
TMODULO(interval->time, minute, 60.0); |
|
|
|
|
/* interval->time = (int)(interval->time); */ |
|
|
|
@ -760,9 +772,11 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
INTERVAL_MASK(HOUR))) |
|
|
|
|
{ |
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
interval ->time = ((interval->time / INT64CONST(3600000000)) |
|
|
|
|
*INT64CONST(3600000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
interval ->time = (((int) (interval->time / 3600)) * 3600); |
|
|
|
|
#endif |
|
|
|
@ -773,9 +787,11 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
INTERVAL_MASK(MINUTE))) |
|
|
|
|
{ |
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
interval ->time = ((interval->time / INT64CONST(60000000)) |
|
|
|
|
*INT64CONST(60000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
interval ->time = (((int) (interval->time / 60)) * 60); |
|
|
|
|
#endif |
|
|
|
@ -786,6 +802,7 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
INTERVAL_MASK(MINUTE) | |
|
|
|
|
INTERVAL_MASK(SECOND))) |
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
/* HOUR TO MINUTE */ |
|
|
|
|
else if (range == (INTERVAL_MASK(HOUR) | |
|
|
|
|
INTERVAL_MASK(MINUTE))) |
|
|
|
@ -798,11 +815,13 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
day = (interval->time / INT64CONST(86400000000)); |
|
|
|
|
interval ->time -= (day * INT64CONST(86400000000)); |
|
|
|
|
interval ->time = ((interval->time / INT64CONST(60000000)) |
|
|
|
|
*INT64CONST(60000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
TMODULO(interval->time, day, 86400.0); |
|
|
|
|
interval ->time = (((int) (interval->time / 60)) * 60); |
|
|
|
@ -821,9 +840,11 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
day = (interval->time / INT64CONST(86400000000)); |
|
|
|
|
interval ->time -= (day * INT64CONST(86400000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
TMODULO(interval->time, day, 86400.0); |
|
|
|
|
#endif |
|
|
|
@ -840,9 +861,11 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
interval ->month = 0; |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
hour = (interval->time / INT64CONST(3600000000)); |
|
|
|
|
interval ->time -= (hour * INT64CONST(3600000000)); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
TMODULO(interval->time, hour, 3600.0); |
|
|
|
|
#endif |
|
|
|
@ -1113,6 +1136,7 @@ tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *result) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
date = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - POSTGRES_EPOCH_JDATE; |
|
|
|
|
|
|
|
|
|
time = time2t(tm->tm_hour, tm->tm_min, tm->tm_sec, fsec); |
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP |
|
|
|
|
*result = (date *INT64CONST(86400000000)) +time; |
|
|
|
@ -1890,6 +1914,7 @@ timestamp_pl_interval(PG_FUNCTION_ARGS) |
|
|
|
|
|
|
|
|
|
if (TIMESTAMP_NOT_FINITE(timestamp)) |
|
|
|
|
result = timestamp; |
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (span->month != 0) |
|
|
|
@ -1968,6 +1993,7 @@ timestamptz_pl_interval(PG_FUNCTION_ARGS) |
|
|
|
|
|
|
|
|
|
if (TIMESTAMP_NOT_FINITE(timestamp)) |
|
|
|
|
result = timestamp; |
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (span->month != 0) |
|
|
|
@ -3279,9 +3305,9 @@ timestamp_part(PG_FUNCTION_ARGS) |
|
|
|
|
case DTK_CENTURY: |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* centuries AD, c>0: year in [ (c-1)*100+1 : c*100 |
|
|
|
|
* ] centuries BC, c<0: year in [ c*100 : |
|
|
|
|
* (c+1)*100-1 ] there is no number 0 century. |
|
|
|
|
* centuries AD, c>0: year in [ (c-1)*100+1 : c*100 ] |
|
|
|
|
* centuries BC, c<0: year in [ c*100 : (c+1)*100-1 |
|
|
|
|
* ] there is no number 0 century. |
|
|
|
|
*/ |
|
|
|
|
if (tm->tm_year > 0) |
|
|
|
|
result = ((tm->tm_year + 99) / 100); |
|
|
|
@ -3827,6 +3853,7 @@ timestamp2timestamptz(Timestamp timestamp) |
|
|
|
|
|
|
|
|
|
if (TIMESTAMP_NOT_FINITE(timestamp)) |
|
|
|
|
result = timestamp; |
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL) !=0) |
|
|
|
@ -3861,6 +3888,7 @@ timestamptz_timestamp(PG_FUNCTION_ARGS) |
|
|
|
|
|
|
|
|
|
if (TIMESTAMP_NOT_FINITE(timestamp)) |
|
|
|
|
result = timestamp; |
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (timestamp2tm(timestamp, &tz, tm, &fsec, &tzn) !=0) |
|
|
|
|