jonahgao commented on code in PR #15183:
URL: https://github.com/apache/datafusion/pull/15183#discussion_r2007825842
##########
datafusion/sql/src/planner.rs:
##########
@@ -754,7 +772,11 @@ pub fn object_name_to_table_reference(
enable_normalization: bool,
) -> Result<TableReference> {
// Use destructure to make it clear no fields on ObjectName are ignored
- let ObjectName(idents) = object_name;
+ let ObjectName(object_name_parts) = object_name;
+ let idents = object_name_parts
+ .into_iter()
+ .map(|object_name_part| object_name_part.as_ident().unwrap().clone())
Review Comment:
Replace unwrap with error.
##########
datafusion/sql/src/select.rs:
##########
@@ -92,6 +93,9 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
planner_context,
)?;
+ let order_by =
+ to_order_by_exprs_with_select(query_order_by,
Some(select_exprs.clone()))?;
Review Comment:
This cloning incurs extra costs. How about passing `select_exprs` by
reference
##########
datafusion/sql/src/planner.rs:
##########
@@ -836,21 +858,31 @@ pub(crate) fn idents_to_table_reference(
pub fn object_name_to_qualifier(
sql_table_name: &ObjectName,
enable_normalization: bool,
-) -> String {
+) -> Result<String> {
let columns = vec!["table_name", "table_schema",
"table_catalog"].into_iter();
let normalizer = IdentNormalizer::new(enable_normalization);
sql_table_name
.0
.iter()
.rev()
.zip(columns)
- .map(|(ident, column_name)| {
- format!(
- r#"{} = '{}'"#,
- column_name,
- normalizer.normalize(ident.clone())
- )
+ .map(|(object_name_part, column_name)| {
+ object_name_part
+ .as_ident()
+ .map(|ident| {
+ format!(
+ r#"{} = '{}'"#,
+ column_name,
+ normalizer.normalize(ident.clone())
+ )
+ })
+ .ok_or_else(|| {
+ DataFusionError::Plan(format!(
Review Comment:
nit: use `plan_datafusion_err`
##########
datafusion/sql/src/statement.rs:
##########
@@ -907,18 +946,24 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
returning,
or,
} => {
- let from =
+ let froms =
from.map(|update_table_from_kind| match
update_table_from_kind {
- UpdateTableFromKind::BeforeSet(from) => from,
- UpdateTableFromKind::AfterSet(from) => from,
+ UpdateTableFromKind::BeforeSet(froms) => froms.clone(),
+ UpdateTableFromKind::AfterSet(froms) => froms.clone(),
});
+ // TODO: support multiple tables in UPDATE SET FROM
+ if froms.clone().is_some_and(|f| f.len() > 1) {
+ println!("---------------------------------------------");
Review Comment:
```suggestion
if froms.as_ref().is_some_and(|f| f.len() > 1) {
```
##########
datafusion/sql/src/relation/join.rs:
##########
@@ -136,7 +136,13 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
)
} else {
let id = object_names.swap_remove(0);
- Ok(self.ident_normalizer.normalize(id))
+ id.as_ident()
+ .ok_or_else(|| {
+ datafusion_common::DataFusionError::Plan(
Review Comment:
Use `plan_datafusion_err`
##########
datafusion/sql/src/statement.rs:
##########
@@ -907,18 +946,24 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
returning,
or,
} => {
- let from =
+ let froms =
from.map(|update_table_from_kind| match
update_table_from_kind {
- UpdateTableFromKind::BeforeSet(from) => from,
- UpdateTableFromKind::AfterSet(from) => from,
+ UpdateTableFromKind::BeforeSet(froms) => froms.clone(),
+ UpdateTableFromKind::AfterSet(froms) => froms.clone(),
Review Comment:
```suggestion
UpdateTableFromKind::BeforeSet(froms) => froms,
UpdateTableFromKind::AfterSet(froms) => froms,
```
Is it possible to remove these clones?
##########
datafusion/sql/src/statement.rs:
##########
@@ -907,18 +946,24 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
returning,
or,
} => {
- let from =
+ let froms =
from.map(|update_table_from_kind| match
update_table_from_kind {
- UpdateTableFromKind::BeforeSet(from) => from,
- UpdateTableFromKind::AfterSet(from) => from,
+ UpdateTableFromKind::BeforeSet(froms) => froms.clone(),
+ UpdateTableFromKind::AfterSet(froms) => froms.clone(),
});
+ // TODO: support multiple tables in UPDATE SET FROM
+ if froms.clone().is_some_and(|f| f.len() > 1) {
+ println!("---------------------------------------------");
+ plan_err!("Multiple tables in UPDATE SET FROM not yet
supported")?;
+ }
+ let update_from = froms.map(|f| f.first().unwrap().clone());
Review Comment:
```suggestion
let update_from = froms.and_then(|mut f| f.pop());
```
##########
datafusion/sql/src/statement.rs:
##########
@@ -75,7 +76,11 @@ fn object_name_to_string(object_name: &ObjectName) -> String
{
object_name
.0
.iter()
- .map(ident_to_string)
+ .map(|object_name_part| {
+ object_name_part
+ .as_ident()
+ .map_or_else(String::new, ident_to_string)
Review Comment:
It might be better to return an error than to silently use a default value.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]