Skip to content

Commit

Permalink
Improve unsupported compound identifier message (#13605)
Browse files Browse the repository at this point in the history
  • Loading branch information
alamb authored Nov 30, 2024
1 parent 023b018 commit 68c92c0
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 13 deletions.
45 changes: 33 additions & 12 deletions datafusion/sql/src/planner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -622,24 +622,41 @@ pub fn object_name_to_table_reference(
idents_to_table_reference(idents, enable_normalization)
}

struct IdentTaker(Vec<Ident>);
/// Take the next identifier from the back of idents, panic'ing if
/// there are none left
impl IdentTaker {
fn take(&mut self, enable_normalization: bool) -> String {
let ident = self.0.pop().expect("no more identifiers");
IdentNormalizer::new(enable_normalization).normalize(ident)
}
}

// impl Display for a nicer error message
impl std::fmt::Display for IdentTaker {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut first = true;
for ident in self.0.iter() {
if !first {
write!(f, ".")?;
}
write!(f, "{}", ident)?;
first = false;
}

Ok(())
}
}

/// Create a [`TableReference`] after normalizing the specified identifier
pub(crate) fn idents_to_table_reference(
idents: Vec<Ident>,
enable_normalization: bool,
) -> Result<TableReference> {
struct IdentTaker(Vec<Ident>);
/// Take the next identifier from the back of idents, panic'ing if
/// there are none left
impl IdentTaker {
fn take(&mut self, enable_normalization: bool) -> String {
let ident = self.0.pop().expect("no more identifiers");
IdentNormalizer::new(enable_normalization).normalize(ident)
}
}

let mut taker = IdentTaker(idents);
let num_idents = taker.0.len();

match taker.0.len() {
match num_idents {
1 => {
let table = taker.take(enable_normalization);
Ok(TableReference::bare(table))
Expand All @@ -655,7 +672,11 @@ pub(crate) fn idents_to_table_reference(
let catalog = taker.take(enable_normalization);
Ok(TableReference::full(catalog, schema, table))
}
_ => plan_err!("Unsupported compound identifier '{:?}'", taker.0),
_ => plan_err!(
"Unsupported compound identifier '{}'. Expected 1, 2 or 3 parts, got {}",
taker,
num_idents
),
}
}

Expand Down
2 changes: 1 addition & 1 deletion datafusion/sqllogictest/test_files/errors.slt
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ SELECT COUNT(*) FROM nonexistentschema.aggregate_test_100
statement error Error during planning: table 'nonexistentcatalog\.public\.aggregate_test_100' not found
SELECT COUNT(*) FROM nonexistentcatalog.public.aggregate_test_100

statement error Error during planning: Unsupported compound identifier '\[Ident \{ value: "way", quote_style: None \}, Ident \{ value: "too", quote_style: None \}, Ident \{ value: "many", quote_style: None \}, Ident \{ value: "namespaces", quote_style: None \}, Ident \{ value: "as", quote_style: None \}, Ident \{ value: "ident", quote_style: None \}, Ident \{ value: "prefixes", quote_style: None \}, Ident \{ value: "aggregate_test_100", quote_style: None \}\]'
statement error DataFusion error: Error during planning: Unsupported compound identifier 'way\.too\.many\.namespaces\.as\.ident\.prefixes\.aggregate_test_100'\. Expected 1, 2 or 3 parts, got 8
SELECT COUNT(*) FROM way.too.many.namespaces.as.ident.prefixes.aggregate_test_100


Expand Down

0 comments on commit 68c92c0

Please sign in to comment.