diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 4e927d8..afcfa8c 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -1530,7 +1530,7 @@ dacos(PG_FUNCTION_ARGS) */ errno = 0; result = acos(arg1); - if (errno != 0) + if (errno != 0 || isnan(result)) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("input is out of range"))); @@ -1551,7 +1551,7 @@ dasin(PG_FUNCTION_ARGS) errno = 0; result = asin(arg1); - if (errno != 0) + if (errno != 0 || isnan(result)) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("input is out of range"))); diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out index 6221538..49687fc 100644 --- a/src/test/regress/expected/float8.out +++ b/src/test/regress/expected/float8.out @@ -351,6 +351,23 @@ SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1 | 1.2345678901234e-200 | 1.23456789012339e-200 (3 rows) +-- trigonometry +SELECT asin(0); + asin +------ + 0 +(1 row) + +SELECT asin(2); +ERROR: input is out of range +SELECT acos(0); + acos +----------------- + 1.5707963267949 +(1 row) + +SELECT acos(2); +ERROR: input is out of range -- cube root SELECT ||/ float8 '27' AS three; three diff --git a/src/test/regress/sql/float8.sql b/src/test/regress/sql/float8.sql index 92a574a..fd1e43f 100644 --- a/src/test/regress/sql/float8.sql +++ b/src/test/regress/sql/float8.sql @@ -114,6 +114,12 @@ SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1 FROM FLOAT8_TBL f WHERE f.f1 > '0.0'; +-- trigonometry +SELECT asin(0); +SELECT asin(2); +SELECT acos(0); +SELECT acos(2); + -- cube root SELECT ||/ float8 '27' AS three;