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 42dce6e5d1 fix: Avoid re-wrapping planning errors  
Err(DataFusionError::Plan) for use in plan_datafusion_err (#14000)
42dce6e5d1 is described below

commit 42dce6e5d101cb3e414b832cbb16a2b87cf9f372
Author: Aleksey Kirilishin <[email protected]>
AuthorDate: Sun Jan 5 21:27:37 2025 +0300

    fix: Avoid re-wrapping planning errors  Err(DataFusionError::Plan) for use 
in plan_datafusion_err (#14000)
    
    * fix: unwrapping Err(DataFusionError::Plan) for use in plan_datafusion_err
    
    * test: add tests for error formatting during planning
---
 datafusion/expr/src/expr_schema.rs                 | 24 +++++++---
 datafusion/optimizer/src/analyzer/type_coercion.rs |  4 +-
 datafusion/sql/tests/sql_integration.rs            | 52 ++++++++++++++++++++++
 datafusion/sqllogictest/test_files/aggregate.slt   | 12 ++---
 datafusion/sqllogictest/test_files/array.slt       |  4 +-
 datafusion/sqllogictest/test_files/errors.slt      |  6 +--
 datafusion/sqllogictest/test_files/scalar.slt      |  2 +-
 7 files changed, 84 insertions(+), 20 deletions(-)

diff --git a/datafusion/expr/src/expr_schema.rs 
b/datafusion/expr/src/expr_schema.rs
index d5c2ac396e..25073ca7ea 100644
--- a/datafusion/expr/src/expr_schema.rs
+++ b/datafusion/expr/src/expr_schema.rs
@@ -28,8 +28,8 @@ use crate::{utils, LogicalPlan, Projection, Subquery, 
WindowFunctionDefinition};
 use arrow::compute::can_cast_types;
 use arrow::datatypes::{DataType, Field};
 use datafusion_common::{
-    not_impl_err, plan_datafusion_err, plan_err, Column, ExprSchema, Result,
-    TableReference,
+    not_impl_err, plan_datafusion_err, plan_err, Column, DataFusionError, 
ExprSchema,
+    Result, TableReference,
 };
 use datafusion_functions_window_common::field::WindowUDFFieldArgs;
 use std::collections::HashMap;
@@ -156,7 +156,10 @@ impl ExprSchemable for Expr {
                     .map_err(|err| {
                         plan_datafusion_err!(
                             "{} {}",
-                            err,
+                            match err {
+                                DataFusionError::Plan(msg) => msg,
+                                err => err.to_string(),
+                            },
                             utils::generate_signature_error_msg(
                                 func.name(),
                                 func.signature().clone(),
@@ -181,7 +184,10 @@ impl ExprSchemable for Expr {
                     .map_err(|err| {
                         plan_datafusion_err!(
                             "{} {}",
-                            err,
+                            match err {
+                                DataFusionError::Plan(msg) => msg,
+                                err => err.to_string(),
+                            },
                             utils::generate_signature_error_msg(
                                 func.name(),
                                 func.signature().clone(),
@@ -485,7 +491,10 @@ impl Expr {
                     .map_err(|err| {
                         plan_datafusion_err!(
                             "{} {}",
-                            err,
+                            match err {
+                                DataFusionError::Plan(msg) => msg,
+                                err => err.to_string(),
+                            },
                             utils::generate_signature_error_msg(
                                 fun.name(),
                                 fun.signature(),
@@ -504,7 +513,10 @@ impl Expr {
                     data_types_with_window_udf(&data_types, 
udwf).map_err(|err| {
                         plan_datafusion_err!(
                             "{} {}",
-                            err,
+                            match err {
+                                DataFusionError::Plan(msg) => msg,
+                                err => err.to_string(),
+                            },
                             utils::generate_signature_error_msg(
                                 fun.name(),
                                 fun.signature(),
diff --git a/datafusion/optimizer/src/analyzer/type_coercion.rs 
b/datafusion/optimizer/src/analyzer/type_coercion.rs
index 70bcd553a9..fe65af0a14 100644
--- a/datafusion/optimizer/src/analyzer/type_coercion.rs
+++ b/datafusion/optimizer/src/analyzer/type_coercion.rs
@@ -1357,7 +1357,7 @@ mod test {
 
         let err = Projection::try_new(vec![udaf], empty).err().unwrap();
         assert!(
-            err.strip_backtrace().starts_with("Error during planning: Error 
during planning: Failed to coerce arguments to satisfy a call to MY_AVG 
function: coercion from [Utf8] to the signature Uniform(1, [Float64]) failed")
+            err.strip_backtrace().starts_with("Error during planning: Failed 
to coerce arguments to satisfy a call to MY_AVG function: coercion from [Utf8] 
to the signature Uniform(1, [Float64]) failed")
         );
         Ok(())
     }
@@ -1407,7 +1407,7 @@ mod test {
             .err()
             .unwrap()
             .strip_backtrace();
-        assert!(err.starts_with("Error during planning: Error during planning: 
Failed to coerce arguments to satisfy a call to avg function: coercion from 
[Utf8] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, 
UInt32, UInt64, Float32, Float64]) failed."));
+        assert!(err.starts_with("Error during planning: Failed to coerce 
arguments to satisfy a call to avg function: coercion from [Utf8] to the 
signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, 
Float32, Float64]) failed."));
         Ok(())
     }
 
diff --git a/datafusion/sql/tests/sql_integration.rs 
b/datafusion/sql/tests/sql_integration.rs
index 786f727412..b93060988d 100644
--- a/datafusion/sql/tests/sql_integration.rs
+++ b/datafusion/sql/tests/sql_integration.rs
@@ -4500,3 +4500,55 @@ fn test_custom_type_plan() -> Result<()> {
 
     Ok(())
 }
+
+fn error_message_test(sql: &str, err_msg_starts_with: &str) {
+    let err = logical_plan(sql).expect_err("query should have failed");
+    assert!(
+        err.strip_backtrace().starts_with(err_msg_starts_with),
+        "Expected error to start with '{}', but got: '{}'",
+        err_msg_starts_with,
+        err.strip_backtrace(),
+    );
+}
+
+#[test]
+fn test_error_message_invalid_scalar_function_signature() {
+    error_message_test(
+        "select sqrt()",
+        "Error during planning: sqrt does not support zero arguments",
+    );
+    error_message_test(
+        "select sqrt(1, 2)",
+        "Error during planning: Failed to coerce arguments",
+    );
+}
+
+#[test]
+fn test_error_message_invalid_aggregate_function_signature() {
+    error_message_test(
+        "select sum()",
+        "Error during planning: sum does not support zero arguments",
+    );
+    // We keep two different prefixes because they clarify each other.
+    // It might be incorrect, and we should consider keeping only one.
+    error_message_test(
+        "select max(9, 3)",
+        "Error during planning: Execution error: User-defined coercion failed",
+    );
+}
+
+#[test]
+fn test_error_message_invalid_window_function_signature() {
+    error_message_test(
+        "select rank(1) over()",
+        "Error during planning: The function expected zero argument but 
received 1",
+    );
+}
+
+#[test]
+fn test_error_message_invalid_window_aggregate_function_signature() {
+    error_message_test(
+        "select sum() over()",
+        "Error during planning: sum does not support zero arguments",
+    );
+}
diff --git a/datafusion/sqllogictest/test_files/aggregate.slt 
b/datafusion/sqllogictest/test_files/aggregate.slt
index ffc441d317..0aedd2ad96 100644
--- a/datafusion/sqllogictest/test_files/aggregate.slt
+++ b/datafusion/sqllogictest/test_files/aggregate.slt
@@ -76,26 +76,26 @@ statement error DataFusion error: Schema error: Schema 
contains duplicate unqual
 SELECT approx_distinct(c9) count_c9, approx_distinct(cast(c9 as varchar)) 
count_c9_str FROM aggregate_test_100
 
 # csv_query_approx_percentile_cont_with_weight
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to 
approx_percentile_cont_with_weight function: coercion from \[Utf8, Int8, 
Float64\] to the signature OneOf(.*) failed(.|\n)*
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to approx_percentile_cont_with_weight function: 
coercion from \[Utf8, Int8, Float64\] to the signature OneOf(.*) failed(.|\n)*
 SELECT approx_percentile_cont_with_weight(c1, c2, 0.95) FROM aggregate_test_100
 
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to 
approx_percentile_cont_with_weight function: coercion from \[Int16, Utf8, 
Float64\] to the signature OneOf(.*) failed(.|\n)*
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to approx_percentile_cont_with_weight function: 
coercion from \[Int16, Utf8, Float64\] to the signature OneOf(.*) failed(.|\n)*
 SELECT approx_percentile_cont_with_weight(c3, c1, 0.95) FROM aggregate_test_100
 
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to 
approx_percentile_cont_with_weight function: coercion from \[Int16, Int8, 
Utf8\] to the signature OneOf(.*) failed(.|\n)*
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to approx_percentile_cont_with_weight function: 
coercion from \[Int16, Int8, Utf8\] to the signature OneOf(.*) failed(.|\n)*
 SELECT approx_percentile_cont_with_weight(c3, c2, c1) FROM aggregate_test_100
 
 # csv_query_approx_percentile_cont_with_histogram_bins
 statement error DataFusion error: External error: This feature is not 
implemented: Tdigest max_size value for 'APPROX_PERCENTILE_CONT' must be UInt > 
0 literal \(got data type Int64\)\.
 SELECT c1, approx_percentile_cont(c3, 0.95, -1000) AS c3_p95 FROM 
aggregate_test_100 GROUP BY 1 ORDER BY 1
 
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to 
approx_percentile_cont function: coercion from \[Int16, Float64, Utf8\] to the 
signature OneOf(.*) failed(.|\n)*
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to approx_percentile_cont function: coercion from 
\[Int16, Float64, Utf8\] to the signature OneOf(.*) failed(.|\n)*
 SELECT approx_percentile_cont(c3, 0.95, c1) FROM aggregate_test_100
 
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to 
approx_percentile_cont function: coercion from \[Int16, Float64, Float64\] to 
the signature OneOf(.*) failed(.|\n)*
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to approx_percentile_cont function: coercion from 
\[Int16, Float64, Float64\] to the signature OneOf(.*) failed(.|\n)*
 SELECT approx_percentile_cont(c3, 0.95, 111.1) FROM aggregate_test_100
 
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to 
approx_percentile_cont function: coercion from \[Float64, Float64, Float64\] to 
the signature OneOf(.*) failed(.|\n)*
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to approx_percentile_cont function: coercion from 
\[Float64, Float64, Float64\] to the signature OneOf(.*) failed(.|\n)*
 SELECT approx_percentile_cont(c12, 0.95, 111.1) FROM aggregate_test_100
 
 statement error DataFusion error: This feature is not implemented: Percentile 
value for 'APPROX_PERCENTILE_CONT' must be a literal
diff --git a/datafusion/sqllogictest/test_files/array.slt 
b/datafusion/sqllogictest/test_files/array.slt
index dcceeebaf4..90003b2857 100644
--- a/datafusion/sqllogictest/test_files/array.slt
+++ b/datafusion/sqllogictest/test_files/array.slt
@@ -1181,7 +1181,7 @@ from arrays_values_without_nulls;
 ## array_element (aliases: array_extract, list_extract, list_element)
 
 # Testing with empty arguments should result in an error
-query error DataFusion error: Error during planning: Error during planning: 
array_element does not support zero arguments
+query error DataFusion error: Error during planning: array_element does not 
support zero arguments
 select array_element();
 
 # array_element error
@@ -2023,7 +2023,7 @@ select array_slice(a, -1, 2, 1), array_slice(a, -1, 2),
 [6.0] [6.0] [] []
 
 # Testing with empty arguments should result in an error
-query error DataFusion error: Error during planning: Error during planning: 
array_slice does not support zero arguments
+query error DataFusion error: Error during planning: array_slice does not 
support zero arguments
 select array_slice();
 
 ## array_any_value (aliases: list_any_value)
diff --git a/datafusion/sqllogictest/test_files/errors.slt 
b/datafusion/sqllogictest/test_files/errors.slt
index 14d5678e50..a153a2e9ce 100644
--- a/datafusion/sqllogictest/test_files/errors.slt
+++ b/datafusion/sqllogictest/test_files/errors.slt
@@ -108,11 +108,11 @@ query error
 select avg(c1, c12) from aggregate_test_100;
 
 # AggregateFunction with wrong argument type
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to regr_slope function: 
coercion from
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to regr_slope function: coercion from
 select regr_slope(1, '2');
 
 # WindowFunction using AggregateFunction wrong signature
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to regr_slope function: 
coercion from
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to regr_slope function: coercion from
 select
 c9,
 regr_slope(c11, '2') over () as min1
@@ -120,7 +120,7 @@ from aggregate_test_100
 order by c9
 
 # WindowFunction wrong signature
-statement error DataFusion error: Error during planning: Error during 
planning: Failed to coerce arguments to satisfy a call to nth_value function: 
coercion from \[Int32, Int64, Int64\] to the signature OneOf\(\[Any\(0\), 
Any\(1\), Any\(2\)\]\) failed
+statement error DataFusion error: Error during planning: Failed to coerce 
arguments to satisfy a call to nth_value function: coercion from \[Int32, 
Int64, Int64\] to the signature OneOf\(\[Any\(0\), Any\(1\), Any\(2\)\]\) failed
 select
 c9,
 nth_value(c5, 2, 3) over (order by c9) as nv1
diff --git a/datafusion/sqllogictest/test_files/scalar.slt 
b/datafusion/sqllogictest/test_files/scalar.slt
index fe7d1a90c5..6f60ed8583 100644
--- a/datafusion/sqllogictest/test_files/scalar.slt
+++ b/datafusion/sqllogictest/test_files/scalar.slt
@@ -1940,7 +1940,7 @@ select position('' in '')
 ----
 1
 
-query error DataFusion error: Error during planning: Error during planning: 
The signature expected NativeType::String but received NativeType::Int64
+query error DataFusion error: Error during planning: The signature expected 
NativeType::String but received NativeType::Int64
 select position(1 in 1)
 
 query I


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to