diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2018-05-02 17:32:40 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2018-05-02 17:32:40 -0400 |
commit | f74d83b3034f830bd68489b4aba99a4dee29c565 (patch) | |
tree | 36391b2c01e9fcbf64727f3e3e0bafabf132c796 | |
parent | cec9d03d9165fd62544b63b7f236b9039f1adbe5 (diff) | |
download | postgresql-f74d83b3034f830bd68489b4aba99a4dee29c565.tar.gz postgresql-f74d83b3034f830bd68489b4aba99a4dee29c565.zip |
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
-rw-r--r-- | src/backend/utils/adt/float.c | 21 | ||||
-rw-r--r-- | src/test/regress/expected/float8-exp-three-digits-win32.out | 36 | ||||
-rw-r--r-- | src/test/regress/expected/float8-small-is-zero.out | 36 | ||||
-rw-r--r-- | src/test/regress/expected/float8-small-is-zero_1.out | 36 | ||||
-rw-r--r-- | src/test/regress/expected/float8.out | 36 | ||||
-rw-r--r-- | src/test/regress/sql/float8.sql | 6 |
6 files changed, 1 insertions, 170 deletions
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 @@ -1462,25 +1462,6 @@ dpow(PG_FUNCTION_ARGS) 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 * divide-by-zero error code for 0 ^ -1. @@ -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. diff --git a/src/test/regress/expected/float8-exp-three-digits-win32.out b/src/test/regress/expected/float8-exp-three-digits-win32.out index 3896cdec721..7e1153308f5 100644 --- a/src/test/regress/expected/float8-exp-three-digits-win32.out +++ b/src/test/regress/expected/float8-exp-three-digits-win32.out @@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5'); 12 (1 row) -SELECT power(float8 'NaN', float8 '0.5'); - power -------- - NaN -(1 row) - -SELECT power(float8 '144', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 'NaN', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '-1', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '1', float8 'NaN'); - power -------- - 1 -(1 row) - -SELECT power(float8 'NaN', float8 '0'); - power -------- - 1 -(1 row) - -- take exp of ln(f.f1) SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1 FROM FLOAT8_TBL f diff --git a/src/test/regress/expected/float8-small-is-zero.out b/src/test/regress/expected/float8-small-is-zero.out index f8e09390f51..26b83781500 100644 --- a/src/test/regress/expected/float8-small-is-zero.out +++ b/src/test/regress/expected/float8-small-is-zero.out @@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5'); 12 (1 row) -SELECT power(float8 'NaN', float8 '0.5'); - power -------- - NaN -(1 row) - -SELECT power(float8 '144', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 'NaN', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '-1', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '1', float8 'NaN'); - power -------- - 1 -(1 row) - -SELECT power(float8 'NaN', float8 '0'); - power -------- - 1 -(1 row) - -- take exp of ln(f.f1) SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1 FROM FLOAT8_TBL f diff --git a/src/test/regress/expected/float8-small-is-zero_1.out b/src/test/regress/expected/float8-small-is-zero_1.out index ebfec4cdb68..cea27908ebf 100644 --- a/src/test/regress/expected/float8-small-is-zero_1.out +++ b/src/test/regress/expected/float8-small-is-zero_1.out @@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5'); 12 (1 row) -SELECT power(float8 'NaN', float8 '0.5'); - power -------- - NaN -(1 row) - -SELECT power(float8 '144', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 'NaN', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '-1', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '1', float8 'NaN'); - power -------- - 1 -(1 row) - -SELECT power(float8 'NaN', float8 '0'); - power -------- - 1 -(1 row) - -- take exp of ln(f.f1) SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1 FROM FLOAT8_TBL f diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out index b05831d45c9..20c985e5df8 100644 --- a/src/test/regress/expected/float8.out +++ b/src/test/regress/expected/float8.out @@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5'); 12 (1 row) -SELECT power(float8 'NaN', float8 '0.5'); - power -------- - NaN -(1 row) - -SELECT power(float8 '144', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 'NaN', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '-1', float8 'NaN'); - power -------- - NaN -(1 row) - -SELECT power(float8 '1', float8 'NaN'); - power -------- - 1 -(1 row) - -SELECT power(float8 'NaN', float8 '0'); - power -------- - 1 -(1 row) - -- take exp of ln(f.f1) SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1 FROM FLOAT8_TBL f diff --git a/src/test/regress/sql/float8.sql b/src/test/regress/sql/float8.sql index eeebddd4b78..215e7a47849 100644 --- a/src/test/regress/sql/float8.sql +++ b/src/test/regress/sql/float8.sql @@ -108,12 +108,6 @@ SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1 -- power SELECT power(float8 '144', float8 '0.5'); -SELECT power(float8 'NaN', float8 '0.5'); -SELECT power(float8 '144', float8 'NaN'); -SELECT power(float8 'NaN', float8 'NaN'); -SELECT power(float8 '-1', float8 'NaN'); -SELECT power(float8 '1', float8 'NaN'); -SELECT power(float8 'NaN', float8 '0'); -- take exp of ln(f.f1) SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1 |