AdjustTimestampForTypmod does not work (at least not portably) on
-infinity and +infinity. Put TIMESTAMP_NOT_FINITE guard into the routine, instead of forgetting it at some call sites. Fixes regression test failures here.
This commit is contained in:
parent
a390975cc1
commit
77be5f9451
|
@ -8,7 +8,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.52 2001/10/03 05:29:24 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.53 2001/10/03 15:50:48 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -32,8 +32,7 @@
|
||||||
static double time2t(const int hour, const int min, const double sec);
|
static double time2t(const int hour, const int min, const double sec);
|
||||||
static int EncodeSpecialTimestamp(Timestamp dt, char *str);
|
static int EncodeSpecialTimestamp(Timestamp dt, char *str);
|
||||||
static Timestamp dt2local(Timestamp dt, int timezone);
|
static Timestamp dt2local(Timestamp dt, int timezone);
|
||||||
static void
|
static void AdjustTimestampForTypmod(Timestamp *time, int32 typmod);
|
||||||
AdjustTimestampForTypmod(Timestamp *time, int32 typmod);
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
@ -138,8 +137,7 @@ timestamp_scale(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
result = timestamp;
|
result = timestamp;
|
||||||
|
|
||||||
if (! TIMESTAMP_NOT_FINITE(result))
|
AdjustTimestampForTypmod(&result, typmod);
|
||||||
AdjustTimestampForTypmod(&result, typmod);
|
|
||||||
|
|
||||||
PG_RETURN_TIMESTAMP(result);
|
PG_RETURN_TIMESTAMP(result);
|
||||||
}
|
}
|
||||||
|
@ -147,7 +145,8 @@ timestamp_scale(PG_FUNCTION_ARGS)
|
||||||
static void
|
static void
|
||||||
AdjustTimestampForTypmod(Timestamp *time, int32 typmod)
|
AdjustTimestampForTypmod(Timestamp *time, int32 typmod)
|
||||||
{
|
{
|
||||||
if ((typmod >= 0) && (typmod <= 13))
|
if (! TIMESTAMP_NOT_FINITE(*time) &&
|
||||||
|
(typmod >= 0) && (typmod <= 13))
|
||||||
{
|
{
|
||||||
static double TimestampScale = 1;
|
static double TimestampScale = 1;
|
||||||
static int32 TimestampTypmod = 0;
|
static int32 TimestampTypmod = 0;
|
||||||
|
@ -157,8 +156,6 @@ AdjustTimestampForTypmod(Timestamp *time, int32 typmod)
|
||||||
|
|
||||||
*time = (rint(((double) *time)*TimestampScale)/TimestampScale);
|
*time = (rint(((double) *time)*TimestampScale)/TimestampScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -261,8 +258,7 @@ timestamptz_scale(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
result = timestamp;
|
result = timestamp;
|
||||||
|
|
||||||
if (! TIMESTAMP_NOT_FINITE(result))
|
AdjustTimestampForTypmod(&result, typmod);
|
||||||
AdjustTimestampForTypmod(&result, typmod);
|
|
||||||
|
|
||||||
PG_RETURN_TIMESTAMPTZ(result);
|
PG_RETURN_TIMESTAMPTZ(result);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue