You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by if...@apache.org on 2025/01/30 06:16:02 UTC
(datafusion-sqlparser-rs) branch main updated: Allow plain JOIN without turning it into INNER (#1692)
This is an automated email from the ASF dual-hosted git repository.
iffyio pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 252fdbab Allow plain JOIN without turning it into INNER (#1692)
252fdbab is described below
commit 252fdbab823220e7ea29895d7c7230e49d6fb742
Author: Michael Victor Zink <mi...@readyset.io>
AuthorDate: Wed Jan 29 22:15:57 2025 -0800
Allow plain JOIN without turning it into INNER (#1692)
---
src/ast/query.rs | 10 +++++++++-
src/ast/spans.rs | 1 +
src/parser/mod.rs | 8 ++++++--
src/test_utils.rs | 2 +-
tests/sqlparser_bigquery.rs | 2 +-
tests/sqlparser_common.rs | 31 ++++++++++++++++++++++---------
tests/sqlparser_mysql.rs | 2 +-
tests/sqlparser_postgres.rs | 2 +-
8 files changed, 42 insertions(+), 16 deletions(-)
diff --git a/src/ast/query.rs b/src/ast/query.rs
index 747d925c..239e1455 100644
--- a/src/ast/query.rs
+++ b/src/ast/query.rs
@@ -2038,13 +2038,20 @@ impl fmt::Display for Join {
}
match &self.join_operator {
- JoinOperator::Inner(constraint) => write!(
+ JoinOperator::Join(constraint) => write!(
f,
" {}JOIN {}{}",
prefix(constraint),
self.relation,
suffix(constraint)
),
+ JoinOperator::Inner(constraint) => write!(
+ f,
+ " {}INNER JOIN {}{}",
+ prefix(constraint),
+ self.relation,
+ suffix(constraint)
+ ),
JoinOperator::LeftOuter(constraint) => write!(
f,
" {}LEFT JOIN {}{}",
@@ -2128,6 +2135,7 @@ impl fmt::Display for Join {
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
pub enum JoinOperator {
+ Join(JoinConstraint),
Inner(JoinConstraint),
LeftOuter(JoinConstraint),
RightOuter(JoinConstraint),
diff --git a/src/ast/spans.rs b/src/ast/spans.rs
index 58fa27aa..8c46fc07 100644
--- a/src/ast/spans.rs
+++ b/src/ast/spans.rs
@@ -2001,6 +2001,7 @@ impl Spanned for Join {
impl Spanned for JoinOperator {
fn span(&self) -> Span {
match self {
+ JoinOperator::Join(join_constraint) => join_constraint.span(),
JoinOperator::Inner(join_constraint) => join_constraint.span(),
JoinOperator::LeftOuter(join_constraint) => join_constraint.span(),
JoinOperator::RightOuter(join_constraint) => join_constraint.span(),
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index b0936007..aff4c8d3 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -11000,9 +11000,13 @@ impl<'a> Parser<'a> {
let join_operator_type = match peek_keyword {
Keyword::INNER | Keyword::JOIN => {
- let _ = self.parse_keyword(Keyword::INNER); // [ INNER ]
+ let inner = self.parse_keyword(Keyword::INNER); // [ INNER ]
self.expect_keyword_is(Keyword::JOIN)?;
- JoinOperator::Inner
+ if inner {
+ JoinOperator::Inner
+ } else {
+ JoinOperator::Join
+ }
}
kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
let _ = self.next_token(); // consume LEFT/RIGHT
diff --git a/src/test_utils.rs b/src/test_utils.rs
index 20898422..6270ac42 100644
--- a/src/test_utils.rs
+++ b/src/test_utils.rs
@@ -403,7 +403,7 @@ pub fn join(relation: TableFactor) -> Join {
Join {
relation,
global: false,
- join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+ join_operator: JoinOperator::Join(JoinConstraint::Natural),
}
}
diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs
index 853bffee..55de4801 100644
--- a/tests/sqlparser_bigquery.rs
+++ b/tests/sqlparser_bigquery.rs
@@ -1602,7 +1602,7 @@ fn parse_join_constraint_unnest_alias() {
with_ordinality: false,
},
global: false,
- join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+ join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
left: Box::new(Expr::Identifier("c1".into())),
op: BinaryOperator::Eq,
right: Box::new(Expr::Identifier("c2".into())),
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index 119adc7e..99660507 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -6457,7 +6457,7 @@ fn parse_implicit_join() {
joins: vec![Join {
relation: table_from_name(ObjectName::from(vec!["t1b".into()])),
global: false,
- join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+ join_operator: JoinOperator::Join(JoinConstraint::Natural),
}],
},
TableWithJoins {
@@ -6465,7 +6465,7 @@ fn parse_implicit_join() {
joins: vec![Join {
relation: table_from_name(ObjectName::from(vec!["t2b".into()])),
global: false,
- join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+ join_operator: JoinOperator::Join(JoinConstraint::Natural),
}],
},
],
@@ -6523,7 +6523,7 @@ fn parse_joins_on() {
"t2",
table_alias("foo"),
false,
- JoinOperator::Inner,
+ JoinOperator::Join,
)]
);
one_statement_parses_to(
@@ -6533,7 +6533,7 @@ fn parse_joins_on() {
// Test parsing of different join operators
assert_eq!(
only(&verified_only_select("SELECT * FROM t1 JOIN t2 ON c1 = c2").from).joins,
- vec![join_with_constraint("t2", None, false, JoinOperator::Inner)]
+ vec![join_with_constraint("t2", None, false, JoinOperator::Join)]
);
assert_eq!(
only(&verified_only_select("SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2").from).joins,
@@ -6650,7 +6650,7 @@ fn parse_joins_using() {
vec![join_with_constraint(
"t2",
table_alias("foo"),
- JoinOperator::Inner,
+ JoinOperator::Join,
)]
);
one_statement_parses_to(
@@ -6660,6 +6660,10 @@ fn parse_joins_using() {
// Test parsing of different join operators
assert_eq!(
only(&verified_only_select("SELECT * FROM t1 JOIN t2 USING(c1)").from).joins,
+ vec![join_with_constraint("t2", None, JoinOperator::Join)]
+ );
+ assert_eq!(
+ only(&verified_only_select("SELECT * FROM t1 INNER JOIN t2 USING(c1)").from).joins,
vec![join_with_constraint("t2", None, JoinOperator::Inner)]
);
assert_eq!(
@@ -6722,9 +6726,14 @@ fn parse_natural_join() {
}
}
- // if not specified, inner join as default
+ // unspecified join
assert_eq!(
only(&verified_only_select("SELECT * FROM t1 NATURAL JOIN t2").from).joins,
+ vec![natural_join(JoinOperator::Join, None)]
+ );
+ // inner join explicitly
+ assert_eq!(
+ only(&verified_only_select("SELECT * FROM t1 NATURAL INNER JOIN t2").from).joins,
vec![natural_join(JoinOperator::Inner, None)]
);
// left join explicitly
@@ -6748,7 +6757,7 @@ fn parse_natural_join() {
// 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"))]
+ vec![natural_join(JoinOperator::Join, table_alias("t3"))]
);
let sql = "SELECT * FROM t1 natural";
@@ -6816,8 +6825,12 @@ fn parse_join_nesting() {
#[test]
fn parse_join_syntax_variants() {
one_statement_parses_to(
- "SELECT c1 FROM t1 INNER JOIN t2 USING(c1)",
"SELECT c1 FROM t1 JOIN t2 USING(c1)",
+ "SELECT c1 FROM t1 JOIN t2 USING(c1)",
+ );
+ one_statement_parses_to(
+ "SELECT c1 FROM t1 INNER JOIN t2 USING(c1)",
+ "SELECT c1 FROM t1 INNER JOIN t2 USING(c1)",
);
one_statement_parses_to(
"SELECT c1 FROM t1 LEFT OUTER JOIN t2 USING(c1)",
@@ -6981,7 +6994,7 @@ fn parse_derived_tables() {
joins: vec![Join {
relation: table_from_name(ObjectName::from(vec!["t2".into()])),
global: false,
- join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+ join_operator: JoinOperator::Join(JoinConstraint::Natural),
}],
}),
alias: None,
diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs
index 501dce3e..2e6dfc72 100644
--- a/tests/sqlparser_mysql.rs
+++ b/tests/sqlparser_mysql.rs
@@ -2055,7 +2055,7 @@ fn parse_update_with_joins() {
index_hints: vec![],
},
global: false,
- join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+ join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
left: Box::new(Expr::CompoundIdentifier(vec![
Ident::new("o"),
Ident::new("customer_id")
diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs
index b3eb4f10..9bccda11 100644
--- a/tests/sqlparser_postgres.rs
+++ b/tests/sqlparser_postgres.rs
@@ -4371,7 +4371,7 @@ fn parse_join_constraint_unnest_alias() {
with_ordinality: false,
},
global: false,
- join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+ join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
left: Box::new(Expr::Identifier("c1".into())),
op: BinaryOperator::Eq,
right: Box::new(Expr::Identifier("c2".into())),
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org