diff --git a/src/common/backend/utils/adt/float.cpp b/src/common/backend/utils/adt/float.cpp index 17f33b4cf..d93e79c83 100644 --- a/src/common/backend/utils/adt/float.cpp +++ b/src/common/backend/utils/adt/float.cpp @@ -359,7 +359,7 @@ Datum float4in(PG_FUNCTION_ARGS) if (fcinfo->can_ignore) { if (isinf((float4)val) && !isinf(val)) { ereport(WARNING, (errmsg("value out of range: overflow"))); - PG_RETURN_FLOAT4(num < 0 ? FLT_MIN : FLT_MAX); + PG_RETURN_FLOAT4(val < 0 ? -FLT_MAX : FLT_MAX); } if (((float4)val) == 0.0 && val != 0) { ereport(WARNING, (errmsg("value out of range: underflow"))); @@ -1189,7 +1189,7 @@ Datum dtof(PG_FUNCTION_ARGS) if (fcinfo->can_ignore) { if (isinf((float4)num) && !isinf(num)) { ereport(WARNING, (errmsg("value out of range: overflow"))); - PG_RETURN_FLOAT4(num < 0 ? FLT_MIN : FLT_MAX); + PG_RETURN_FLOAT4(num < 0 ? -FLT_MAX : FLT_MAX); } if (((float4)num) == 0.0 && num != 0) { ereport(WARNING, (errmsg("value out of range: underflow"))); @@ -1257,7 +1257,7 @@ Datum dtoi2(PG_FUNCTION_ARGS) if (num < (float8)PG_INT16_MIN || num >= -((float8)PG_INT16_MIN) || isnan(num)) { if (fcinfo->can_ignore && !isnan(num)) { ereport(WARNING, (errmsg("smallint out of range"))); - PG_RETURN_INT16(num < (float8)PG_INT16_MIN ? SHRT_MAX : SHRT_MIN); + PG_RETURN_INT16(num < (float8)PG_INT16_MIN ? SHRT_MIN : SHRT_MAX); } ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("smallint out of range"))); } diff --git a/src/test/regress/expected/ignore/ignore_type_transform.out b/src/test/regress/expected/ignore/ignore_type_transform.out index c68356110..aed08f43f 100644 --- a/src/test/regress/expected/ignore/ignore_type_transform.out +++ b/src/test/regress/expected/ignore/ignore_type_transform.out @@ -492,8 +492,8 @@ select * from t_smallint; -------- 100 -100 - -32768 32767 + -32768 100 -100 (6 rows) @@ -579,14 +579,14 @@ CONTEXT: referenced column: num insert /*+ ignore_error */ into t_float4 values(123.123::float8); insert /*+ ignore_error */ into t_float4 values(-123.123::float8); select * from t_float4; - num -------------- - 123.123 - -123.123 - 3.40282e+38 - 1.17549e-38 - 123.123 - -123.123 + num +-------------- + 123.123 + -123.123 + 3.40282e+38 + -3.40282e+38 + 123.123 + -123.123 (6 rows) -- test for numeric to float4 @@ -602,10 +602,10 @@ CONTEXT: referenced column: num WARNING: value out of range: overflow CONTEXT: referenced column: num select * from t_float4; - num -------------- - 3.40282e+38 - 3.40282e+38 + num +-------------- + 3.40282e+38 + -3.40282e+38 (2 rows) -- test for char(n) converting