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

Method parse_query_body_seeded

src/sql-parser/src/parser.rs:7760–7800  ·  view source on GitHub ↗
(
        &mut self,
        precedence: SetPrecedence,
        mut expr: SetExpr<Raw>,
    )

Source from the content-addressed store, hash-verified

7758 }
7759
7760 fn parse_query_body_seeded(
7761 &mut self,
7762 precedence: SetPrecedence,
7763 mut expr: SetExpr<Raw>,
7764 ) -> Result<SetExpr<Raw>, ParserError> {
7765 loop {
7766 // The query can be optionally followed by a set operator:
7767 let next_token = self.peek_token();
7768 let op = self.parse_set_operator(&next_token);
7769 let next_precedence = match op {
7770 // UNION and EXCEPT have the same precedence and evaluate left-to-right
7771 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7772 // INTERSECT has higher precedence than UNION/EXCEPT
7773 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7774 // Unexpected token or EOF => stop parsing the query body
7775 None => break,
7776 };
7777 if precedence >= next_precedence {
7778 break;
7779 }
7780 self.next_token(); // skip past the set operator
7781
7782 let all = self.parse_keyword(ALL);
7783 let distinct = self.parse_keyword(DISTINCT);
7784 if all && distinct {
7785 return parser_err!(
7786 self,
7787 self.peek_prev_pos(),
7788 "Cannot specify both ALL and DISTINCT in set operation"
7789 );
7790 }
7791 expr = SetExpr::SetOperation {
7792 left: Box::new(expr),
7793 op: op.unwrap(),
7794 all,
7795 right: Box::new(self.parse_query_body(next_precedence)?),
7796 };
7797 }
7798
7799 Ok(expr)
7800 }
7801
7802 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
7803 match token {

Callers 2

parse_query_bodyMethod · 0.80

Calls 6

peek_tokenMethod · 0.80
parse_set_operatorMethod · 0.80
next_tokenMethod · 0.80
parse_keywordMethod · 0.80
unwrapMethod · 0.80
parse_query_bodyMethod · 0.80

Tested by

no test coverage detected