mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-31 03:07:20 +00:00
Support NestedJoin
with an alias (#551)
* add alias for nestedjoin * fmt * add/modify test cases * inline nestedjoin instead of macro
This commit is contained in:
parent
e24951e080
commit
076b587bb2
5 changed files with 91 additions and 37 deletions
|
@ -3446,32 +3446,45 @@ fn parse_joins_using() {
|
|||
|
||||
#[test]
|
||||
fn parse_natural_join() {
|
||||
fn natural_join(f: impl Fn(JoinConstraint) -> JoinOperator) -> Join {
|
||||
fn natural_join(f: impl Fn(JoinConstraint) -> JoinOperator, alias: Option<TableAlias>) -> Join {
|
||||
Join {
|
||||
relation: TableFactor::Table {
|
||||
name: ObjectName(vec![Ident::new("t2")]),
|
||||
alias: None,
|
||||
alias,
|
||||
args: None,
|
||||
with_hints: vec![],
|
||||
},
|
||||
join_operator: f(JoinConstraint::Natural),
|
||||
}
|
||||
}
|
||||
|
||||
// if not specified, inner join as default
|
||||
assert_eq!(
|
||||
only(&verified_only_select("SELECT * FROM t1 NATURAL JOIN t2").from).joins,
|
||||
vec![natural_join(JoinOperator::Inner)]
|
||||
vec![natural_join(JoinOperator::Inner, None)]
|
||||
);
|
||||
// left join explicitly
|
||||
assert_eq!(
|
||||
only(&verified_only_select("SELECT * FROM t1 NATURAL LEFT JOIN t2").from).joins,
|
||||
vec![natural_join(JoinOperator::LeftOuter)]
|
||||
vec![natural_join(JoinOperator::LeftOuter, None)]
|
||||
);
|
||||
|
||||
// right join explicitly
|
||||
assert_eq!(
|
||||
only(&verified_only_select("SELECT * FROM t1 NATURAL RIGHT JOIN t2").from).joins,
|
||||
vec![natural_join(JoinOperator::RightOuter)]
|
||||
vec![natural_join(JoinOperator::RightOuter, None)]
|
||||
);
|
||||
|
||||
// full join explicitly
|
||||
assert_eq!(
|
||||
only(&verified_only_select("SELECT * FROM t1 NATURAL FULL JOIN t2").from).joins,
|
||||
vec![natural_join(JoinOperator::FullOuter)]
|
||||
vec![natural_join(JoinOperator::FullOuter, None)]
|
||||
);
|
||||
|
||||
// natural join another table with alias
|
||||
assert_eq!(
|
||||
only(&verified_only_select("SELECT * FROM t1 NATURAL JOIN t2 AS t3").from).joins,
|
||||
vec![natural_join(JoinOperator::Inner, table_alias("t3"))]
|
||||
);
|
||||
|
||||
let sql = "SELECT * FROM t1 natural";
|
||||
|
@ -3519,6 +3532,21 @@ fn parse_join_nesting() {
|
|||
from.joins,
|
||||
vec![join(nest!(nest!(nest!(table("b"), table("c")))))]
|
||||
);
|
||||
|
||||
let sql = "SELECT * FROM (a NATURAL JOIN b) AS c";
|
||||
let select = verified_only_select(sql);
|
||||
let from = only(select.from);
|
||||
assert_eq!(
|
||||
from.relation,
|
||||
TableFactor::NestedJoin {
|
||||
table_with_joins: Box::new(TableWithJoins {
|
||||
relation: table("a"),
|
||||
joins: vec![join(table("b"))],
|
||||
}),
|
||||
alias: table_alias("c")
|
||||
}
|
||||
);
|
||||
assert_eq!(from.joins, vec![]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -3676,25 +3704,28 @@ fn parse_derived_tables() {
|
|||
let from = only(select.from);
|
||||
assert_eq!(
|
||||
from.relation,
|
||||
TableFactor::NestedJoin(Box::new(TableWithJoins {
|
||||
relation: TableFactor::Derived {
|
||||
lateral: false,
|
||||
subquery: Box::new(verified_query("(SELECT 1) UNION (SELECT 2)")),
|
||||
alias: Some(TableAlias {
|
||||
name: "t1".into(),
|
||||
columns: vec![],
|
||||
})
|
||||
},
|
||||
joins: vec![Join {
|
||||
relation: TableFactor::Table {
|
||||
name: ObjectName(vec!["t2".into()]),
|
||||
alias: None,
|
||||
args: None,
|
||||
with_hints: vec![],
|
||||
TableFactor::NestedJoin {
|
||||
table_with_joins: Box::new(TableWithJoins {
|
||||
relation: TableFactor::Derived {
|
||||
lateral: false,
|
||||
subquery: Box::new(verified_query("(SELECT 1) UNION (SELECT 2)")),
|
||||
alias: Some(TableAlias {
|
||||
name: "t1".into(),
|
||||
columns: vec![],
|
||||
})
|
||||
},
|
||||
join_operator: JoinOperator::Inner(JoinConstraint::Natural),
|
||||
}],
|
||||
}))
|
||||
joins: vec![Join {
|
||||
relation: TableFactor::Table {
|
||||
name: ObjectName(vec!["t2".into()]),
|
||||
alias: None,
|
||||
args: None,
|
||||
with_hints: vec![],
|
||||
},
|
||||
join_operator: JoinOperator::Inner(JoinConstraint::Natural),
|
||||
}],
|
||||
}),
|
||||
alias: None
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue