diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2020-06-18 08:41:31 +0200 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2020-06-18 08:41:31 +0200 |
commit | 0a40563eadc67472d6fd50dabf7002afa25c3330 (patch) | |
tree | ebc2b5a11f9a49201f8a11230b96e986d6d46b15 /src | |
parent | 9d402c73ade412bdeb9064c81fc4ed071c4e93f8 (diff) | |
download | postgresql-0a40563eadc67472d6fd50dabf7002afa25c3330.tar.gz postgresql-0a40563eadc67472d6fd50dabf7002afa25c3330.zip |
Disallow factorial of negative numbers
The previous implementation returned 1 for all negative numbers, which
is not sensible under any definition.
Discussion: https://www.postgresql.org/message-id/flat/6ce1df0e-86a3-e544-743a-f357ff663f68%402ndquadrant.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/adt/numeric.c | 4 | ||||
-rw-r--r-- | src/test/regress/expected/numeric.out | 12 |
2 files changed, 6 insertions, 10 deletions
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index eea42398541..5f23f2afac8 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -2946,6 +2946,10 @@ numeric_fac(PG_FUNCTION_ARGS) NumericVar fact; NumericVar result; + if (num < 0) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("factorial of a negative number is undefined"))); if (num <= 1) { res = make_result(&const_one); diff --git a/src/test/regress/expected/numeric.out b/src/test/regress/expected/numeric.out index b255be7c852..2f3ecb50a73 100644 --- a/src/test/regress/expected/numeric.out +++ b/src/test/regress/expected/numeric.out @@ -2345,14 +2345,6 @@ SELECT 0!; (1 row) SELECT -4!; - ?column? ----------- - 1 -(1 row) - +ERROR: factorial of a negative number is undefined SELECT factorial(-4); - factorial ------------ - 1 -(1 row) - +ERROR: factorial of a negative number is undefined |