Skip to content

Commit 67a1e17

Browse files
committed
add derived,fucntion,nestedjoin etc and unit tests
1 parent 3087656 commit 67a1e17

2 files changed

Lines changed: 68 additions & 6 deletions

File tree

datafusion/sql/src/select.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,16 +696,22 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
696696
_ => {
697697
let extract_table_name =
698698
|t: &TableWithJoins| -> Option<(String, Option<Span>)> {
699-
let span = Span::try_from_sqlparser_span(t.relation.span());
700699
match &t.relation {
701-
TableFactor::Table { alias: Some(a), .. } => {
700+
TableFactor::Table { alias: Some(a), .. }
701+
| TableFactor::Derived { alias: Some(a), .. }
702+
| TableFactor::Function { alias: Some(a), .. }
703+
| TableFactor::UNNEST { alias: Some(a), .. }
704+
| TableFactor::NestedJoin { alias: Some(a), .. } => {
705+
let span = Span::try_from_sqlparser_span(a.name.span);
702706
let name =
703707
self.ident_normalizer.normalize(a.name.clone());
704708
Some((name, span))
705709
}
706710
TableFactor::Table {
707711
name, alias: None, ..
708712
} => {
713+
let span =
714+
Span::try_from_sqlparser_span(t.relation.span());
709715
let table_name = name
710716
.0
711717
.iter()

datafusion/sql/tests/cases/diagnostic.rs

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ fn test_duplicate_cte_name() -> Result<()> {
406406

407407
#[test]
408408
fn test_duplicate_table_alias() -> Result<()> {
409-
let query = "SELECT * FROM /*a*/person a/*a*/, /*b*/person a/*b*/";
409+
let query = "SELECT * FROM person /*a*/a/*a*/, person /*b*/a/*b*/";
410410
let spans = get_spans(query);
411411
let diag = do_query(query);
412412
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");
@@ -419,7 +419,7 @@ fn test_duplicate_table_alias() -> Result<()> {
419419

420420
#[test]
421421
fn test_duplicate_table_alias_not_first() -> Result<()> {
422-
let query = "SELECT * FROM person a, /*b*/test_decimal b/*b*/, /*c*/person b/*c*/";
422+
let query = "SELECT * FROM person a, test_decimal /*b*/b/*b*/, person /*c*/b/*c*/";
423423
let spans = get_spans(query);
424424
let diag = do_query(query);
425425
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");
@@ -445,7 +445,7 @@ fn test_duplicate_bare_table_in_from() -> Result<()> {
445445

446446
#[test]
447447
fn test_duplicate_alias_non_overlapping_columns() -> Result<()> {
448-
let query = "SELECT * FROM /*a*/j1 AS t/*a*/, /*b*/j2 AS t/*b*/";
448+
let query = "SELECT * FROM j1 AS /*a*/t/*a*/, j2 AS /*b*/t/*b*/";
449449
let spans = get_spans(query);
450450
let diag = do_query(query);
451451
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");
@@ -458,7 +458,63 @@ fn test_duplicate_alias_non_overlapping_columns() -> Result<()> {
458458

459459
#[test]
460460
fn test_duplicate_alias_non_overlapping_three_tables() -> Result<()> {
461-
let query = "SELECT * FROM j1 AS x, /*a*/j2 AS t/*a*/, j3 AS y, /*b*/j1 AS t/*b*/";
461+
let query = "SELECT * FROM j1 AS x, j2 AS /*a*/t/*a*/, j3 AS y, j1 AS /*b*/t/*b*/";
462+
let spans = get_spans(query);
463+
let diag = do_query(query);
464+
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");
465+
assert_eq!(diag.span, Some(spans["b"]));
466+
assert_eq!(diag.notes.len(), 1);
467+
assert_snapshot!(diag.notes[0].message, @"first defined here");
468+
assert_eq!(diag.notes[0].span, Some(spans["a"]));
469+
Ok(())
470+
}
471+
472+
#[test]
473+
fn test_duplicate_derived_subquery_alias() -> Result<()> {
474+
let query =
475+
"SELECT * FROM (SELECT 1) AS /*a*/t/*a*/, (SELECT 2) AS /*b*/t/*b*/";
476+
let spans = get_spans(query);
477+
let diag = do_query(query);
478+
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");
479+
assert_eq!(diag.span, Some(spans["b"]));
480+
assert_eq!(diag.notes.len(), 1);
481+
assert_snapshot!(diag.notes[0].message, @"first defined here");
482+
assert_eq!(diag.notes[0].span, Some(spans["a"]));
483+
Ok(())
484+
}
485+
486+
#[test]
487+
fn test_duplicate_alias_table_and_derived() -> Result<()> {
488+
let query =
489+
"SELECT * FROM person AS /*a*/t/*a*/, (SELECT 1) AS /*b*/t/*b*/";
490+
let spans = get_spans(query);
491+
let diag = do_query(query);
492+
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");
493+
assert_eq!(diag.span, Some(spans["b"]));
494+
assert_eq!(diag.notes.len(), 1);
495+
assert_snapshot!(diag.notes[0].message, @"first defined here");
496+
assert_eq!(diag.notes[0].span, Some(spans["a"]));
497+
Ok(())
498+
}
499+
500+
#[test]
501+
fn test_duplicate_alias_derived_and_table() -> Result<()> {
502+
let query =
503+
"SELECT * FROM (SELECT 1) AS /*a*/t/*a*/, person AS /*b*/t/*b*/";
504+
let spans = get_spans(query);
505+
let diag = do_query(query);
506+
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");
507+
assert_eq!(diag.span, Some(spans["b"]));
508+
assert_eq!(diag.notes.len(), 1);
509+
assert_snapshot!(diag.notes[0].message, @"first defined here");
510+
assert_eq!(diag.notes[0].span, Some(spans["a"]));
511+
Ok(())
512+
}
513+
514+
#[test]
515+
fn test_duplicate_nested_join_alias() -> Result<()> {
516+
let query =
517+
"SELECT * FROM (person CROSS JOIN j1) AS /*a*/t/*a*/, (person CROSS JOIN j2) AS /*b*/t/*b*/";
462518
let spans = get_spans(query);
463519
let diag = do_query(query);
464520
assert_snapshot!(diag.message, @"duplicate table alias in FROM clause");

0 commit comments

Comments
 (0)