!198 对所修改函数存在的一些问题进行修改并增加测试用例
Merge pull request !198 from Cross-罗/master
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
-------
|
-------
|
||||||
|
@ -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');
|
||||||
|
Reference in New Issue
Block a user