@@ -702,14 +702,10 @@ impl Parser {
702
702
/// Consume the next token if it matches the expected token, otherwise return false
703
703
#[ must_use]
704
704
pub fn consume_token ( & mut self , expected : & Token ) -> bool {
705
- match self . peek_token ( ) {
706
- Some ( ref t) => {
707
- if * t == * expected {
708
- self . next_token ( ) ;
709
- true
710
- } else {
711
- false
712
- }
705
+ match & self . peek_token ( ) {
706
+ Some ( t) if * t == * expected => {
707
+ self . next_token ( ) ;
708
+ true
713
709
}
714
710
_ => false ,
715
711
}
@@ -1503,90 +1499,62 @@ impl Parser {
1503
1499
fn parse_joins ( & mut self ) -> Result < Vec < Join > , ParserError > {
1504
1500
let mut joins = vec ! [ ] ;
1505
1501
loop {
1506
- let natural = match & self . peek_token ( ) {
1507
- Some ( Token :: Comma ) => {
1508
- self . next_token ( ) ;
1509
- let relation = self . parse_table_factor ( ) ?;
1510
- let join = Join {
1511
- relation,
1512
- join_operator : JoinOperator :: Implicit ,
1513
- } ;
1514
- joins. push ( join) ;
1515
- continue ;
1516
- }
1517
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "CROSS" => {
1518
- self . next_token ( ) ;
1519
- self . expect_keyword ( "JOIN" ) ?;
1520
- let relation = self . parse_table_factor ( ) ?;
1521
- let join = Join {
1522
- relation,
1523
- join_operator : JoinOperator :: Cross ,
1524
- } ;
1525
- joins. push ( join) ;
1526
- continue ;
1527
- }
1528
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "NATURAL" => {
1529
- self . next_token ( ) ;
1530
- true
1531
- }
1532
- Some ( _) => false ,
1533
- None => return Ok ( joins) ,
1534
- } ;
1535
-
1536
1502
let join = match & self . peek_token ( ) {
1537
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "INNER" => {
1538
- self . next_token ( ) ;
1539
- self . expect_keyword ( "JOIN" ) ?;
1540
- Join {
1541
- relation : self . parse_table_factor ( ) ?,
1542
- join_operator : JoinOperator :: Inner ( self . parse_join_constraint ( natural) ?) ,
1543
- }
1544
- }
1545
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "JOIN" => {
1546
- self . next_token ( ) ;
1547
- Join {
1548
- relation : self . parse_table_factor ( ) ?,
1549
- join_operator : JoinOperator :: Inner ( self . parse_join_constraint ( natural) ?) ,
1550
- }
1551
- }
1552
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "LEFT" => {
1503
+ Some ( Token :: Comma ) => {
1553
1504
self . next_token ( ) ;
1554
- let _ = self . parse_keyword ( "OUTER" ) ;
1555
- self . expect_keyword ( "JOIN" ) ?;
1556
1505
Join {
1557
1506
relation : self . parse_table_factor ( ) ?,
1558
- join_operator : JoinOperator :: LeftOuter (
1559
- self . parse_join_constraint ( natural) ?,
1560
- ) ,
1507
+ join_operator : JoinOperator :: Implicit ,
1561
1508
}
1562
1509
}
1563
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "RIGHT " => {
1510
+ Some ( Token :: SQLWord ( kw) ) if kw. keyword == "CROSS " => {
1564
1511
self . next_token ( ) ;
1565
- let _ = self . parse_keyword ( "OUTER" ) ;
1566
1512
self . expect_keyword ( "JOIN" ) ?;
1567
1513
Join {
1568
1514
relation : self . parse_table_factor ( ) ?,
1569
- join_operator : JoinOperator :: RightOuter (
1570
- self . parse_join_constraint ( natural) ?,
1571
- ) ,
1515
+ join_operator : JoinOperator :: Cross ,
1572
1516
}
1573
1517
}
1574
- Some ( Token :: SQLWord ( kw) ) if kw. keyword == "FULL" => {
1575
- self . next_token ( ) ;
1576
- let _ = self . parse_keyword ( "OUTER" ) ;
1577
- self . expect_keyword ( "JOIN" ) ?;
1518
+ _ => {
1519
+ let natural = self . parse_keyword ( "NATURAL" ) ;
1520
+ let peek_keyword = if let Some ( Token :: SQLWord ( kw) ) = self . peek_token ( ) {
1521
+ kw. keyword
1522
+ } else {
1523
+ String :: default ( )
1524
+ } ;
1525
+
1526
+ let join_operator_type = match peek_keyword. as_ref ( ) {
1527
+ "INNER" | "JOIN" => {
1528
+ let _ = self . parse_keyword ( "INNER" ) ;
1529
+ self . expect_keyword ( "JOIN" ) ?;
1530
+ JoinOperator :: Inner
1531
+ }
1532
+ kw @ "LEFT" | kw @ "RIGHT" | kw @ "FULL" => {
1533
+ let _ = self . next_token ( ) ;
1534
+ let _ = self . parse_keyword ( "OUTER" ) ;
1535
+ self . expect_keyword ( "JOIN" ) ?;
1536
+ match kw {
1537
+ "LEFT" => JoinOperator :: LeftOuter ,
1538
+ "RIGHT" => JoinOperator :: RightOuter ,
1539
+ "FULL" => JoinOperator :: FullOuter ,
1540
+ _ => unreachable ! ( ) ,
1541
+ }
1542
+ }
1543
+ _ if natural => {
1544
+ return self . expected ( "a join type after NATURAL" , self . peek_token ( ) ) ;
1545
+ }
1546
+ _ => break ,
1547
+ } ;
1548
+ let relation = self . parse_table_factor ( ) ?;
1549
+ let join_constraint = self . parse_join_constraint ( natural) ?;
1578
1550
Join {
1579
- relation : self . parse_table_factor ( ) ?,
1580
- join_operator : JoinOperator :: FullOuter (
1581
- self . parse_join_constraint ( natural) ?,
1582
- ) ,
1551
+ relation,
1552
+ join_operator : join_operator_type ( join_constraint) ,
1583
1553
}
1584
1554
}
1585
- _ => break ,
1586
1555
} ;
1587
1556
joins. push ( join) ;
1588
1557
}
1589
-
1590
1558
Ok ( joins)
1591
1559
}
1592
1560
@@ -1611,10 +1579,9 @@ impl Parser {
1611
1579
let mut expr_list: Vec < ASTNode > = vec ! [ ] ;
1612
1580
loop {
1613
1581
expr_list. push ( self . parse_expr ( ) ?) ;
1614
- match self . peek_token ( ) {
1615
- Some ( Token :: Comma ) => self . next_token ( ) ,
1616
- _ => break ,
1617
- } ;
1582
+ if !self . consume_token ( & Token :: Comma ) {
1583
+ break ;
1584
+ }
1618
1585
}
1619
1586
Ok ( expr_list)
1620
1587
}
@@ -1649,10 +1616,9 @@ impl Parser {
1649
1616
}
1650
1617
}
1651
1618
1652
- match self . peek_token ( ) {
1653
- Some ( Token :: Comma ) => self . next_token ( ) ,
1654
- _ => break ,
1655
- } ;
1619
+ if !self . consume_token ( & Token :: Comma ) {
1620
+ break ;
1621
+ }
1656
1622
}
1657
1623
Ok ( projections)
1658
1624
}
@@ -1672,10 +1638,7 @@ impl Parser {
1672
1638
} ;
1673
1639
1674
1640
expr_list. push ( SQLOrderByExpr { expr, asc } ) ;
1675
-
1676
- if let Some ( Token :: Comma ) = self . peek_token ( ) {
1677
- self . next_token ( ) ;
1678
- } else {
1641
+ if !self . consume_token ( & Token :: Comma ) {
1679
1642
break ;
1680
1643
}
1681
1644
}
0 commit comments