You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2023/01/18 18:25:57 UTC

[arrow-datafusion] branch master updated: fix: `FieldNotFound` error message without valid fields (#4942)

This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/master by this push:
     new 8a34fe139 fix: `FieldNotFound` error message without valid fields (#4942)
8a34fe139 is described below

commit 8a34fe13927b5882fe2affdefa80d332877ca97b
Author: Artem Medvedev <i...@ddtkey.com>
AuthorDate: Wed Jan 18 19:25:51 2023 +0100

    fix: `FieldNotFound` error message without valid fields (#4942)
---
 datafusion/common/src/column.rs                     | 10 ++++------
 datafusion/common/src/dfschema.rs                   | 15 +++++++++++++++
 datafusion/common/src/error.rs                      | 18 ++++++++----------
 datafusion/optimizer/src/scalar_subquery_to_join.rs |  2 +-
 datafusion/sql/tests/integration_test.rs            |  4 ++--
 5 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/datafusion/common/src/column.rs b/datafusion/common/src/column.rs
index 1267bcbce..a30a4b937 100644
--- a/datafusion/common/src/column.rs
+++ b/datafusion/common/src/column.rs
@@ -148,12 +148,10 @@ impl Column {
 
         Err(DataFusionError::SchemaError(SchemaError::FieldNotFound {
             field: Column::new(self.relation.clone(), self.name),
-            valid_fields: Some(
-                schemas
-                    .iter()
-                    .flat_map(|s| s.fields().iter().map(|f| f.qualified_column()))
-                    .collect(),
-            ),
+            valid_fields: schemas
+                .iter()
+                .flat_map(|s| s.fields().iter().map(|f| f.qualified_column()))
+                .collect(),
         }))
     }
 }
diff --git a/datafusion/common/src/dfschema.rs b/datafusion/common/src/dfschema.rs
index 110a1ec41..7f766acbf 100644
--- a/datafusion/common/src/dfschema.rs
+++ b/datafusion/common/src/dfschema.rs
@@ -825,6 +825,21 @@ mod tests {
         Ok(())
     }
 
+    #[test]
+    fn select_without_valid_fields() {
+        let schema = DFSchema::empty();
+
+        let err = schema
+            .index_of_column_by_name(Some("t1"), "c0")
+            .err()
+            .unwrap();
+        assert_eq!("Schema error: No field named 't1'.'c0'.", &format!("{err}"));
+
+        // the same check without qualifier
+        let err = schema.index_of_column_by_name(None, "c0").err().unwrap();
+        assert_eq!("Schema error: No field named 'c0'.", &format!("{err}"));
+    }
+
     #[test]
     fn equivalent_names_and_types() {
         let field1_i16_t = DFField::from(Field::new("f1", DataType::Int16, true));
diff --git a/datafusion/common/src/error.rs b/datafusion/common/src/error.rs
index 0d8e9b652..a405da353 100644
--- a/datafusion/common/src/error.rs
+++ b/datafusion/common/src/error.rs
@@ -125,7 +125,7 @@ pub enum SchemaError {
     /// No field with this name
     FieldNotFound {
         field: Column,
-        valid_fields: Option<Vec<Column>>,
+        valid_fields: Vec<Column>,
     },
 }
 
@@ -137,13 +137,11 @@ pub fn field_not_found(
 ) -> DataFusionError {
     DataFusionError::SchemaError(SchemaError::FieldNotFound {
         field: Column::new(qualifier, name),
-        valid_fields: Some(
-            schema
-                .fields()
-                .iter()
-                .map(|f| f.qualified_column())
-                .collect(),
-        ),
+        valid_fields: schema
+            .fields()
+            .iter()
+            .map(|f| f.qualified_column())
+            .collect(),
     })
 }
 
@@ -160,11 +158,11 @@ impl Display for SchemaError {
                 } else {
                     write!(f, "'{}'", field.name)?;
                 }
-                if let Some(fields) = valid_fields {
+                if !valid_fields.is_empty() {
                     write!(
                         f,
                         ". Valid fields are {}",
-                        fields
+                        valid_fields
                             .iter()
                             .map(|field| {
                                 if let Some(q) = &field.relation {
diff --git a/datafusion/optimizer/src/scalar_subquery_to_join.rs b/datafusion/optimizer/src/scalar_subquery_to_join.rs
index 51c4142af..1a41d9d37 100644
--- a/datafusion/optimizer/src/scalar_subquery_to_join.rs
+++ b/datafusion/optimizer/src/scalar_subquery_to_join.rs
@@ -678,7 +678,7 @@ mod tests {
                 .build()?,
         );
         /*
-        Error: SchemaError(FieldNotFound { qualifier: Some("orders"), name: "o_custkey", valid_fields: Some(["MAX(orders.o_custkey)"]) })
+        Error: SchemaError(FieldNotFound { qualifier: Some("orders"), name: "o_custkey", valid_fields: ["MAX(orders.o_custkey)"] })
          */
 
         let plan = LogicalPlanBuilder::from(scan_tpch_table("customer"))
diff --git a/datafusion/sql/tests/integration_test.rs b/datafusion/sql/tests/integration_test.rs
index a317a9b97..2866bd9d8 100644
--- a/datafusion/sql/tests/integration_test.rs
+++ b/datafusion/sql/tests/integration_test.rs
@@ -2788,7 +2788,7 @@ fn hive_aggregate_with_filter() -> Result<()> {
 fn order_by_unaliased_name() {
     // https://github.com/apache/arrow-datafusion/issues/3160
     // This query was failing with:
-    // SchemaError(FieldNotFound { qualifier: Some("p"), name: "state", valid_fields: Some(["z", "q"]) })
+    // SchemaError(FieldNotFound { qualifier: Some("p"), name: "state", valid_fields: ["z", "q"] })
     let sql =
         "select p.state z, sum(age) q from person p group by p.state order by p.state";
     let expected = "Projection: z, q\
@@ -3123,7 +3123,7 @@ fn test_prepare_statement_to_plan_panic_prepare_wrong_syntax() {
 
 #[test]
 #[should_panic(
-    expected = "value: SchemaError(FieldNotFound { field: Column { relation: None, name: \"id\" }, valid_fields: Some([]) })"
+    expected = "value: SchemaError(FieldNotFound { field: Column { relation: None, name: \"id\" }, valid_fields: [] })"
 )]
 fn test_prepare_statement_to_plan_panic_no_relation_and_constant_param() {
     let sql = "PREPARE my_plan(INT) AS SELECT id + $1";