From f74d83b3034f830bd68489b4aba99a4dee29c565 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 2 May 2018 17:32:40 -0400 Subject: Revert back-branch changes in power()'s behavior for NaN inputs. Per discussion, the value of fixing these bugs in the back branches doesn't outweigh the downsides of changing corner-case behavior in a minor release. Hence, revert commits 217d8f3a1 and 4d864de48 in the v10 branch and the corresponding commits in 9.3-9.6. Discussion: https://postgr.es/m/75DB81BEEA95B445AE6D576A0A5C9E936A73E741@BPXM05GP.gisp.nec.co.jp --- src/backend/utils/adt/float.c | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) (limited to 'src/backend/utils/adt/float.c') diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 45a62f26161..18b3b949acb 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -1461,25 +1461,6 @@ dpow(PG_FUNCTION_ARGS) float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; - /* - * The POSIX spec says that NaN ^ 0 = 1, and 1 ^ NaN = 1, while all other - * cases with NaN inputs yield NaN (with no error). Many older platforms - * get one or more of these cases wrong, so deal with them via explicit - * logic rather than trusting pow(3). - */ - if (isnan(arg1)) - { - if (isnan(arg2) || arg2 != 0.0) - PG_RETURN_FLOAT8(get_float8_nan()); - PG_RETURN_FLOAT8(1.0); - } - if (isnan(arg2)) - { - if (arg1 != 1.0) - PG_RETURN_FLOAT8(get_float8_nan()); - PG_RETURN_FLOAT8(1.0); - } - /* * The SQL spec requires that we emit a particular SQLSTATE error code for * certain error conditions. Specifically, we don't return a @@ -1498,7 +1479,7 @@ dpow(PG_FUNCTION_ARGS) * pow() sets errno only on some platforms, depending on whether it * follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so we try to avoid using * errno. However, some platform/CPU combinations return errno == EDOM - * and result == NaN for negative arg1 and very large arg2 (they must be + * and result == Nan for negative arg1 and very large arg2 (they must be * using something different from our floor() test to decide it's * invalid). Other platforms (HPPA) return errno == ERANGE and a large * (HUGE_VAL) but finite result to signal overflow. -- cgit v1.2.3