mirror of
https://github.com/postgres/postgres.git
synced 2025-05-11 05:41:32 +03:00
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
This commit is contained in:
parent
938c6f42d8
commit
eab8d6312f
@ -1461,25 +1461,6 @@ dpow(PG_FUNCTION_ARGS)
|
|||||||
float8 arg2 = PG_GETARG_FLOAT8(1);
|
float8 arg2 = PG_GETARG_FLOAT8(1);
|
||||||
float8 result;
|
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
|
* The SQL spec requires that we emit a particular SQLSTATE error code for
|
||||||
* certain error conditions. Specifically, we don't return a
|
* 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
|
* pow() sets errno only on some platforms, depending on whether it
|
||||||
* follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so we try to avoid using
|
* follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so we try to avoid using
|
||||||
* errno. However, some platform/CPU combinations return errno == EDOM
|
* 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
|
* using something different from our floor() test to decide it's
|
||||||
* invalid). Other platforms (HPPA) return errno == ERANGE and a large
|
* invalid). Other platforms (HPPA) return errno == ERANGE and a large
|
||||||
* (HUGE_VAL) but finite result to signal overflow.
|
* (HUGE_VAL) but finite result to signal overflow.
|
||||||
|
@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5');
|
|||||||
12
|
12
|
||||||
(1 row)
|
(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)
|
-- take exp of ln(f.f1)
|
||||||
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
||||||
FROM FLOAT8_TBL f
|
FROM FLOAT8_TBL f
|
||||||
|
@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5');
|
|||||||
12
|
12
|
||||||
(1 row)
|
(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)
|
-- take exp of ln(f.f1)
|
||||||
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
||||||
FROM FLOAT8_TBL f
|
FROM FLOAT8_TBL f
|
||||||
|
@ -344,42 +344,6 @@ SELECT power(float8 '144', float8 '0.5');
|
|||||||
12
|
12
|
||||||
(1 row)
|
(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)
|
-- take exp of ln(f.f1)
|
||||||
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
||||||
FROM FLOAT8_TBL f
|
FROM FLOAT8_TBL f
|
||||||
|
@ -340,42 +340,6 @@ SELECT power(float8 '144', float8 '0.5');
|
|||||||
12
|
12
|
||||||
(1 row)
|
(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)
|
-- take exp of ln(f.f1)
|
||||||
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
||||||
FROM FLOAT8_TBL f
|
FROM FLOAT8_TBL f
|
||||||
|
@ -108,12 +108,6 @@ SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
|
|||||||
|
|
||||||
-- power
|
-- power
|
||||||
SELECT power(float8 '144', float8 '0.5');
|
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)
|
-- take exp of ln(f.f1)
|
||||||
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user