@@ -1570,13 +1570,15 @@ impl Parser {
1570
1570
}
1571
1571
let projection = self . parse_select_list ( ) ?;
1572
1572
1573
- let ( relation, joins) = if self . parse_keyword ( "FROM" ) {
1574
- let relation = Some ( self . parse_table_factor ( ) ?) ;
1575
- let joins = self . parse_joins ( ) ?;
1576
- ( relation, joins)
1577
- } else {
1578
- ( None , vec ! [ ] )
1579
- } ;
1573
+ let mut from = vec ! [ ] ;
1574
+ if self . parse_keyword ( "FROM" ) {
1575
+ loop {
1576
+ from. push ( self . parse_table_and_joins ( ) ?) ;
1577
+ if !self . consume_token ( & Token :: Comma ) {
1578
+ break ;
1579
+ }
1580
+ }
1581
+ }
1580
1582
1581
1583
let selection = if self . parse_keyword ( "WHERE" ) {
1582
1584
Some ( self . parse_expr ( ) ?)
@@ -1599,14 +1601,69 @@ impl Parser {
1599
1601
Ok ( SQLSelect {
1600
1602
distinct,
1601
1603
projection,
1604
+ from,
1602
1605
selection,
1603
- relation,
1604
- joins,
1605
1606
group_by,
1606
1607
having,
1607
1608
} )
1608
1609
}
1609
1610
1611
+ pub fn parse_table_and_joins ( & mut self ) -> Result < TableAndJoins , ParserError > {
1612
+ let relation = self . parse_table_factor ( ) ?;
1613
+ let mut joins = vec ! [ ] ;
1614
+ loop {
1615
+ let join = match & self . peek_token ( ) {
1616
+ Some ( Token :: SQLWord ( kw) ) if kw. keyword == "CROSS" => {
1617
+ self . next_token ( ) ;
1618
+ self . expect_keyword ( "JOIN" ) ?;
1619
+ Join {
1620
+ relation : self . parse_table_factor ( ) ?,
1621
+ join_operator : JoinOperator :: Cross ,
1622
+ }
1623
+ }
1624
+ _ => {
1625
+ let natural = self . parse_keyword ( "NATURAL" ) ;
1626
+ let peek_keyword = if let Some ( Token :: SQLWord ( kw) ) = self . peek_token ( ) {
1627
+ kw. keyword
1628
+ } else {
1629
+ String :: default ( )
1630
+ } ;
1631
+
1632
+ let join_operator_type = match peek_keyword. as_ref ( ) {
1633
+ "INNER" | "JOIN" => {
1634
+ let _ = self . parse_keyword ( "INNER" ) ;
1635
+ self . expect_keyword ( "JOIN" ) ?;
1636
+ JoinOperator :: Inner
1637
+ }
1638
+ kw @ "LEFT" | kw @ "RIGHT" | kw @ "FULL" => {
1639
+ let _ = self . next_token ( ) ;
1640
+ let _ = self . parse_keyword ( "OUTER" ) ;
1641
+ self . expect_keyword ( "JOIN" ) ?;
1642
+ match kw {
1643
+ "LEFT" => JoinOperator :: LeftOuter ,
1644
+ "RIGHT" => JoinOperator :: RightOuter ,
1645
+ "FULL" => JoinOperator :: FullOuter ,
1646
+ _ => unreachable ! ( ) ,
1647
+ }
1648
+ }
1649
+ _ if natural => {
1650
+ return self . expected ( "a join type after NATURAL" , self . peek_token ( ) ) ;
1651
+ }
1652
+ _ => break ,
1653
+ } ;
1654
+ let relation = self . parse_table_factor ( ) ?;
1655
+ let join_constraint = self . parse_join_constraint ( natural) ?;
1656
+ Join {
1657
+ relation,
1658
+ join_operator : join_operator_type ( join_constraint) ,
1659
+ }
1660
+ }
1661
+ } ;
1662
+ joins. push ( join) ;
1663
+ }
1664
+ Ok ( TableAndJoins { relation, joins } )
1665
+ }
1666
+
1610
1667
/// A table name or a parenthesized subquery, followed by optional `[AS] alias`
1611
1668
pub fn parse_table_factor ( & mut self ) -> Result < TableFactor , ParserError > {
1612
1669
let lateral = self . parse_keyword ( "LATERAL" ) ;
@@ -1627,10 +1684,9 @@ impl Parser {
1627
1684
} else if lateral {
1628
1685
parser_err ! ( "Expected subquery after LATERAL, found nested join" . to_string( ) )
1629
1686
} else {
1630
- let base = Box :: new ( self . parse_table_factor ( ) ?) ;
1631
- let joins = self . parse_joins ( ) ?;
1687
+ let table_reference = self . parse_table_and_joins ( ) ?;
1632
1688
self . expect_token ( & Token :: RParen ) ?;
1633
- Ok ( TableFactor :: NestedJoin { base , joins } )
1689
+ Ok ( TableFactor :: NestedJoin ( Box :: new ( table_reference ) ) )
1634
1690
}
1635
1691
} else if lateral {
1636
1692
self . expected ( "subquery after LATERAL" , self . peek_token ( ) )
@@ -1677,68 +1733,6 @@ impl Parser {
1677
1733
}
1678
1734
}
1679
1735
1680
- fn parse_joins ( & mut self ) -> Result < Vec < Join > , ParserError > {
1681
- let mut joins = vec ! [ ] ;
1682
- loop {
1683
- let join = match & self . peek_token ( ) {
1684
- Some ( Token :: Comma ) => {
1685
- self . next_token ( ) ;
1686
- Join {
1687
- relation : self . parse_table_factor ( ) ?,
1688
- join_operator : JoinOperator :: Implicit ,
1689
- }
1690
- }
1691
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "CROSS" => {
1692
- self . next_token ( ) ;
1693
- self . expect_keyword ( "JOIN" ) ?;
1694
- Join {
1695
- relation : self . parse_table_factor ( ) ?,
1696
- join_operator : JoinOperator :: Cross ,
1697
- }
1698
- }
1699
- _ => {
1700
- let natural = self . parse_keyword ( "NATURAL" ) ;
1701
- let peek_keyword = if let Some ( Token :: SQLWord ( kw) ) = self . peek_token ( ) {
1702
- kw. keyword
1703
- } else {
1704
- String :: default ( )
1705
- } ;
1706
-
1707
- let join_operator_type = match peek_keyword. as_ref ( ) {
1708
- "INNER" | "JOIN" => {
1709
- let _ = self . parse_keyword ( "INNER" ) ;
1710
- self . expect_keyword ( "JOIN" ) ?;
1711
- JoinOperator :: Inner
1712
- }
1713
- kw @ "LEFT" | kw @ "RIGHT" | kw @ "FULL" => {
1714
- let _ = self . next_token ( ) ;
1715
- let _ = self . parse_keyword ( "OUTER" ) ;
1716
- self . expect_keyword ( "JOIN" ) ?;
1717
- match kw {
1718
- "LEFT" => JoinOperator :: LeftOuter ,
1719
- "RIGHT" => JoinOperator :: RightOuter ,
1720
- "FULL" => JoinOperator :: FullOuter ,
1721
- _ => unreachable ! ( ) ,
1722
- }
1723
- }
1724
- _ if natural => {
1725
- return self . expected ( "a join type after NATURAL" , self . peek_token ( ) ) ;
1726
- }
1727
- _ => break ,
1728
- } ;
1729
- let relation = self . parse_table_factor ( ) ?;
1730
- let join_constraint = self . parse_join_constraint ( natural) ?;
1731
- Join {
1732
- relation,
1733
- join_operator : join_operator_type ( join_constraint) ,
1734
- }
1735
- }
1736
- } ;
1737
- joins. push ( join) ;
1738
- }
1739
- Ok ( joins)
1740
- }
1741
-
1742
1736
/// Parse an INSERT statement
1743
1737
pub fn parse_insert ( & mut self ) -> Result < SQLStatement , ParserError > {
1744
1738
self . expect_keyword ( "INTO" ) ?;
0 commit comments