Skip to content

Commit f74d83b

Browse files
committed
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 217d8f3 and 4d864de in the v10 branch and the corresponding commits in 9.3-9.6. Discussion: https://postgr.es/m/75DB81BEEA95B445AE6D576A0A5C9E936A73E741@BPXM05GP.gisp.nec.co.jp
1 parent cec9d03 commit f74d83b

File tree

6 files changed

+1
-170
lines changed

6 files changed

+1
-170
lines changed

src/backend/utils/adt/float.c

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,25 +1461,6 @@ dpow(PG_FUNCTION_ARGS)
14611461
float8 arg2 = PG_GETARG_FLOAT8(1);
14621462
float8 result;
14631463

1464-
/*
1465-
* The POSIX spec says that NaN ^ 0 = 1, and 1 ^ NaN = 1, while all other
1466-
* cases with NaN inputs yield NaN (with no error). Many older platforms
1467-
* get one or more of these cases wrong, so deal with them via explicit
1468-
* logic rather than trusting pow(3).
1469-
*/
1470-
if (isnan(arg1))
1471-
{
1472-
if (isnan(arg2) || arg2 != 0.0)
1473-
PG_RETURN_FLOAT8(get_float8_nan());
1474-
PG_RETURN_FLOAT8(1.0);
1475-
}
1476-
if (isnan(arg2))
1477-
{
1478-
if (arg1 != 1.0)
1479-
PG_RETURN_FLOAT8(get_float8_nan());
1480-
PG_RETURN_FLOAT8(1.0);
1481-
}
1482-
14831464
/*
14841465
* The SQL spec requires that we emit a particular SQLSTATE error code for
14851466
* certain error conditions. Specifically, we don't return a
@@ -1498,7 +1479,7 @@ dpow(PG_FUNCTION_ARGS)
14981479
* pow() sets errno only on some platforms, depending on whether it
14991480
* follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so we try to avoid using
15001481
* errno. However, some platform/CPU combinations return errno == EDOM
1501-
* and result == NaN for negative arg1 and very large arg2 (they must be
1482+
* and result == Nan for negative arg1 and very large arg2 (they must be
15021483
* using something different from our floor() test to decide it's
15031484
* invalid). Other platforms (HPPA) return errno == ERANGE and a large
15041485
* (HUGE_VAL) but finite result to signal overflow.

src/test/regress/expected/float8-exp-three-digits-win32.out

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5');
340340
12
341341
(1 row)
342342

343-
SELECT power(float8 'NaN', float8 '0.5');
344-
power
345-
-------
346-
NaN
347-
(1 row)
348-
349-
SELECT power(float8 '144', float8 'NaN');
350-
power
351-
-------
352-
NaN
353-
(1 row)
354-
355-
SELECT power(float8 'NaN', float8 'NaN');
356-
power
357-
-------
358-
NaN
359-
(1 row)
360-
361-
SELECT power(float8 '-1', float8 'NaN');
362-
power
363-
-------
364-
NaN
365-
(1 row)
366-
367-
SELECT power(float8 '1', float8 'NaN');
368-
power
369-
-------
370-
1
371-
(1 row)
372-
373-
SELECT power(float8 'NaN', float8 '0');
374-
power
375-
-------
376-
1
377-
(1 row)
378-
379343
-- take exp of ln(f.f1)
380344
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
381345
FROM FLOAT8_TBL f

src/test/regress/expected/float8-small-is-zero.out

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5');
344344
12
345345
(1 row)
346346

347-
SELECT power(float8 'NaN', float8 '0.5');
348-
power
349-
-------
350-
NaN
351-
(1 row)
352-
353-
SELECT power(float8 '144', float8 'NaN');
354-
power
355-
-------
356-
NaN
357-
(1 row)
358-
359-
SELECT power(float8 'NaN', float8 'NaN');
360-
power
361-
-------
362-
NaN
363-
(1 row)
364-
365-
SELECT power(float8 '-1', float8 'NaN');
366-
power
367-
-------
368-
NaN
369-
(1 row)
370-
371-
SELECT power(float8 '1', float8 'NaN');
372-
power
373-
-------
374-
1
375-
(1 row)
376-
377-
SELECT power(float8 'NaN', float8 '0');
378-
power
379-
-------
380-
1
381-
(1 row)
382-
383347
-- take exp of ln(f.f1)
384348
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
385349
FROM FLOAT8_TBL f

src/test/regress/expected/float8-small-is-zero_1.out

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5');
344344
12
345345
(1 row)
346346

347-
SELECT power(float8 'NaN', float8 '0.5');
348-
power
349-
-------
350-
NaN
351-
(1 row)
352-
353-
SELECT power(float8 '144', float8 'NaN');
354-
power
355-
-------
356-
NaN
357-
(1 row)
358-
359-
SELECT power(float8 'NaN', float8 'NaN');
360-
power
361-
-------
362-
NaN
363-
(1 row)
364-
365-
SELECT power(float8 '-1', float8 'NaN');
366-
power
367-
-------
368-
NaN
369-
(1 row)
370-
371-
SELECT power(float8 '1', float8 'NaN');
372-
power
373-
-------
374-
1
375-
(1 row)
376-
377-
SELECT power(float8 'NaN', float8 '0');
378-
power
379-
-------
380-
1
381-
(1 row)
382-
383347
-- take exp of ln(f.f1)
384348
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
385349
FROM FLOAT8_TBL f

src/test/regress/expected/float8.out

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5');
340340
12
341341
(1 row)
342342

343-
SELECT power(float8 'NaN', float8 '0.5');
344-
power
345-
-------
346-
NaN
347-
(1 row)
348-
349-
SELECT power(float8 '144', float8 'NaN');
350-
power
351-
-------
352-
NaN
353-
(1 row)
354-
355-
SELECT power(float8 'NaN', float8 'NaN');
356-
power
357-
-------
358-
NaN
359-
(1 row)
360-
361-
SELECT power(float8 '-1', float8 'NaN');
362-
power
363-
-------
364-
NaN
365-
(1 row)
366-
367-
SELECT power(float8 '1', float8 'NaN');
368-
power
369-
-------
370-
1
371-
(1 row)
372-
373-
SELECT power(float8 'NaN', float8 '0');
374-
power
375-
-------
376-
1
377-
(1 row)
378-
379343
-- take exp of ln(f.f1)
380344
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
381345
FROM FLOAT8_TBL f

src/test/regress/sql/float8.sql

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,6 @@ SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
108108

109109
-- power
110110
SELECT power(float8 '144', float8 '0.5');
111-
SELECT power(float8 'NaN', float8 '0.5');
112-
SELECT power(float8 '144', float8 'NaN');
113-
SELECT power(float8 'NaN', float8 'NaN');
114-
SELECT power(float8 '-1', float8 'NaN');
115-
SELECT power(float8 '1', float8 'NaN');
116-
SELECT power(float8 'NaN', float8 '0');
117111

118112
-- take exp of ln(f.f1)
119113
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy