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 a202a0170a Change wildcard qualifier type from `String` to
`TableReference` (#11073)
a202a0170a is described below
commit a202a0170ae934e511ccdc47387f018adf435dde
Author: Heran Lin <[email protected]>
AuthorDate: Tue Jun 25 04:30:00 2024 +0800
Change wildcard qualifier type from `String` to `TableReference` (#11073)
* Change wildcard qualifier type
* Update protobuf
* Minor update
---
datafusion/expr/src/expr.rs | 2 +-
datafusion/expr/src/utils.rs | 14 ++++++--------
datafusion/proto/proto/datafusion.proto | 2 +-
datafusion/proto/src/generated/pbjson.rs | 10 +++++-----
datafusion/proto/src/generated/prost.rs | 4 ++--
datafusion/proto/src/logical_plan/from_proto.rs | 11 ++++-------
datafusion/proto/src/logical_plan/to_proto.rs | 2 +-
datafusion/sql/src/select.rs | 8 +++++---
8 files changed, 25 insertions(+), 28 deletions(-)
diff --git a/datafusion/expr/src/expr.rs b/datafusion/expr/src/expr.rs
index b1debf24e7..551f61ed5a 100644
--- a/datafusion/expr/src/expr.rs
+++ b/datafusion/expr/src/expr.rs
@@ -308,7 +308,7 @@ pub enum Expr {
///
/// This expr has to be resolved to a list of columns before translating
logical
/// plan into physical plan.
- Wildcard { qualifier: Option<String> },
+ Wildcard { qualifier: Option<TableReference> },
/// List of grouping set expressions. Only valid in the context of an
aggregate
/// GROUP BY expression list
GroupingSet(GroupingSet),
diff --git a/datafusion/expr/src/utils.rs b/datafusion/expr/src/utils.rs
index 9018b6f5ce..9f585be8d6 100644
--- a/datafusion/expr/src/utils.rs
+++ b/datafusion/expr/src/utils.rs
@@ -318,7 +318,7 @@ fn get_excluded_columns(
opt_exclude: Option<&ExcludeSelectItem>,
opt_except: Option<&ExceptSelectItem>,
schema: &DFSchema,
- qualifier: &Option<TableReference>,
+ qualifier: Option<&TableReference>,
) -> Result<Vec<Column>> {
let mut idents = vec![];
if let Some(excepts) = opt_except {
@@ -343,8 +343,7 @@ fn get_excluded_columns(
let mut result = vec![];
for ident in unique_idents.into_iter() {
let col_name = ident.value.as_str();
- let (qualifier, field) =
- schema.qualified_field_with_name(qualifier.as_ref(), col_name)?;
+ let (qualifier, field) = schema.qualified_field_with_name(qualifier,
col_name)?;
result.push(Column::from((qualifier, field)));
}
Ok(result)
@@ -406,7 +405,7 @@ pub fn expand_wildcard(
..
}) = wildcard_options
{
- get_excluded_columns(opt_exclude.as_ref(), opt_except.as_ref(),
schema, &None)?
+ get_excluded_columns(opt_exclude.as_ref(), opt_except.as_ref(),
schema, None)?
} else {
vec![]
};
@@ -417,12 +416,11 @@ pub fn expand_wildcard(
/// Resolves an `Expr::Wildcard` to a collection of qualified `Expr::Column`'s.
pub fn expand_qualified_wildcard(
- qualifier: &str,
+ qualifier: &TableReference,
schema: &DFSchema,
wildcard_options: Option<&WildcardAdditionalOptions>,
) -> Result<Vec<Expr>> {
- let qualifier = TableReference::from(qualifier);
- let qualified_indices = schema.fields_indices_with_qualified(&qualifier);
+ let qualified_indices = schema.fields_indices_with_qualified(qualifier);
let projected_func_dependencies = schema
.functional_dependencies()
.project_functional_dependencies(&qualified_indices,
qualified_indices.len());
@@ -445,7 +443,7 @@ pub fn expand_qualified_wildcard(
opt_exclude.as_ref(),
opt_except.as_ref(),
schema,
- &Some(qualifier),
+ Some(qualifier),
)?
} else {
vec![]
diff --git a/datafusion/proto/proto/datafusion.proto
b/datafusion/proto/proto/datafusion.proto
index 7710acf137..2e7005a4cb 100644
--- a/datafusion/proto/proto/datafusion.proto
+++ b/datafusion/proto/proto/datafusion.proto
@@ -369,7 +369,7 @@ message LogicalExprNode {
}
message Wildcard {
- string qualifier = 1;
+ TableReference qualifier = 1;
}
message PlaceholderNode {
diff --git a/datafusion/proto/src/generated/pbjson.rs
b/datafusion/proto/src/generated/pbjson.rs
index 48a0c1ad61..8fdc5d2e4d 100644
--- a/datafusion/proto/src/generated/pbjson.rs
+++ b/datafusion/proto/src/generated/pbjson.rs
@@ -19961,12 +19961,12 @@ impl serde::Serialize for Wildcard {
{
use serde::ser::SerializeStruct;
let mut len = 0;
- if !self.qualifier.is_empty() {
+ if self.qualifier.is_some() {
len += 1;
}
let mut struct_ser =
serializer.serialize_struct("datafusion.Wildcard", len)?;
- if !self.qualifier.is_empty() {
- struct_ser.serialize_field("qualifier", &self.qualifier)?;
+ if let Some(v) = self.qualifier.as_ref() {
+ struct_ser.serialize_field("qualifier", v)?;
}
struct_ser.end()
}
@@ -20032,12 +20032,12 @@ impl<'de> serde::Deserialize<'de> for Wildcard {
if qualifier__.is_some() {
return
Err(serde::de::Error::duplicate_field("qualifier"));
}
- qualifier__ = Some(map_.next_value()?);
+ qualifier__ = map_.next_value()?;
}
}
}
Ok(Wildcard {
- qualifier: qualifier__.unwrap_or_default(),
+ qualifier: qualifier__,
})
}
}
diff --git a/datafusion/proto/src/generated/prost.rs
b/datafusion/proto/src/generated/prost.rs
index 5959b6fba1..036b7cff9b 100644
--- a/datafusion/proto/src/generated/prost.rs
+++ b/datafusion/proto/src/generated/prost.rs
@@ -592,8 +592,8 @@ pub mod logical_expr_node {
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Wildcard {
- #[prost(string, tag = "1")]
- pub qualifier: ::prost::alloc::string::String,
+ #[prost(message, optional, tag = "1")]
+ pub qualifier: ::core::option::Option<TableReference>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
diff --git a/datafusion/proto/src/logical_plan/from_proto.rs
b/datafusion/proto/src/logical_plan/from_proto.rs
index 2a65bc1033..4cd30d6fa4 100644
--- a/datafusion/proto/src/logical_plan/from_proto.rs
+++ b/datafusion/proto/src/logical_plan/from_proto.rs
@@ -591,13 +591,10 @@ pub fn parse_expr(
parse_exprs(&in_list.list, registry, codec)?,
in_list.negated,
))),
- ExprType::Wildcard(protobuf::Wildcard { qualifier }) =>
Ok(Expr::Wildcard {
- qualifier: if qualifier.is_empty() {
- None
- } else {
- Some(qualifier.clone())
- },
- }),
+ ExprType::Wildcard(protobuf::Wildcard { qualifier }) => {
+ let qualifier = qualifier.to_owned().map(|x|
x.try_into()).transpose()?;
+ Ok(Expr::Wildcard { qualifier })
+ }
ExprType::ScalarUdfExpr(protobuf::ScalarUdfExprNode {
fun_name,
args,
diff --git a/datafusion/proto/src/logical_plan/to_proto.rs
b/datafusion/proto/src/logical_plan/to_proto.rs
index d22052d5a7..3a1db1defd 100644
--- a/datafusion/proto/src/logical_plan/to_proto.rs
+++ b/datafusion/proto/src/logical_plan/to_proto.rs
@@ -612,7 +612,7 @@ pub fn serialize_expr(
}
Expr::Wildcard { qualifier } => protobuf::LogicalExprNode {
expr_type: Some(ExprType::Wildcard(protobuf::Wildcard {
- qualifier: qualifier.clone().unwrap_or("".to_string()),
+ qualifier: qualifier.to_owned().map(|x| x.into()),
})),
},
Expr::ScalarSubquery(_)
diff --git a/datafusion/sql/src/select.rs b/datafusion/sql/src/select.rs
index 0fa266e4e0..102b47216e 100644
--- a/datafusion/sql/src/select.rs
+++ b/datafusion/sql/src/select.rs
@@ -18,7 +18,9 @@
use std::collections::HashSet;
use std::sync::Arc;
-use crate::planner::{ContextProvider, PlannerContext, SqlToRel};
+use crate::planner::{
+ idents_to_table_reference, ContextProvider, PlannerContext, SqlToRel,
+};
use crate::utils::{
check_columns_satisfy_exprs, extract_aliases, rebase_expr,
recursive_transform_unnest, resolve_aliases_to_exprs, resolve_columns,
@@ -475,9 +477,9 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
Ok(expanded_exprs)
}
}
- SelectItem::QualifiedWildcard(ref object_name, options) => {
+ SelectItem::QualifiedWildcard(object_name, options) => {
Self::check_wildcard_options(&options)?;
- let qualifier = format!("{object_name}");
+ let qualifier = idents_to_table_reference(object_name.0,
false)?;
// do not expand from outer schema
let expanded_exprs = expand_qualified_wildcard(
&qualifier,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]