(
&mut self,
ctes: CteBlock<Raw>,
body: SetExpr<Raw>,
)
| 7557 | } |
| 7558 | |
| 7559 | fn parse_query_tail( |
| 7560 | &mut self, |
| 7561 | ctes: CteBlock<Raw>, |
| 7562 | body: SetExpr<Raw>, |
| 7563 | ) -> Result<Query<Raw>, ParserError> { |
| 7564 | let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body { |
| 7565 | SetExpr::Query(query) => { |
| 7566 | let Query { |
| 7567 | ctes, |
| 7568 | body, |
| 7569 | order_by, |
| 7570 | limit, |
| 7571 | offset, |
| 7572 | } = *query; |
| 7573 | (ctes, order_by, limit, offset, body) |
| 7574 | } |
| 7575 | _ => (CteBlock::empty(), vec![], None, None, body), |
| 7576 | }; |
| 7577 | |
| 7578 | let ctes = if ctes.is_empty() { |
| 7579 | inner_ctes |
| 7580 | } else if !inner_ctes.is_empty() { |
| 7581 | return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed"); |
| 7582 | } else { |
| 7583 | ctes |
| 7584 | }; |
| 7585 | |
| 7586 | let order_by = if self.parse_keywords(&[ORDER, BY]) { |
| 7587 | if !inner_order_by.is_empty() { |
| 7588 | return parser_err!( |
| 7589 | self, |
| 7590 | self.peek_prev_pos(), |
| 7591 | "multiple ORDER BY clauses not allowed" |
| 7592 | ); |
| 7593 | } |
| 7594 | self.parse_comma_separated(Parser::parse_order_by_expr)? |
| 7595 | } else { |
| 7596 | inner_order_by |
| 7597 | }; |
| 7598 | |
| 7599 | // Parse LIMIT, FETCH, OFFSET in any order, but: |
| 7600 | // - Only at most one of LIMIT or FETCH is allowed. |
| 7601 | // - Only at most one occurrence is allowed from each of these. |
| 7602 | let mut limit = inner_limit; |
| 7603 | let mut offset = inner_offset; |
| 7604 | while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) { |
| 7605 | match parsed_keyword { |
| 7606 | LIMIT => { |
| 7607 | if limit.is_some() { |
| 7608 | return parser_err!( |
| 7609 | self, |
| 7610 | self.peek_prev_pos(), |
| 7611 | "multiple LIMIT/FETCH clauses not allowed" |
| 7612 | ); |
| 7613 | } |
| 7614 | limit = if self.parse_keyword(ALL) { |
| 7615 | None |
| 7616 | } else { |
no test coverage detected