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";