postgres.git / summary / log / commit / refs
commit eab8d6312f15b8efbab269fea66da8f5a1e7c65f
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed May 02 21:32:40 2018 +0000
First released in: 9.3.23, 9.4.18, 9.5.13, 9.6.9, 10.4
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 +------------
.../expected/float8-exp-three-digits-win32.out | 36 ----------------------
src/test/regress/expected/float8-small-is-zero.out | 36 ----------------------
.../regress/expected/float8-small-is-zero_1.out | 36 ----------------------
src/test/regress/expected/float8.out | 36 ----------------------
src/test/regress/sql/float8.sql | 6 ----
6 files changed, 1 insertion(+), 170 deletions(-)
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index 080d7977a19..8aa17e1dcb9 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.
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
[parent: 938c6f42d852]