(&mut self)
| 8322 | } |
| 8323 | |
| 8324 | fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> { |
| 8325 | let relation = self.parse_table_factor()?; |
| 8326 | |
| 8327 | // Note that for keywords to be properly handled here, they need to be |
| 8328 | // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as |
| 8329 | // a table alias. |
| 8330 | let mut joins = vec![]; |
| 8331 | loop { |
| 8332 | let join = if self.parse_keyword(CROSS) { |
| 8333 | self.expect_keyword(JOIN)?; |
| 8334 | Join { |
| 8335 | relation: self.parse_table_factor()?, |
| 8336 | join_operator: JoinOperator::CrossJoin, |
| 8337 | } |
| 8338 | } else { |
| 8339 | let natural = self.parse_keyword(NATURAL); |
| 8340 | let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() { |
| 8341 | Some(kw) |
| 8342 | } else { |
| 8343 | None |
| 8344 | }; |
| 8345 | |
| 8346 | let join_operator_type = match peek_keyword { |
| 8347 | Some(INNER) | Some(JOIN) => { |
| 8348 | let _ = self.parse_keyword(INNER); |
| 8349 | self.expect_keyword(JOIN)?; |
| 8350 | JoinOperator::Inner |
| 8351 | } |
| 8352 | Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => { |
| 8353 | let _ = self.next_token(); |
| 8354 | let _ = self.parse_keyword(OUTER); |
| 8355 | self.expect_keyword(JOIN)?; |
| 8356 | match kw { |
| 8357 | LEFT => JoinOperator::LeftOuter, |
| 8358 | RIGHT => JoinOperator::RightOuter, |
| 8359 | FULL => JoinOperator::FullOuter, |
| 8360 | _ => unreachable!(), |
| 8361 | } |
| 8362 | } |
| 8363 | Some(OUTER) => { |
| 8364 | return self.expected( |
| 8365 | self.peek_pos(), |
| 8366 | "LEFT, RIGHT, or FULL", |
| 8367 | self.peek_token(), |
| 8368 | ); |
| 8369 | } |
| 8370 | None if natural => { |
| 8371 | return self.expected( |
| 8372 | self.peek_pos(), |
| 8373 | "a join type after NATURAL", |
| 8374 | self.peek_token(), |
| 8375 | ); |
| 8376 | } |
| 8377 | _ => break, |
| 8378 | }; |
| 8379 | let relation = self.parse_table_factor()?; |
| 8380 | let join_constraint = self.parse_join_constraint(natural)?; |
| 8381 | Join { |
no test coverage detected