(
&mut self,
precedence: SetPrecedence,
mut expr: SetExpr<Raw>,
)
| 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 { |
no test coverage detected