This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 2d1d53e2af fixing factorial negative values (#22278)
2d1d53e2af is described below
commit 2d1d53e2afe17f2aa35be649e85ebe611ee23497
Author: Raushan Prabhakar <[email protected]>
AuthorDate: Tue May 19 08:44:37 2026 +0530
fixing factorial negative values (#22278)
## Which issue does this PR close?
- Closes #22270
## Rationale for this change
PostgreSQL returns a domain error for `factorial` on negative inputs
(`ERROR: factorial of a negative number is undefined`). DataFusion
incorrectly returned `1` for negative values (e.g. `factorial(-1)`),
which breaks PostgreSQL-aligned SQL semantics and can silently produce
wrong results.
## What changes are included in this PR?
- **`factorial` (core / `datafusion-functions`):** Negative arguments
now fail with an execution error and message aligned with PostgreSQL:
`factorial of a negative number is undefined`, instead of returning `1`.
- **Documentation:** Updated the `#[user_doc]` description so it matches
behavior (non-negative inputs; error on negative values and on
overflow).
- **Tests:** Added a sqllogictest in `math.slt` that expects this error
for `factorial(-1)`.
**Note:** Spark’s `factorial` in `datafusion-spark` is unchanged
(PySpark-style nulls for out-of-domain values).
## Are these changes tested?
Yes. A sqllogictest was added in
`datafusion/sqllogictest/test_files/math.slt` for `SELECT
factorial(-1)`.
## Are there any user-facing changes?
Yes. `factorial` with a negative argument now errors at execution time
instead of returning `1`. This matches PostgreSQL and fixes incorrect
results; callers that relied on the old behavior would need to adjust.
No public Rust API breakage in exported types; behavior change is
SQL/UDF semantics for negative inputs.
---------
Co-authored-by: Raushan Prabhakar <[email protected]>
Co-authored-by: Kumar Ujjawal <[email protected]>
---
datafusion/functions/src/math/factorial.rs | 4 ++--
datafusion/sqllogictest/test_files/math.slt | 4 ++++
docs/source/user-guide/sql/scalar_functions.md | 2 +-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/datafusion/functions/src/math/factorial.rs
b/datafusion/functions/src/math/factorial.rs
index b4c41838e1..3b4f973f19 100644
--- a/datafusion/functions/src/math/factorial.rs
+++ b/datafusion/functions/src/math/factorial.rs
@@ -32,7 +32,7 @@ use datafusion_macros::user_doc;
#[user_doc(
doc_section(label = "Math Functions"),
- description = "Factorial. Returns 1 if value is less than 2.",
+ description = "Factorial of a non-negative integer. Errors if the argument
is negative or the result overflows.",
syntax_example = "factorial(numeric_expression)",
sql_example = r#"```sql
> SELECT factorial(5);
@@ -143,7 +143,7 @@ const FACTORIALS: [i64; 21] = [
fn compute_factorial(n: i64) -> Result<i64> {
if n < 0 {
- Ok(1)
+ exec_err!("factorial of a negative number is undefined")
} else if n < FACTORIALS.len() as i64 {
Ok(FACTORIALS[n as usize])
} else {
diff --git a/datafusion/sqllogictest/test_files/math.slt
b/datafusion/sqllogictest/test_files/math.slt
index e00edf47c1..8f7245365f 100644
--- a/datafusion/sqllogictest/test_files/math.slt
+++ b/datafusion/sqllogictest/test_files/math.slt
@@ -826,6 +826,10 @@ select
----
39 Decimal128(2, 1)
+# factorial negative (PostgreSQL-compatible domain error)
+query error DataFusion error: Execution error: factorial of a negative number
is undefined
+select factorial(-1);
+
# factorial overflow
query error DataFusion error: Execution error: Overflow happened on
FACTORIAL\(350943270\)
select FACTORIAL(350943270);
diff --git a/docs/source/user-guide/sql/scalar_functions.md
b/docs/source/user-guide/sql/scalar_functions.md
index 7010a2b7c1..4786163cb5 100644
--- a/docs/source/user-guide/sql/scalar_functions.md
+++ b/docs/source/user-guide/sql/scalar_functions.md
@@ -420,7 +420,7 @@ exp(numeric_expression)
### `factorial`
-Factorial. Returns 1 if value is less than 2.
+Factorial of a non-negative integer. Errors if the argument is negative or the
result overflows.
```sql
factorial(numeric_expression)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]