From 9ae0d1135d0a75b4560f2a4c22be8b8bbfde0803 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 15 Jun 2020 09:02:14 +0200 Subject: [PATCH 3/3] Disallow factorial of negative numbers The previous implementation returned 1 for all negative numbers, which is not sensible under any definition. --- src/backend/utils/adt/numeric.c | 6 +++++- src/test/regress/expected/numeric.out | 6 +----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index eea4239854..f4fb438669 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -2946,7 +2946,11 @@ numeric_fac(PG_FUNCTION_ARGS) NumericVar fact; NumericVar result; - if (num <= 1) + if (num < 0) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("factorial of negative numbers is undefined"))); + if (num == 0 || num == 1) { res = make_result(&const_one); PG_RETURN_NUMERIC(res); diff --git a/src/test/regress/expected/numeric.out b/src/test/regress/expected/numeric.out index 05e9a2b9e9..cff9cde5e8 100644 --- a/src/test/regress/expected/numeric.out +++ b/src/test/regress/expected/numeric.out @@ -2345,8 +2345,4 @@ SELECT 0!; (1 row) SELECT factorial(-4); - factorial ------------ - 1 -(1 row) - +ERROR: factorial of negative numbers is undefined -- 2.27.0