MCPcopy Create free account
hub / github.com/MaterializeInc/materialize / parse_table_and_joins

Method parse_table_and_joins

src/sql-parser/src/parser.rs:8324–8389  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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 {

Callers 1

Calls 9

parse_table_factorMethod · 0.80
parse_keywordMethod · 0.80
expect_keywordMethod · 0.80
peek_tokenMethod · 0.80
next_tokenMethod · 0.80
expectedMethod · 0.80
peek_posMethod · 0.80
parse_join_constraintMethod · 0.80
pushMethod · 0.45

Tested by

no test coverage detected