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

Method parse_query_tail

src/sql-parser/src/parser.rs:7559–7678  ·  view source on GitHub ↗
(
        &mut self,
        ctes: CteBlock<Raw>,
        body: SetExpr<Raw>,
    )

Source from the content-addressed store, hash-verified

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 {

Callers 2

parse_queryMethod · 0.80

Calls 12

parse_keywordsMethod · 0.80
parse_comma_separatedMethod · 0.80
parse_one_of_keywordsMethod · 0.80
is_someMethod · 0.80
parse_keywordMethod · 0.80
parse_exprMethod · 0.80
expectedMethod · 0.80
peek_posMethod · 0.80
peek_tokenMethod · 0.80
ValueEnum · 0.50
is_emptyMethod · 0.45

Tested by

no test coverage detected