dpow_NaN_V2.patch
application/octet-stream
Filename: dpow_NaN_V2.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/utils/adt/float.c | 5 | 1 |
| src/test/regress/expected/float8.out | 30 | 0 |
| src/test/regress/sql/float8.sql | 5 | 0 |
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index 6522c08..1483d9f 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -1570,10 +1570,14 @@ dpow(PG_FUNCTION_ARGS)
* 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.
+ *
+ * Note that some versions of Visual Studio set errno to EDOM when
+ * arg1 or arg2 is a NaN.
+ * So we need to except those cases here.
*/
errno = 0;
result = pow(arg1, arg2);
- if (errno == EDOM && isnan(result))
+ if (errno == EDOM && isnan(result) && !isnan(arg1) && !isnan(arg2))
{
if ((fabs(arg1) > 1 && arg2 >= 0) || (fabs(arg1) < 1 && arg2 < 0))
/* The sign of Inf is not significant in this case. */
diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out
index 20c985e..ede9aaf 100644
--- a/src/test/regress/expected/float8.out
+++ b/src/test/regress/expected/float8.out
@@ -340,6 +340,36 @@ 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
+-------
+ 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 215e7a4..9d1d607 100644
--- a/src/test/regress/sql/float8.sql
+++ b/src/test/regress/sql/float8.sql
@@ -108,6 +108,11 @@ 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 'NaN',float8 '0');
-- take exp of ln(f.f1)
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1