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:
Wei-Ting Kuo 2022-08-04 07:41:15 +08:00 committed by GitHub
parent e24951e080
commit 076b587bb2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 91 additions and 37 deletions

View file

@ -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
}
);
}