@@ -109,7 +109,7 @@ impl Parser {
109
109
match self . next_token ( ) {
110
110
Some ( t) => match t {
111
111
Token :: SQLWord ( ref w) if w. keyword != "" => match w. keyword . as_ref ( ) {
112
- "SELECT" | "WITH" => {
112
+ "SELECT" | "WITH" | "VALUES" => {
113
113
self . prev_token ( ) ;
114
114
Ok ( SQLStatement :: SQLQuery ( Box :: new ( self . parse_query ( ) ?) ) )
115
115
}
@@ -133,6 +133,10 @@ impl Parser {
133
133
w. to_string( )
134
134
) ) ,
135
135
} ,
136
+ Token :: LParen => {
137
+ self . prev_token ( ) ;
138
+ Ok ( SQLStatement :: SQLQuery ( Box :: new ( self . parse_query ( ) ?) ) )
139
+ }
136
140
unexpected => self . expected (
137
141
"a keyword at the beginning of a statement" ,
138
142
Some ( unexpected) ,
@@ -1570,13 +1574,15 @@ impl Parser {
1570
1574
}
1571
1575
let projection = self . parse_select_list ( ) ?;
1572
1576
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
- } ;
1577
+ let mut from = vec ! [ ] ;
1578
+ if self . parse_keyword ( "FROM" ) {
1579
+ loop {
1580
+ from. push ( self . parse_table_and_joins ( ) ?) ;
1581
+ if !self . consume_token ( & Token :: Comma ) {
1582
+ break ;
1583
+ }
1584
+ }
1585
+ }
1580
1586
1581
1587
let selection = if self . parse_keyword ( "WHERE" ) {
1582
1588
Some ( self . parse_expr ( ) ?)
@@ -1599,14 +1605,69 @@ impl Parser {
1599
1605
Ok ( SQLSelect {
1600
1606
distinct,
1601
1607
projection,
1608
+ from,
1602
1609
selection,
1603
- relation,
1604
- joins,
1605
1610
group_by,
1606
1611
having,
1607
1612
} )
1608
1613
}
1609
1614
1615
+ pub fn parse_table_and_joins ( & mut self ) -> Result < TableWithJoins , ParserError > {
1616
+ let relation = self . parse_table_factor ( ) ?;
1617
+ let mut joins = vec ! [ ] ;
1618
+ loop {
1619
+ let join = match & self . peek_token ( ) {
1620
+ Some ( Token :: SQLWord ( kw) ) if kw. keyword == "CROSS" => {
1621
+ self . next_token ( ) ;
1622
+ self . expect_keyword ( "JOIN" ) ?;
1623
+ Join {
1624
+ relation : self . parse_table_factor ( ) ?,
1625
+ join_operator : JoinOperator :: Cross ,
1626
+ }
1627
+ }
1628
+ _ => {
1629
+ let natural = self . parse_keyword ( "NATURAL" ) ;
1630
+ let peek_keyword = if let Some ( Token :: SQLWord ( kw) ) = self . peek_token ( ) {
1631
+ kw. keyword
1632
+ } else {
1633
+ String :: default ( )
1634
+ } ;
1635
+
1636
+ let join_operator_type = match peek_keyword. as_ref ( ) {
1637
+ "INNER" | "JOIN" => {
1638
+ let _ = self . parse_keyword ( "INNER" ) ;
1639
+ self . expect_keyword ( "JOIN" ) ?;
1640
+ JoinOperator :: Inner
1641
+ }
1642
+ kw @ "LEFT" | kw @ "RIGHT" | kw @ "FULL" => {
1643
+ let _ = self . next_token ( ) ;
1644
+ let _ = self . parse_keyword ( "OUTER" ) ;
1645
+ self . expect_keyword ( "JOIN" ) ?;
1646
+ match kw {
1647
+ "LEFT" => JoinOperator :: LeftOuter ,
1648
+ "RIGHT" => JoinOperator :: RightOuter ,
1649
+ "FULL" => JoinOperator :: FullOuter ,
1650
+ _ => unreachable ! ( ) ,
1651
+ }
1652
+ }
1653
+ _ if natural => {
1654
+ return self . expected ( "a join type after NATURAL" , self . peek_token ( ) ) ;
1655
+ }
1656
+ _ => break ,
1657
+ } ;
1658
+ let relation = self . parse_table_factor ( ) ?;
1659
+ let join_constraint = self . parse_join_constraint ( natural) ?;
1660
+ Join {
1661
+ relation,
1662
+ join_operator : join_operator_type ( join_constraint) ,
1663
+ }
1664
+ }
1665
+ } ;
1666
+ joins. push ( join) ;
1667
+ }
1668
+ Ok ( TableWithJoins { relation, joins } )
1669
+ }
1670
+
1610
1671
/// A table name or a parenthesized subquery, followed by optional `[AS] alias`
1611
1672
pub fn parse_table_factor ( & mut self ) -> Result < TableFactor , ParserError > {
1612
1673
let lateral = self . parse_keyword ( "LATERAL" ) ;
@@ -1627,10 +1688,9 @@ impl Parser {
1627
1688
} else if lateral {
1628
1689
parser_err ! ( "Expected subquery after LATERAL, found nested join" . to_string( ) )
1629
1690
} else {
1630
- let base = Box :: new ( self . parse_table_factor ( ) ?) ;
1631
- let joins = self . parse_joins ( ) ?;
1691
+ let table_reference = self . parse_table_and_joins ( ) ?;
1632
1692
self . expect_token ( & Token :: RParen ) ?;
1633
- Ok ( TableFactor :: NestedJoin { base , joins } )
1693
+ Ok ( TableFactor :: NestedJoin ( Box :: new ( table_reference ) ) )
1634
1694
}
1635
1695
} else if lateral {
1636
1696
self . expected ( "subquery after LATERAL" , self . peek_token ( ) )
@@ -1677,68 +1737,6 @@ impl Parser {
1677
1737
}
1678
1738
}
1679
1739
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
1740
/// Parse an INSERT statement
1743
1741
pub fn parse_insert ( & mut self ) -> Result < SQLStatement , ParserError > {
1744
1742
self . expect_keyword ( "INTO" ) ?;
0 commit comments