This is an automated email from the ASF dual-hosted git repository.
alamb 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 ad0c21f766 fix: Fixed error handling for `generate_series/range`
(#16391)
ad0c21f766 is described below
commit ad0c21f7667b8b560b53f9ba96d2a852a64aa703
Author: Jonathan Chen <[email protected]>
AuthorDate: Mon Jun 16 17:05:42 2025 -0400
fix: Fixed error handling for `generate_series/range` (#16391)
* Remove `null_equals_null`
* fix: Fixed error handling for `generate_series`/`range`
* add null
* fixes
* tweaks
* fix
* fix
---
datafusion/functions-table/src/generate_series.rs | 16 ++++++++++-----
.../sqllogictest/test_files/table_functions.slt | 23 ++++++++++++----------
2 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/datafusion/functions-table/src/generate_series.rs
b/datafusion/functions-table/src/generate_series.rs
index ffb93cf59b..c875874c56 100644
--- a/datafusion/functions-table/src/generate_series.rs
+++ b/datafusion/functions-table/src/generate_series.rs
@@ -197,11 +197,17 @@ impl TableFunctionImpl for GenerateSeriesFuncImpl {
}
let mut normalize_args = Vec::new();
- for expr in exprs {
+ for (expr_index, expr) in exprs.iter().enumerate() {
match expr {
Expr::Literal(ScalarValue::Null, _) => {}
Expr::Literal(ScalarValue::Int64(Some(n)), _) =>
normalize_args.push(*n),
- _ => return plan_err!("First argument must be an integer
literal"),
+ other => {
+ return plan_err!(
+ "Argument #{} must be an INTEGER or NULL, got {:?}",
+ expr_index + 1,
+ other
+ )
+ }
};
}
@@ -232,15 +238,15 @@ impl TableFunctionImpl for GenerateSeriesFuncImpl {
};
if start > end && step > 0 {
- return plan_err!("start is bigger than end, but increment is
positive: cannot generate infinite series");
+ return plan_err!("Start is bigger than end, but increment is
positive: Cannot generate infinite series");
}
if start < end && step < 0 {
- return plan_err!("start is smaller than end, but increment is
negative: cannot generate infinite series");
+ return plan_err!("Start is smaller than end, but increment is
negative: Cannot generate infinite series");
}
if step == 0 {
- return plan_err!("step cannot be zero");
+ return plan_err!("Step cannot be zero");
}
Ok(Arc::new(GenerateSeriesTable {
diff --git a/datafusion/sqllogictest/test_files/table_functions.slt
b/datafusion/sqllogictest/test_files/table_functions.slt
index ff14dad765..4cc8084811 100644
--- a/datafusion/sqllogictest/test_files/table_functions.slt
+++ b/datafusion/sqllogictest/test_files/table_functions.slt
@@ -160,16 +160,16 @@ physical_plan LazyMemoryExec: partitions=1,
batch_generators=[generate_series: s
# Test generate_series with invalid arguments
#
-query error DataFusion error: Error during planning: start is bigger than end,
but increment is positive: cannot generate infinite series
+query error DataFusion error: Error during planning: Start is bigger than end,
but increment is positive: Cannot generate infinite series
SELECT * FROM generate_series(5, 1)
-query error DataFusion error: Error during planning: start is smaller than
end, but increment is negative: cannot generate infinite series
+query error DataFusion error: Error during planning: Start is smaller than
end, but increment is negative: Cannot generate infinite series
SELECT * FROM generate_series(-6, 6, -1)
-query error DataFusion error: Error during planning: step cannot be zero
+query error DataFusion error: Error during planning: Step cannot be zero
SELECT * FROM generate_series(-6, 6, 0)
-query error DataFusion error: Error during planning: start is bigger than end,
but increment is positive: cannot generate infinite series
+query error DataFusion error: Error during planning: Start is bigger than end,
but increment is positive: Cannot generate infinite series
SELECT * FROM generate_series(6, -6, 1)
@@ -177,7 +177,7 @@ statement error DataFusion error: Error during planning:
generate_series functio
SELECT * FROM generate_series(1, 2, 3, 4)
-statement error DataFusion error: Error during planning: First argument must
be an integer literal
+statement error DataFusion error: Error during planning: Argument #1 must be
an INTEGER or NULL, got Literal\(Utf8\("foo"\), None\)
SELECT * FROM generate_series('foo', 'bar')
# UDF and UDTF `generate_series` can be used simultaneously
@@ -283,16 +283,16 @@ physical_plan LazyMemoryExec: partitions=1,
batch_generators=[range: start=1, en
# Test range with invalid arguments
#
-query error DataFusion error: Error during planning: start is bigger than end,
but increment is positive: cannot generate infinite series
+query error DataFusion error: Error during planning: Start is bigger than end,
but increment is positive: Cannot generate infinite series
SELECT * FROM range(5, 1)
-query error DataFusion error: Error during planning: start is smaller than
end, but increment is negative: cannot generate infinite series
+query error DataFusion error: Error during planning: Start is smaller than
end, but increment is negative: Cannot generate infinite series
SELECT * FROM range(-6, 6, -1)
-query error DataFusion error: Error during planning: step cannot be zero
+query error DataFusion error: Error during planning: Step cannot be zero
SELECT * FROM range(-6, 6, 0)
-query error DataFusion error: Error during planning: start is bigger than end,
but increment is positive: cannot generate infinite series
+query error DataFusion error: Error during planning: Start is bigger than end,
but increment is positive: Cannot generate infinite series
SELECT * FROM range(6, -6, 1)
@@ -300,9 +300,12 @@ statement error DataFusion error: Error during planning:
range function requires
SELECT * FROM range(1, 2, 3, 4)
-statement error DataFusion error: Error during planning: First argument must
be an integer literal
+statement error DataFusion error: Error during planning: Argument #1 must be
an INTEGER or NULL, got Literal\(Utf8\("foo"\), None\)
SELECT * FROM range('foo', 'bar')
+statement error DataFusion error: Error during planning: Argument #2 must be
an INTEGER or NULL, got Literal\(Utf8\("bar"\), None\)
+SELECT * FROM range(1, 'bar')
+
# UDF and UDTF `range` can be used simultaneously
query ? rowsort
SELECT range(1, t1.end) FROM range(3, 5) as t1(end)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]