!198 对所修改函数存在的一些问题进行修改并增加测试用例

Merge pull request !198 from Cross-罗/master
This commit is contained in:
opengauss-bot
2020-09-08 21:34:05 +08:00
committed by Gitee
3 changed files with 80 additions and 39 deletions

View File

@ -1375,20 +1375,11 @@ Datum dpow(PG_FUNCTION_ARGS)
float8 arg2 = PG_GETARG_FLOAT8(1); float8 arg2 = PG_GETARG_FLOAT8(1);
float8 result; float8 result;
if (isnan(arg1)) { /*
if (isnan(arg2) || arg2 != 0.0) { * The SQL spec requires that we emit a particular SQLSTATE error code for
PG_RETURN_FLOAT8(get_float8_nan()); * certain error conditions. Specifically, we don't return a
} * divide-by-zero error code for 0 ^ -1.
PG_RETURN_FLOAT8(1.0); */
}
if (isnan(arg2)) {
if (arg1 != 1.0) {
PG_RETURN_FLOAT8(get_float8_nan());
}
PG_RETURN_FLOAT8(1.0);
}
if (arg1 == 0 && arg2 < 0) { if (arg1 == 0 && arg2 < 0) {
ereport(ERROR, (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION), ereport(ERROR, (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
errmsg("zero raised to a negative power is undefined"))); errmsg("zero raised to a negative power is undefined")));
@ -1398,7 +1389,15 @@ Datum dpow(PG_FUNCTION_ARGS)
ereport(ERROR, (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION), ereport(ERROR, (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
errmsg("a negative number raised to a non-integer power yields a complex result"))); errmsg("a negative number raised to a non-integer power yields a complex result")));
} }
/*
* 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
* 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.
*/
errno = 0; errno = 0;
result = pow(arg1, arg2); result = pow(arg1, arg2);
if (errno == EDOM && isnan(result)) { if (errno == EDOM && isnan(result)) {
@ -1413,7 +1412,7 @@ Datum dpow(PG_FUNCTION_ARGS)
} else if (errno == ERANGE && result != 0 && !isinf(result)) { } else if (errno == ERANGE && result != 0 && !isinf(result)) {
result = get_float8_infinity(); result = get_float8_infinity();
} }
CHECKFLOATVAL(result, isinf(arg1), true); CHECKFLOATVAL(result, isinf(arg1) || isinf(arg2), arg1 == 0);
PG_RETURN_FLOAT8(result); PG_RETURN_FLOAT8(result);
} }
@ -1576,6 +1575,7 @@ Datum dcos(PG_FUNCTION_ARGS)
ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("input is out of range"))); ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("input is out of range")));
} }
CHECKFLOATVAL(result, isinf(arg1), true);
PG_RETURN_FLOAT8(result); PG_RETURN_FLOAT8(result);
} }
@ -1597,7 +1597,7 @@ Datum dcot(PG_FUNCTION_ARGS)
} }
result = 1.0 / result; result = 1.0 / result;
CHECKFLOATVAL(result, isinf(arg1), true); CHECKFLOATVAL(result, true, true);
PG_RETURN_FLOAT8(result); PG_RETURN_FLOAT8(result);
} }
@ -1639,7 +1639,7 @@ Datum dtan(PG_FUNCTION_ARGS)
if (errno != 0 || isinf(arg1)) { if (errno != 0 || isinf(arg1)) {
ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("input is out of range"))); ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("input is out of range")));
} }
CHECKFLOATVAL(result, isinf(arg1), true); CHECKFLOATVAL(result, true, true);
PG_RETURN_FLOAT8(result); PG_RETURN_FLOAT8(result);
} }

View File

@ -547,6 +547,36 @@ SELECT tan('1');
1.5574077246549 1.5574077246549
(1 row) (1 row)
SELECT cot('1');
cot
------------------
.642092615934331
(1 row)
SELECT sin('0');
sin
-----
0
(1 row)
SELECT cos('0');
cos
-----
1
(1 row)
SELECT tan('0');
tan
-----
0
(1 row)
SELECT cot('0');
cot
----------
Infinity
(1 row)
-- test Inf/NaN cases for functions -- test Inf/NaN cases for functions
SELECT sin('infinity'); SELECT sin('infinity');
ERROR: input is out of range ERROR: input is out of range
@ -584,6 +614,18 @@ SELECT tan('nan');
NaN NaN
(1 row) (1 row)
SELECT cot('infinity');
ERROR: input is out of range
CONTEXT: referenced column: cot
SELECT cot('-infinity');
ERROR: input is out of range
CONTEXT: referenced column: cot
SELECT cot('nan');
cot
-----
NaN
(1 row)
--test power --test power
SELECT power('0', '0'); SELECT power('0', '0');
power power
@ -637,14 +679,14 @@ SELECT power('5', '2');
(1 row) (1 row)
SELECT power('5', 'infinity'); SELECT power('5', 'infinity');
ERROR: value out of range: overflow power
CONTEXT: referenced column: power ----------
SELECT power('5', '-infinity'); Infinity
power
-------
0
(1 row) (1 row)
SELECT power('5', '-infinity');
ERROR: value out of range: underflow
CONTEXT: referenced column: power
SELECT power('5', 'nan'); SELECT power('5', 'nan');
power power
------- -------
@ -676,11 +718,8 @@ SELECT power('infinity', 'infinity');
(1 row) (1 row)
SELECT power('infinity', '-infinity'); SELECT power('infinity', '-infinity');
power ERROR: value out of range: underflow
------- CONTEXT: referenced column: power
0
(1 row)
SELECT power('infinity', 'nan'); SELECT power('infinity', 'nan');
power power
------- -------
@ -712,17 +751,11 @@ SELECT power('-infinity', 'infinity');
(1 row) (1 row)
SELECT power('-infinity', '-infinity'); SELECT power('-infinity', '-infinity');
power ERROR: value out of range: underflow
------- CONTEXT: referenced column: power
0
(1 row)
SELECT power('-infinity', 'nan'); SELECT power('-infinity', 'nan');
power ERROR: a negative number raised to a non-integer power yields a complex result
------- CONTEXT: referenced column: power
NaN
(1 row)
SELECT power('nan', '0'); SELECT power('nan', '0');
power power
------- -------

View File

@ -185,6 +185,11 @@ SELECT '-9223372036854780000'::float8::int8;
SELECT sin('1'); SELECT sin('1');
SELECT cos('1'); SELECT cos('1');
SELECT tan('1'); SELECT tan('1');
SELECT cot('1');
SELECT sin('0');
SELECT cos('0');
SELECT tan('0');
SELECT cot('0');
-- test Inf/NaN cases for functions -- test Inf/NaN cases for functions
SELECT sin('infinity'); SELECT sin('infinity');
SELECT sin('-infinity'); SELECT sin('-infinity');
@ -195,6 +200,9 @@ SELECT cos('nan');
SELECT tan('infinity'); SELECT tan('infinity');
SELECT tan('-infinity'); SELECT tan('-infinity');
SELECT tan('nan'); SELECT tan('nan');
SELECT cot('infinity');
SELECT cot('-infinity');
SELECT cot('nan');
--test power --test power
SELECT power('0', '0'); SELECT power('0', '0');