diff options
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/numeric.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 98574669a25..b485415975e 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -2889,7 +2889,6 @@ numeric_int4(PG_FUNCTION_ARGS) static int32 numericvar_to_int32(NumericVar *var) { - int32 result; int64 val; if (!numericvar_to_int64(var, &val)) @@ -2897,16 +2896,13 @@ numericvar_to_int32(NumericVar *var) (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("integer out of range"))); - /* Down-convert to int4 */ - result = (int32) val; - - /* Test for overflow by reverse-conversion. */ - if ((int64) result != val) + if (val < PG_INT32_MIN || val > PG_INT32_MAX) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("integer out of range"))); - return result; + /* Down-convert to int4 */ + return (int32) val; } Datum @@ -2994,15 +2990,14 @@ numeric_int2(PG_FUNCTION_ARGS) (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("smallint out of range"))); - /* Down-convert to int2 */ - result = (int16) val; - - /* Test for overflow by reverse-conversion. */ - if ((int64) result != val) + if (val < PG_INT16_MIN || val > PG_INT16_MAX) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("smallint out of range"))); + /* Down-convert to int2 */ + result = (int16) val; + PG_RETURN_INT16(result); } @@ -7976,10 +7971,7 @@ power_var(NumericVar *base, NumericVar *exp, NumericVar *result) if (numericvar_to_int64(exp, &expval64)) { - int expval = (int) expval64; - - /* Test for overflow by reverse-conversion. */ - if ((int64) expval == expval64) + if (expval64 >= PG_INT32_MIN && expval64 <= PG_INT32_MAX) { /* Okay, select rscale */ rscale = NUMERIC_MIN_SIG_DIGITS; @@ -7987,7 +7979,7 @@ power_var(NumericVar *base, NumericVar *exp, NumericVar *result) rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE); rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE); - power_var_int(base, expval, result, rscale); + power_var_int(base, (int) expval64, result, rscale); return; } } |