Skip to content

Commit 665b9df

Browse files
committed
Refactor parse_joins, pt.1: INNER/OUTER joins
This block parses one of: - `[ INNER ] JOIN <table_factor> <join_constraint>` - `{ LEFT | RIGHT | FULL } [ OUTER ] JOIN <table_factor> <join_constraint>` ..but it was hard to see because of the duplication.
1 parent 8206523 commit 665b9df

File tree

1 file changed

+24
-43
lines changed

1 file changed

+24
-43
lines changed

src/sqlparser.rs

+24-43
Original file line numberDiff line numberDiff line change
@@ -1529,57 +1529,38 @@ impl Parser {
15291529
None => return Ok(joins),
15301530
};
15311531

1532-
let join = match &self.peek_token() {
1533-
Some(Token::SQLWord(kw)) if kw.keyword == "INNER" => {
1534-
self.next_token();
1535-
self.expect_keyword("JOIN")?;
1536-
Join {
1537-
relation: self.parse_table_factor()?,
1538-
join_operator: JoinOperator::Inner(self.parse_join_constraint(natural)?),
1539-
}
1540-
}
1541-
Some(Token::SQLWord(kw)) if kw.keyword == "JOIN" => {
1542-
self.next_token();
1543-
Join {
1544-
relation: self.parse_table_factor()?,
1545-
join_operator: JoinOperator::Inner(self.parse_join_constraint(natural)?),
1546-
}
1547-
}
1548-
Some(Token::SQLWord(kw)) if kw.keyword == "LEFT" => {
1549-
self.next_token();
1550-
let _ = self.parse_keyword("OUTER");
1551-
self.expect_keyword("JOIN")?;
1552-
Join {
1553-
relation: self.parse_table_factor()?,
1554-
join_operator: JoinOperator::LeftOuter(
1555-
self.parse_join_constraint(natural)?,
1556-
),
1557-
}
1558-
}
1559-
Some(Token::SQLWord(kw)) if kw.keyword == "RIGHT" => {
1560-
self.next_token();
1561-
let _ = self.parse_keyword("OUTER");
1532+
let peek_keyword = if let Some(Token::SQLWord(kw)) = self.peek_token() {
1533+
kw.keyword
1534+
} else {
1535+
String::default()
1536+
};
1537+
1538+
let join_operator_type = match peek_keyword.as_ref() {
1539+
"INNER" | "JOIN" => {
1540+
let _ = self.parse_keyword("INNER");
15621541
self.expect_keyword("JOIN")?;
1563-
Join {
1564-
relation: self.parse_table_factor()?,
1565-
join_operator: JoinOperator::RightOuter(
1566-
self.parse_join_constraint(natural)?,
1567-
),
1568-
}
1542+
JoinOperator::Inner
15691543
}
1570-
Some(Token::SQLWord(kw)) if kw.keyword == "FULL" => {
1571-
self.next_token();
1544+
kw @ "LEFT" | kw @ "RIGHT" | kw @ "FULL" => {
1545+
let _ = self.next_token();
15721546
let _ = self.parse_keyword("OUTER");
15731547
self.expect_keyword("JOIN")?;
1574-
Join {
1575-
relation: self.parse_table_factor()?,
1576-
join_operator: JoinOperator::FullOuter(
1577-
self.parse_join_constraint(natural)?,
1578-
),
1548+
match kw {
1549+
"LEFT" => JoinOperator::LeftOuter,
1550+
"RIGHT" => JoinOperator::RightOuter,
1551+
"FULL" => JoinOperator::FullOuter,
1552+
_ => unreachable!(),
15791553
}
15801554
}
15811555
_ => break,
15821556
};
1557+
let relation = self.parse_table_factor()?;
1558+
let join_constraint = self.parse_join_constraint(natural)?;
1559+
let join = Join {
1560+
relation,
1561+
join_operator: join_operator_type(join_constraint),
1562+
};
1563+
15831564
joins.push(join);
15841565
}
15851566

0 commit comments

Comments
 (0)