Skip to main content

mz_sql_parser/
parser.rs

1// Copyright 2018 sqlparser-rs contributors. All rights reserved.
2// Copyright Materialize, Inc. and contributors. All rights reserved.
3//
4// This file is derived from the sqlparser-rs project, available at
5// https://github.com/andygrove/sqlparser-rs. It was incorporated
6// directly into Materialize on December 21, 2019.
7//
8// Licensed under the Apache License, Version 2.0 (the "License");
9// you may not use this file except in compliance with the License.
10// You may obtain a copy of the License in the LICENSE file at the
11// root of this repository, or online at
12//
13//     http://www.apache.org/licenses/LICENSE-2.0
14//
15// Unless required by applicable law or agreed to in writing, software
16// distributed under the License is distributed on an "AS IS" BASIS,
17// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18// See the License for the specific language governing permissions and
19// limitations under the License.
20
21//! SQL Parser
22
23use std::collections::BTreeMap;
24use std::error::Error;
25use std::fmt;
26
27use IsLateral::*;
28use IsOptional::*;
29use bytesize::ByteSize;
30use itertools::Itertools;
31use mz_ore::cast::CastFrom;
32use mz_ore::collections::CollectionExt;
33use mz_ore::option::OptionExt;
34use mz_ore::stack::{CheckedRecursion, RecursionGuard, RecursionLimitError};
35use mz_sql_lexer::keywords::*;
36use mz_sql_lexer::lexer::{self, IdentString, LexerError, PosToken, Token};
37use serde::{Deserialize, Serialize};
38use tracing::{debug, warn};
39
40use crate::ast::display::AstDisplay;
41use crate::ast::*;
42use crate::ident;
43
44// NOTE(benesch): this recursion limit was chosen based on the maximum amount of
45// nesting I've ever seen in a production SQL query (i.e., about a dozen) times
46// a healthy factor to be conservative.
47const RECURSION_LIMIT: usize = 128;
48
49// An iteratively-parsed expression chain (`a + b + c …`, `(a).f.g…`) adds one
50// level of AST depth per link, but — unlike parenthesized nesting — flat chains
51// are how wide predicates and sums are legitimately written (500-term chains
52// appear in test/limits and production workloads), so they get a much larger
53// budget than `RECURSION_LIMIT`. The limit matches the planner's recursion
54// guard (`RecursionGuard::with_limit(1024)` in mz-sql), which is what bounds
55// such chains during planning; a depth-1024 AST is also still shallow enough
56// for the plain-recursive display/drop/visit paths that unbounded chains
57// overflowed (the parse_expr_roundtrip fuzz finding).
58const EXPR_CHAIN_LIMIT: usize = 1024;
59
60/// Maximum allowed size for a batch of statements in bytes: 1MB.
61pub const MAX_STATEMENT_BATCH_SIZE: usize = 1_000_000;
62
63/// Keywords that indicate the start of a (sub)query.
64const QUERY_START_KEYWORDS: &[Keyword] = &[WITH, SELECT, SHOW, TABLE, VALUES];
65
66/// Keywords that indicate the start of an `ANY` or `ALL` subquery operation.
67const ANY_ALL_KEYWORDS: &[Keyword] = &[ANY, ALL, SOME];
68
69// Use `Parser::expected` instead, if possible
70macro_rules! parser_err {
71    ($parser:expr, $pos:expr, $MSG:expr) => {
72        Err($parser.error($pos, $MSG.to_string()))
73    };
74    ($parser:expr, $pos:expr, $($arg:tt)*) => {
75        Err($parser.error($pos, format!($($arg)*)))
76    };
77}
78
79/// The result of successfully parsing a statement:
80/// both the AST and the SQL text that it corresponds to
81#[derive(Debug, Clone)]
82pub struct StatementParseResult<'a> {
83    pub ast: Statement<Raw>,
84    pub sql: &'a str,
85}
86
87impl<'a> StatementParseResult<'a> {
88    pub fn new(ast: Statement<Raw>, sql: &'a str) -> Self {
89        Self { ast, sql }
90    }
91}
92
93trait ParserStatementErrorMapper<T> {
94    /// Wrap a `ParserError` within a `ParserStatementError` alongside the provided `StatementKind`
95    fn map_parser_err(self, statement_kind: StatementKind) -> Result<T, ParserStatementError>;
96
97    /// Wrap a `ParserError` within a `ParserStatementError` without an accompanying
98    /// `StatementKind`.
99    ///
100    /// This should be used when we do not know what specific statement is being parsed.
101    fn map_no_statement_parser_err(self) -> Result<T, ParserStatementError>;
102}
103
104impl<T> ParserStatementErrorMapper<T> for Result<T, ParserError> {
105    fn map_parser_err(self, statement: StatementKind) -> Result<T, ParserStatementError> {
106        self.map_err(|error| ParserStatementError {
107            error,
108            statement: Some(statement),
109        })
110    }
111
112    fn map_no_statement_parser_err(self) -> Result<T, ParserStatementError> {
113        self.map_err(|error| ParserStatementError {
114            error,
115            statement: None,
116        })
117    }
118}
119
120/// Parses a SQL string containing zero or more SQL statements.
121/// Statements larger than [`MAX_STATEMENT_BATCH_SIZE`] are rejected.
122///
123/// The outer Result is for errors related to the statement size. The inner Result is for
124/// errors during the parsing.
125#[mz_ore::instrument(target = "compiler", level = "trace", name = "sql_to_ast")]
126pub fn parse_statements_with_limit(
127    sql: &str,
128) -> Result<Result<Vec<StatementParseResult<'_>>, ParserStatementError>, String> {
129    if sql.len() > MAX_STATEMENT_BATCH_SIZE {
130        return Err(format!(
131            "statement batch size cannot exceed {}",
132            ByteSize::b(u64::cast_from(MAX_STATEMENT_BATCH_SIZE))
133        ));
134    }
135    Ok(parse_statements(sql))
136}
137
138/// Parses a SQL string containing zero or more SQL statements.
139#[mz_ore::instrument(target = "compiler", level = "trace", name = "sql_to_ast")]
140pub fn parse_statements(sql: &str) -> Result<Vec<StatementParseResult<'_>>, ParserStatementError> {
141    let tokens = lexer::lex(sql).map_err(|error| ParserStatementError {
142        error: error.into(),
143        statement: None,
144    })?;
145    let res = Parser::new(sql, tokens).parse_statements();
146    // Don't trace sensitive raw sql, so we can only trace after parsing, and then can only output
147    // redacted statements.
148    debug!("{:?}", {
149        match &res {
150            Ok(stmts) => stmts
151                .iter()
152                .map(|stmt| stmt.ast.to_ast_string_redacted())
153                .join("; "),
154            // Errors can leak sensitive SQL.
155            Err(_) => "parse error".to_string(),
156        }
157    });
158    res
159}
160
161/// Parses a SQL string containing one SQL expression.
162pub fn parse_expr(sql: &str) -> Result<Expr<Raw>, ParserError> {
163    let tokens = lexer::lex(sql)?;
164    let mut parser = Parser::new(sql, tokens);
165    let expr = parser.parse_expr()?;
166    if parser.next_token().is_some() {
167        parser_err!(
168            parser,
169            parser.peek_prev_pos(),
170            "extra token after expression"
171        )
172    } else {
173        Ok(expr)
174    }
175}
176
177/// Parses a SQL string containing a single data type.
178pub fn parse_data_type(sql: &str) -> Result<RawDataType, ParserError> {
179    let tokens = lexer::lex(sql)?;
180    let mut parser = Parser::new(sql, tokens);
181    let data_type = parser.parse_data_type()?;
182    if parser.next_token().is_some() {
183        parser_err!(
184            parser,
185            parser.peek_prev_pos(),
186            "extra token after data type"
187        )
188    } else {
189        Ok(data_type)
190    }
191}
192
193/// Parses a SQL item name (e.g. `"db"."schema"."table"` or `my_view`).
194pub fn parse_item_name(sql: &str) -> Result<UnresolvedItemName, ParserError> {
195    let tokens = lexer::lex(sql)?;
196    let mut parser = Parser::new(sql, tokens);
197    let name = parser.parse_item_name()?;
198    if parser.next_token().is_some() {
199        parser_err!(
200            parser,
201            parser.peek_prev_pos(),
202            "extra token after item name"
203        )
204    } else {
205        Ok(name)
206    }
207}
208
209/// Parses a SQL item name, rejecting inputs larger than
210/// [`MAX_STATEMENT_BATCH_SIZE`] before lexing.
211///
212/// The outer `Result` is for the size guard; the inner `Result` is for the
213/// parser. Mirrors [`parse_statements_with_limit`] so untrusted-input paths
214/// (e.g. the MCP HTTP handlers) can bound work before allocating.
215pub fn parse_item_name_with_limit(
216    sql: &str,
217) -> Result<Result<UnresolvedItemName, ParserError>, String> {
218    if sql.len() > MAX_STATEMENT_BATCH_SIZE {
219        return Err(format!(
220            "statement batch size cannot exceed {}",
221            ByteSize::b(u64::cast_from(MAX_STATEMENT_BATCH_SIZE))
222        ));
223    }
224    Ok(parse_item_name(sql))
225}
226
227/// Parses a string containing a comma-separated list of identifiers and
228/// returns their underlying string values.
229///
230/// This is analogous to the `SplitIdentifierString` function in PostgreSQL.
231pub fn split_identifier_string(s: &str) -> Result<Vec<String>, ParserError> {
232    // SplitIdentifierString ignores leading and trailing whitespace, and
233    // accepts empty input as a 0-length result.
234    if s.trim().is_empty() {
235        Ok(vec![])
236    } else {
237        let tokens = lexer::lex(s)?;
238        let mut parser = Parser::new(s, tokens);
239        let values = parser.parse_comma_separated(Parser::parse_set_variable_value)?;
240        Ok(values
241            .into_iter()
242            .map(|v| v.into_unquoted_value())
243            .collect())
244    }
245}
246
247macro_rules! maybe {
248    ($e:expr) => {{
249        if let Some(v) = $e {
250            return Ok(v);
251        }
252    }};
253}
254
255#[derive(PartialEq)]
256enum IsOptional {
257    Optional,
258    Mandatory,
259}
260
261enum IsLateral {
262    Lateral,
263    NotLateral,
264}
265
266#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
267pub struct ParserError {
268    /// The error message.
269    pub message: String,
270    /// The byte position with which the error is associated.
271    pub pos: usize,
272}
273
274impl fmt::Display for ParserError {
275    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
276        f.write_str(&self.message)
277    }
278}
279
280impl Error for ParserError {}
281
282impl From<RecursionLimitError> for ParserError {
283    fn from(_: RecursionLimitError) -> ParserError {
284        ParserError {
285            pos: 0,
286            message: format!(
287                "statement exceeds nested expression limit of {}",
288                RECURSION_LIMIT
289            ),
290        }
291    }
292}
293
294impl ParserError {
295    /// Constructs an error with the provided message at the provided position.
296    pub(crate) fn new<S>(pos: usize, message: S) -> ParserError
297    where
298        S: Into<String>,
299    {
300        ParserError {
301            pos,
302            message: message.into(),
303        }
304    }
305}
306
307#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
308pub struct ParserStatementError {
309    /// The underlying error
310    pub error: ParserError,
311    /// The kind of statement erroring
312    pub statement: Option<StatementKind>,
313}
314
315impl Error for ParserStatementError {}
316
317impl fmt::Display for ParserStatementError {
318    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
319        f.write_str(&self.error.to_string())
320    }
321}
322
323impl From<LexerError> for ParserError {
324    fn from(value: LexerError) -> Self {
325        ParserError {
326            message: value.message,
327            pos: value.pos,
328        }
329    }
330}
331
332impl From<Keyword> for Ident {
333    fn from(value: Keyword) -> Ident {
334        // Note: all keywords are known to be less than our max length.
335        Ident::new_unchecked(value.as_str().to_lowercase())
336    }
337}
338
339/// SQL Parser
340struct Parser<'a> {
341    sql: &'a str,
342    tokens: Vec<PosToken>,
343    /// The index of the first unprocessed token in `self.tokens`
344    index: usize,
345    recursion_guard: RecursionGuard,
346    /// Number of `maybe_parse` calls that have failed (i.e. cost the parser
347    /// a speculative descent that produced nothing). Bounded by
348    /// [`SPECULATIVE_FAILURES_PER_TOKEN`] × `tokens.len()` to prevent
349    /// exponential backtracking on pathological input while leaving room
350    /// for deeply nested valid SQL.
351    speculative_failures: usize,
352}
353
354/// Per-token cap on [`Parser::maybe_parse`] failures. Bounded by token
355/// count so deeply nested but valid SQL (e.g. parallel-workload generated
356/// queries with thousands of nested casts) has room to speculate, while
357/// still cutting off exponential backtracking on pathological input
358/// (the DoS case is 2^N failures on ~200 tokens; this cap is linear).
359const SPECULATIVE_FAILURES_PER_TOKEN: usize = 100;
360
361/// Defines a number of precedence classes operators follow. Since this enum derives Ord, the
362/// precedence classes are ordered from weakest binding at the top to tightest binding at the
363/// bottom.
364///
365/// The expression printer's `ast::defs::expr::prec` ranks are derived from this
366/// ladder via `as u8`, so this enum is the single source of truth for output
367/// parenthesization precedence too. Keep the ordering authoritative.
368#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
369pub(crate) enum Precedence {
370    Zero,
371    Or,
372    And,
373    PrefixNot,
374    Is,
375    Cmp,
376    Like,
377    Other,
378    PlusMinus,
379    MultiplyDivide,
380    PostfixCollateAt,
381    PrefixPlusMinus,
382    PostfixSubscriptCast,
383}
384
385#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
386enum SetPrecedence {
387    Zero,
388    UnionExcept,
389    Intersect,
390}
391
392impl<'a> Parser<'a> {
393    /// Parse the specified tokens
394    fn new(sql: &'a str, tokens: Vec<PosToken>) -> Self {
395        Parser {
396            sql,
397            tokens,
398            index: 0,
399            recursion_guard: RecursionGuard::with_limit(RECURSION_LIMIT),
400            speculative_failures: 0,
401        }
402    }
403
404    fn error(&self, pos: usize, message: String) -> ParserError {
405        ParserError { pos, message }
406    }
407
408    fn parse_statements(&mut self) -> Result<Vec<StatementParseResult<'a>>, ParserStatementError> {
409        let mut stmts = Vec::new();
410        let mut expecting_statement_delimiter = false;
411        loop {
412            // ignore empty statements (between successive statement delimiters)
413            while self.consume_token(&Token::Semicolon) {
414                expecting_statement_delimiter = false;
415            }
416
417            if self.peek_token().is_none() {
418                break;
419            } else if expecting_statement_delimiter {
420                return self
421                    .expected(self.peek_pos(), "end of statement", self.peek_token())
422                    .map_no_statement_parser_err();
423            }
424
425            let s = self.parse_statement()?;
426            stmts.push(s);
427            expecting_statement_delimiter = true;
428        }
429        Ok(stmts)
430    }
431    /// Parse a single top-level statement (such as SELECT, INSERT, CREATE, etc.),
432    /// stopping before the statement separator, if any. Returns the parsed statement and the SQL
433    /// fragment corresponding to it.
434    fn parse_statement(&mut self) -> Result<StatementParseResult<'a>, ParserStatementError> {
435        let before = self.peek_pos();
436        let statement = self.parse_statement_inner()?;
437        let after = self.peek_pos();
438        Ok(StatementParseResult::new(
439            statement,
440            self.sql[before..after].trim(),
441        ))
442    }
443
444    /// Parse a single top-level statement (such as SELECT, INSERT, CREATE, etc.),
445    /// stopping before the statement separator, if any.
446    fn parse_statement_inner(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
447        match self.next_token() {
448            Some(t) => match t {
449                Token::Keyword(CREATE) => Ok(self.parse_create()?),
450                Token::Keyword(DISCARD) => Ok(self
451                    .parse_discard()
452                    .map_parser_err(StatementKind::Discard)?),
453                Token::Keyword(DROP) => Ok(self.parse_drop()?),
454                Token::Keyword(DELETE) => {
455                    Ok(self.parse_delete().map_parser_err(StatementKind::Delete)?)
456                }
457                Token::Keyword(INSERT) => {
458                    Ok(self.parse_insert().map_parser_err(StatementKind::Insert)?)
459                }
460                Token::Keyword(UPDATE) => {
461                    Ok(self.parse_update().map_parser_err(StatementKind::Update)?)
462                }
463                Token::Keyword(ALTER) => Ok(self.parse_alter()?),
464                Token::Keyword(COPY) => Ok(self.parse_copy()?),
465                Token::Keyword(SET) => Ok(self.parse_set()?),
466                Token::Keyword(RESET) => Ok(self
467                    .parse_reset()
468                    .map_parser_err(StatementKind::ResetVariable)?),
469                Token::Keyword(SHOW) => Ok(Statement::Show(
470                    self.parse_show().map_parser_err(StatementKind::Show)?,
471                )),
472                Token::Keyword(START) => Ok(self
473                    .parse_start_transaction()
474                    .map_parser_err(StatementKind::StartTransaction)?),
475                // `BEGIN` is a nonstandard but common alias for the
476                // standard `START TRANSACTION` statement. It is supported
477                // by at least PostgreSQL and MySQL.
478                Token::Keyword(BEGIN) => Ok(self
479                    .parse_begin()
480                    .map_parser_err(StatementKind::StartTransaction)?),
481                Token::Keyword(COMMIT) => {
482                    Ok(self.parse_commit().map_parser_err(StatementKind::Commit)?)
483                }
484                Token::Keyword(ROLLBACK) | Token::Keyword(ABORT) => Ok(self
485                    .parse_rollback()
486                    .map_parser_err(StatementKind::Rollback)?),
487                Token::Keyword(TAIL) => {
488                    Ok(self.parse_tail().map_parser_err(StatementKind::Subscribe)?)
489                }
490                Token::Keyword(SUBSCRIBE) => Ok(self
491                    .parse_subscribe()
492                    .map_parser_err(StatementKind::Subscribe)?),
493                Token::Keyword(EXPLAIN) => Ok(self.parse_explain()?),
494                Token::Keyword(DECLARE) => Ok(self.parse_declare()?),
495                Token::Keyword(FETCH) => {
496                    Ok(self.parse_fetch().map_parser_err(StatementKind::Fetch)?)
497                }
498                Token::Keyword(CLOSE) => {
499                    Ok(self.parse_close().map_parser_err(StatementKind::Close)?)
500                }
501                Token::Keyword(PREPARE) => Ok(self.parse_prepare()?),
502                Token::Keyword(EXECUTE) => Ok(self
503                    .parse_execute()
504                    .map_parser_err(StatementKind::Execute)?),
505                Token::Keyword(DEALLOCATE) => Ok(self
506                    .parse_deallocate()
507                    .map_parser_err(StatementKind::Deallocate)?),
508                Token::Keyword(RAISE) => {
509                    Ok(self.parse_raise().map_parser_err(StatementKind::Raise)?)
510                }
511                Token::Keyword(GRANT) => Ok(self.parse_grant()?),
512                Token::Keyword(REVOKE) => Ok(self.parse_revoke()?),
513                Token::Keyword(REASSIGN) => Ok(self
514                    .parse_reassign_owned()
515                    .map_parser_err(StatementKind::ReassignOwned)?),
516                Token::Keyword(INSPECT) => Ok(Statement::Show(
517                    self.parse_inspect().map_no_statement_parser_err()?,
518                )),
519                Token::Keyword(VALIDATE) => Ok(self
520                    .parse_validate()
521                    .map_parser_err(StatementKind::ValidateConnection)?),
522                Token::Keyword(COMMENT) => Ok(self
523                    .parse_comment()
524                    .map_parser_err(StatementKind::Comment)?),
525                Token::Keyword(k) if QUERY_START_KEYWORDS.contains(&k) => {
526                    self.prev_token();
527                    Ok(Statement::Select(
528                        self.parse_select_statement()
529                            .map_parser_err(StatementKind::Select)?,
530                    ))
531                }
532                Token::Keyword(kw) => parser_err!(
533                    self,
534                    self.peek_prev_pos(),
535                    format!("Unexpected keyword {} at the beginning of a statement", kw)
536                )
537                .map_no_statement_parser_err(),
538                Token::LParen => {
539                    self.prev_token();
540                    let query = self.parse_query().map_parser_err(StatementKind::Select)?;
541                    // `(SHOW TABLES)` parses as a `Query` whose `body` is a
542                    // `Show` node, but the same SQL without parens parses as
543                    // a top-level `Statement::Show`. Unwrap the degenerate
544                    // wrapper so the AST is independent of redundant parens
545                    // and the parse + display + reparse round trip is stable.
546                    if let Query {
547                        ctes: CteBlock::Simple(ctes),
548                        body: SetExpr::Show(show),
549                        order_by,
550                        limit: None,
551                        offset: None,
552                    } = &query
553                    {
554                        if ctes.is_empty() && order_by.is_empty() {
555                            return Ok(Statement::Show(show.clone()));
556                        }
557                    }
558                    Ok(Statement::Select(SelectStatement {
559                        query,
560                        as_of: None, // Only the outermost SELECT may have an AS OF clause.
561                    }))
562                }
563                unexpected => self
564                    .expected(
565                        self.peek_prev_pos(),
566                        "a keyword at the beginning of a statement",
567                        Some(unexpected),
568                    )
569                    .map_no_statement_parser_err(),
570            },
571            None => self
572                .expected(self.peek_prev_pos(), "SQL statement", None)
573                .map_no_statement_parser_err(),
574        }
575    }
576
577    /// Parse a new expression
578    fn parse_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
579        self.parse_subexpr(Precedence::Zero)
580    }
581
582    /// Parse tokens until the precedence decreases
583    fn parse_subexpr(&mut self, precedence: Precedence) -> Result<Expr<Raw>, ParserError> {
584        let expr = self.checked_recur_mut(|parser| parser.parse_prefix())?;
585        self.parse_subexpr_seeded(precedence, expr)
586    }
587
588    fn parse_subexpr_seeded(
589        &mut self,
590        precedence: Precedence,
591        mut expr: Expr<Raw>,
592    ) -> Result<Expr<Raw>, ParserError> {
593        self.checked_recur_mut(|parser| {
594            // Each iteration wraps `expr` in one more node (a binary op, field
595            // access `a.b`, `IS`, etc.), so a long *flat* operator/field-access
596            // chain (`a.f.f.f…`, `a+a+a…`) builds AST depth iteratively — the
597            // per-call recursion guard above only counts as one level for the
598            // whole loop. Bound the chain length (at `EXPR_CHAIN_LIMIT`, not
599            // the much smaller `RECURSION_LIMIT` — flat chains are legitimate
600            // at widths deep nesting never reaches) so the resulting AST can't
601            // grow deep enough to overflow the stack when it is later
602            // displayed, dropped, cloned, or visited recursively. Regression
603            // for the parse_expr_roundtrip field-access-chain stack overflow
604            // (`a.ff.cX.*.G…`).
605            let mut chain = 0usize;
606            loop {
607                let next_precedence = parser.get_next_precedence();
608                if precedence >= next_precedence {
609                    break;
610                }
611                chain += 1;
612                if chain > EXPR_CHAIN_LIMIT {
613                    return Err(ParserError::new(
614                        parser.peek_pos(),
615                        format!(
616                            "statement exceeds nested expression limit of {}",
617                            EXPR_CHAIN_LIMIT
618                        ),
619                    ));
620                }
621
622                expr = parser.parse_infix(expr, next_precedence)?;
623            }
624            Ok(expr)
625        })
626    }
627
628    /// Parse an expression prefix
629    fn parse_prefix(&mut self) -> Result<Expr<Raw>, ParserError> {
630        // PostgreSQL allows any string literal to be preceded by a type name,
631        // indicating that the string literal represents a literal of that type.
632        // Some examples:
633        //
634        //     DATE '2020-05-20'
635        //     TIMESTAMP WITH TIME ZONE '2020-05-20 7:43:54'
636        //     BOOL 'true'
637        //
638        // The first two are standard SQL, while the latter is a PostgreSQL
639        // extension. Complicating matters is the fact that INTERVAL string
640        // literals may optionally be followed by some special keywords, e.g.:
641        //
642        //     INTERVAL '7' DAY
643        //
644        // Note also that naively `SELECT date` looks like a syntax error
645        // because the `date` type name is not followed by a string literal, but
646        // in fact is a valid expression that should parse as the column name
647        // "date".
648        //
649        // Note: the maybe! block here does swallow valid parsing errors
650        // See <https://github.com/MaterializeInc/incidents-and-escalations/issues/90> for more details
651        maybe!(self.maybe_parse(|parser| {
652            let data_type = parser.parse_data_type()?;
653            if data_type.to_string().as_str() == "interval" {
654                Ok(Expr::Value(Value::Interval(parser.parse_interval_value()?)))
655            } else {
656                Ok(Expr::Cast {
657                    expr: Box::new(Expr::Value(Value::String(parser.parse_literal_string()?))),
658                    data_type,
659                })
660            }
661        }));
662
663        let tok = self
664            .next_token()
665            .ok_or_else(|| self.error(self.peek_prev_pos(), "Unexpected EOF".to_string()))?;
666        let expr = match (tok, self.peek_token()) {
667            (Token::LBracket, _) => {
668                self.prev_token();
669                let function = self.parse_named_function()?;
670                Ok(Expr::Function(function))
671            }
672            (Token::Keyword(TRUE) | Token::Keyword(FALSE) | Token::Keyword(NULL), _) => {
673                self.prev_token();
674                Ok(Expr::Value(self.parse_value()?))
675            }
676            (Token::Keyword(ARRAY), _) => self.parse_array(),
677            (Token::Keyword(LIST), Some(Token::LBracket) | Some(Token::LParen)) => {
678                self.parse_list()
679            }
680            (Token::Keyword(MAP), Some(Token::LBracket) | Some(Token::LParen)) => self.parse_map(),
681            (Token::Keyword(CASE), _) => self.parse_case_expr(),
682            (Token::Keyword(CAST), _) => self.parse_cast_expr(),
683            (Token::Keyword(COALESCE), Some(Token::LParen)) => {
684                self.parse_homogenizing_function(HomogenizingFunction::Coalesce)
685            }
686            (Token::Keyword(GREATEST), Some(Token::LParen)) => {
687                self.parse_homogenizing_function(HomogenizingFunction::Greatest)
688            }
689            (Token::Keyword(LEAST), Some(Token::LParen)) => {
690                self.parse_homogenizing_function(HomogenizingFunction::Least)
691            }
692            (Token::Keyword(NULLIF), Some(Token::LParen)) => self.parse_nullif_expr(),
693            (Token::Keyword(EXISTS), Some(Token::LParen)) => self.parse_exists_expr(),
694            (Token::Keyword(EXTRACT), Some(Token::LParen)) => self.parse_extract_expr(),
695            (Token::Keyword(NOT), _) => Ok(Expr::Not {
696                expr: Box::new(self.parse_subexpr(Precedence::PrefixNot)?),
697            }),
698            (Token::Keyword(ROW), Some(Token::LParen)) => self.parse_row_expr(),
699            (Token::Keyword(TRIM), Some(Token::LParen)) => self.parse_trim_expr(),
700            (Token::Keyword(POSITION), Some(Token::LParen)) => self.parse_position_expr(),
701            (Token::Keyword(NORMALIZE), Some(Token::LParen)) => self.parse_normalize_expr(),
702            (Token::Keyword(SUBSTRING), Some(Token::LParen)) => self.parse_substring_expr(),
703            (Token::Keyword(kw), _) if kw.is_always_reserved() => {
704                return Err(self.error(
705                    self.peek_prev_pos(),
706                    format!("expected expression, but found reserved keyword: {kw}"),
707                ));
708            }
709            // (Some of the above keywords are recognized by `is_reserved_in_scalar_expression`,
710            // except the ones where we check for a following opening paren before treating them as
711            // keywords.)
712            (Token::Keyword(id), _) => self.parse_qualified_identifier(id.into()),
713            (Token::Ident(id), _) => self.parse_qualified_identifier(self.new_identifier(id)?),
714            (Token::Op(op), _) if op == "-" => {
715                if let Some(Token::Number(n)) = self.peek_token() {
716                    let n = match n.parse::<f64>() {
717                        Ok(n) => n,
718                        Err(_) => {
719                            return Err(
720                                self.error(self.peek_prev_pos(), format!("invalid number {}", n))
721                            );
722                        }
723                    };
724                    if n != 0.0 {
725                        self.prev_token();
726                        return Ok(Expr::Value(self.parse_value()?));
727                    }
728                }
729
730                Ok(Expr::Op {
731                    op: Op::bare(op),
732                    expr1: Box::new(self.parse_subexpr(Precedence::PrefixPlusMinus)?),
733                    expr2: None,
734                })
735            }
736            (Token::Op(op), _) if op == "+" => Ok(Expr::Op {
737                op: Op::bare(op),
738                expr1: Box::new(self.parse_subexpr(Precedence::PrefixPlusMinus)?),
739                expr2: None,
740            }),
741            (Token::Op(op), _) if op == "~" => Ok(Expr::Op {
742                op: Op::bare(op),
743                expr1: Box::new(self.parse_subexpr(Precedence::Other)?),
744                expr2: None,
745            }),
746            (Token::Number(_) | Token::String(_) | Token::HexString(_), _) => {
747                self.prev_token();
748                Ok(Expr::Value(self.parse_value()?))
749            }
750            (Token::Parameter(n), _) => Ok(Expr::Parameter(n)),
751            (Token::LParen, _) => {
752                let expr = self.parse_parenthesized_fragment()?.into_expr();
753                self.expect_token(&Token::RParen)?;
754                Ok(expr)
755            }
756            (unexpected, _) => {
757                self.expected(self.peek_prev_pos(), "an expression", Some(unexpected))
758            }
759        }?;
760
761        Ok(expr)
762    }
763
764    /// Parses an expression list that appears in parentheses, like `(1 + 1)`,
765    /// `(SELECT 1)`, or `(1, 2)`. Assumes that the opening parenthesis has
766    /// already been parsed. Parses up to the closing parenthesis without
767    /// consuming it.
768    fn parse_parenthesized_fragment(&mut self) -> Result<ParenthesizedFragment, ParserError> {
769        // The SQL grammar has an irritating ambiguity that presents here.
770        // Consider these two expression fragments:
771        //
772        //     SELECT (((SELECT 2)) + 3)
773        //     SELECT (((SELECT 2)) UNION SELECT 2)
774        //             ^           ^
775        //            (1)         (2)
776        // When we see the parenthesis marked (1), we have no way to know ahead
777        // of time whether that parenthesis is part of a `SetExpr::Query` inside
778        // of an `Expr::Subquery` or whether it introduces an `Expr::Nested`.
779        // The approach taken here avoids backtracking by deferring the decision
780        // of whether to parse as a subquery or a nested expression until we get
781        // to the point marked (2) above. Once there, we know that the presence
782        // of a set operator implies that the parentheses belonged to the
783        // subquery; otherwise, they belonged to the expression.
784        //
785        // See also PostgreSQL's comments on the matter:
786        // https://github.com/postgres/postgres/blob/42c63ab/src/backend/parser/gram.y#L11125-L11136
787        //
788        // Each call of this function handles one layer of parentheses. Before
789        // every call, the parser must be positioned after an opening
790        // parenthesis; upon non-error return, the parser will be positioned
791        // before the corresponding close parenthesis. Somewhat weirdly, the
792        // returned expression semantically includes the opening/closing
793        // parentheses, even though this function is not responsible for parsing
794        // them.
795
796        if self.peek_one_of_keywords(QUERY_START_KEYWORDS) {
797            // Easy case one: unambiguously a subquery.
798            Ok(ParenthesizedFragment::Query(self.parse_query()?))
799        } else if !self.consume_token(&Token::LParen) {
800            // Easy case two: unambiguously an expression.
801            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
802            Ok(ParenthesizedFragment::Exprs(exprs))
803        } else {
804            // Hard case: we have an open parenthesis, and we need to decide
805            // whether it belongs to the inner expression or the outer
806            // expression.
807
808            // Parse to the closing parenthesis.
809            let fragment = self.checked_recur_mut(Parser::parse_parenthesized_fragment)?;
810            self.expect_token(&Token::RParen)?;
811
812            // Decide if we need to associate any tokens after the closing
813            // parenthesis with what we've parsed so far.
814            match (fragment, self.peek_token()) {
815                // We have a subquery and the next token is a set operator or a
816                // closing parenthesis. That implies we have a partially-parsed
817                // subquery (or a syntax error). Hop into parsing a set
818                // expression where our subquery is the LHS of the set operator.
819                (
820                    ParenthesizedFragment::Query(query),
821                    Some(Token::RParen | Token::Keyword(UNION | INTERSECT | EXCEPT)),
822                ) => {
823                    let query = SetExpr::Query(Box::new(query));
824                    let ctes = CteBlock::empty();
825                    let body = self.parse_query_body_seeded(SetPrecedence::Zero, query)?;
826                    Ok(ParenthesizedFragment::Query(
827                        self.parse_query_tail(ctes, body)?,
828                    ))
829                }
830
831                // Otherwise, we have an expression. It may be only partially
832                // parsed. Hop into parsing an expression where `fragment` is
833                // the expression prefix. Then parse any additional
834                // comma-separated expressions.
835                (fragment, _) => {
836                    let prefix = fragment.into_expr();
837                    let expr = self.parse_subexpr_seeded(Precedence::Zero, prefix)?;
838                    let mut exprs = vec![expr];
839                    while self.consume_token(&Token::Comma) {
840                        exprs.push(self.parse_expr()?);
841                    }
842                    Ok(ParenthesizedFragment::Exprs(exprs))
843                }
844            }
845        }
846    }
847
848    fn parse_function(&mut self, name: RawItemName) -> Result<Function<Raw>, ParserError> {
849        self.expect_token(&Token::LParen)?;
850        let distinct = matches!(
851            self.parse_at_most_one_keyword(&[ALL, DISTINCT], &format!("function: {}", name))?,
852            Some(DISTINCT),
853        );
854        let args = self.parse_optional_args(true)?;
855
856        if distinct && matches!(args, FunctionArgs::Star) {
857            return Err(self.error(
858                self.peek_prev_pos() - 1,
859                "DISTINCT * not supported as function args".to_string(),
860            ));
861        }
862
863        let filter = if self.parse_keyword(FILTER) {
864            self.expect_token(&Token::LParen)?;
865            self.expect_keyword(WHERE)?;
866            let expr = self.parse_expr()?;
867            self.expect_token(&Token::RParen)?;
868            Some(Box::new(expr))
869        } else {
870            None
871        };
872        let over =
873            if self.peek_keyword(OVER) || self.peek_keyword(IGNORE) || self.peek_keyword(RESPECT) {
874                // TBD: support window names (`OVER mywin`) in place of inline specification
875                // https://github.com/MaterializeInc/database-issues/issues/5882
876
877                let ignore_nulls = self.parse_keywords(&[IGNORE, NULLS]);
878                let respect_nulls = self.parse_keywords(&[RESPECT, NULLS]);
879                self.expect_keyword(OVER)?;
880
881                self.expect_token(&Token::LParen)?;
882                let partition_by = if self.parse_keywords(&[PARTITION, BY]) {
883                    // a list of possibly-qualified column names
884                    self.parse_comma_separated(Parser::parse_expr)?
885                } else {
886                    vec![]
887                };
888                let order_by = if self.parse_keywords(&[ORDER, BY]) {
889                    self.parse_comma_separated(Parser::parse_order_by_expr)?
890                } else {
891                    vec![]
892                };
893                let window_frame = if !self.consume_token(&Token::RParen) {
894                    let window_frame = self.parse_window_frame()?;
895                    self.expect_token(&Token::RParen)?;
896                    Some(window_frame)
897                } else {
898                    None
899                };
900
901                Some(WindowSpec {
902                    partition_by,
903                    order_by,
904                    window_frame,
905                    ignore_nulls,
906                    respect_nulls,
907                })
908            } else {
909                None
910            };
911
912        Ok(Function {
913            name,
914            args,
915            filter,
916            over,
917            distinct,
918        })
919    }
920
921    fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
922        let units = match self.expect_one_of_keywords(&[ROWS, RANGE, GROUPS])? {
923            ROWS => WindowFrameUnits::Rows,
924            RANGE => WindowFrameUnits::Range,
925            GROUPS => WindowFrameUnits::Groups,
926            _ => unreachable!(),
927        };
928        let (start_bound, end_bound) = if self.parse_keyword(BETWEEN) {
929            let start_bound = self.parse_window_frame_bound()?;
930            self.expect_keyword(AND)?;
931            let end_bound = Some(self.parse_window_frame_bound()?);
932            (start_bound, end_bound)
933        } else {
934            (self.parse_window_frame_bound()?, None)
935        };
936        Ok(WindowFrame {
937            units,
938            start_bound,
939            end_bound,
940        })
941    }
942
943    /// Parse `CURRENT ROW` or `{ <positive number> | UNBOUNDED } { PRECEDING | FOLLOWING }`
944    fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
945        if self.parse_keywords(&[CURRENT, ROW]) {
946            Ok(WindowFrameBound::CurrentRow)
947        } else {
948            let rows = if self.parse_keyword(UNBOUNDED) {
949                None
950            } else {
951                Some(self.parse_literal_uint()?)
952            };
953            if self.parse_keyword(PRECEDING) {
954                Ok(WindowFrameBound::Preceding(rows))
955            } else if self.parse_keyword(FOLLOWING) {
956                Ok(WindowFrameBound::Following(rows))
957            } else {
958                self.expected(self.peek_pos(), "PRECEDING or FOLLOWING", self.peek_token())
959            }
960        }
961    }
962
963    fn parse_case_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
964        let mut operand = None;
965        if !self.parse_keyword(WHEN) {
966            operand = Some(Box::new(self.parse_expr()?));
967            self.expect_keyword(WHEN)?;
968        }
969        let mut conditions = vec![];
970        let mut results = vec![];
971        loop {
972            conditions.push(self.parse_expr()?);
973            self.expect_keyword(THEN)?;
974            results.push(self.parse_expr()?);
975            if !self.parse_keyword(WHEN) {
976                break;
977            }
978        }
979        let else_result = if self.parse_keyword(ELSE) {
980            Some(Box::new(self.parse_expr()?))
981        } else {
982            None
983        };
984        self.expect_keyword(END)?;
985        Ok(Expr::Case {
986            operand,
987            conditions,
988            results,
989            else_result,
990        })
991    }
992
993    /// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
994    fn parse_cast_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
995        // Whether `expr` is safe to print directly to the left of a Postgres-style
996        // `::<type>` cast without wrapping it in parentheses. `Expr::Cast` /
997        // `Expr::Collate` print as the postfix forms `<inner>::<type>` /
998        // `<inner> COLLATE <c>`, so they are only safe when their *own* operand is
999        // — otherwise an inner low-precedence spine (e.g. the quantified comparison
1000        // in `CAST(a = ANY (...) AS t)`, parsed as `Cast(AnySubquery)`) would
1001        // re-associate against a surrounding operator on reparse. Everything else
1002        // in the list is atomic or self-delimiting and so always safe.
1003        fn safe_before_pg_cast(expr: &Expr<Raw>) -> bool {
1004            match expr {
1005                Expr::Nested(_)
1006                | Expr::Value(_)
1007                | Expr::Function { .. }
1008                | Expr::Identifier { .. }
1009                | Expr::HomogenizingFunction { .. }
1010                | Expr::NullIf { .. }
1011                | Expr::Subquery { .. }
1012                | Expr::Parameter(..) => true,
1013                Expr::Cast { expr, .. } | Expr::Collate { expr, .. } => safe_before_pg_cast(expr),
1014                _ => false,
1015            }
1016        }
1017
1018        self.expect_token(&Token::LParen)?;
1019        let expr = self.parse_expr()?;
1020        self.expect_keyword(AS)?;
1021        let data_type = self.parse_data_type()?;
1022        self.expect_token(&Token::RParen)?;
1023        // We are potentially rewriting an expression like
1024        //     CAST(<expr> OP <expr> AS <type>)
1025        // to
1026        //     <expr> OP <expr>::<type>
1027        // (because we print Expr::Cast always as a Postgres-style cast, i.e. `::`)
1028        // which could incorrectly change the meaning of the expression
1029        // as the `::` binds tightly. To be safe, we wrap the inner
1030        // expression in parentheses
1031        //    (<expr> OP <expr>)::<type>
1032        // unless the inner expression is of a kind that we know is
1033        // safe to follow with a `::` without wrapping.
1034        if safe_before_pg_cast(&expr) {
1035            Ok(Expr::Cast {
1036                expr: Box::new(expr),
1037                data_type,
1038            })
1039        } else {
1040            Ok(Expr::Cast {
1041                expr: Box::new(Expr::Nested(Box::new(expr))),
1042                data_type,
1043            })
1044        }
1045    }
1046
1047    /// Parse a SQL EXISTS expression e.g. `WHERE EXISTS(SELECT ...)`.
1048    fn parse_exists_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1049        self.expect_token(&Token::LParen)?;
1050        let exists_node = Expr::Exists(Box::new(self.parse_query()?));
1051        self.expect_token(&Token::RParen)?;
1052        Ok(exists_node)
1053    }
1054
1055    fn parse_homogenizing_function(
1056        &mut self,
1057        function: HomogenizingFunction,
1058    ) -> Result<Expr<Raw>, ParserError> {
1059        self.expect_token(&Token::LParen)?;
1060        let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1061        self.expect_token(&Token::RParen)?;
1062        Ok(Expr::HomogenizingFunction { function, exprs })
1063    }
1064
1065    fn parse_nullif_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1066        self.expect_token(&Token::LParen)?;
1067        let l_expr = Box::new(self.parse_expr()?);
1068        self.expect_token(&Token::Comma)?;
1069        let r_expr = Box::new(self.parse_expr()?);
1070        self.expect_token(&Token::RParen)?;
1071        Ok(Expr::NullIf { l_expr, r_expr })
1072    }
1073
1074    // Parse calls to extract(), which can take the form:
1075    // - extract(field from 'interval')
1076    fn parse_extract_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1077        self.expect_token(&Token::LParen)?;
1078        let field = match self.next_token() {
1079            Some(Token::Keyword(kw)) => Ident::from(kw).into_string(),
1080            Some(Token::Ident(id)) => self.new_identifier(id)?.into_string(),
1081            Some(Token::String(s)) => s,
1082            t => self.expected(self.peek_prev_pos(), "extract field token", t)?,
1083        };
1084        self.expect_keyword(FROM)?;
1085        let expr = self.parse_expr()?;
1086        self.expect_token(&Token::RParen)?;
1087        Ok(Expr::Function(Function {
1088            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("extract"))),
1089            args: FunctionArgs::args(vec![Expr::Value(Value::String(field)), expr]),
1090            filter: None,
1091            over: None,
1092            distinct: false,
1093        }))
1094    }
1095
1096    fn parse_row_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1097        self.expect_token(&Token::LParen)?;
1098        if self.consume_token(&Token::RParen) {
1099            Ok(Expr::Row { exprs: vec![] })
1100        } else {
1101            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1102            self.expect_token(&Token::RParen)?;
1103            Ok(Expr::Row { exprs })
1104        }
1105    }
1106
1107    fn parse_composite_type_definition(&mut self) -> Result<Vec<ColumnDef<Raw>>, ParserError> {
1108        self.expect_token(&Token::LParen)?;
1109        let fields = self.parse_comma_separated(|parser| {
1110            Ok(ColumnDef {
1111                name: parser.parse_identifier()?,
1112                data_type: parser.parse_data_type()?,
1113                collation: None,
1114                options: vec![],
1115            })
1116        })?;
1117        self.expect_token(&Token::RParen)?;
1118        Ok(fields)
1119    }
1120
1121    // Parse calls to trim(), which can take the form:
1122    // - trim(side 'chars' from 'string')
1123    // - trim('chars' from 'string')
1124    // - trim(side from 'string')
1125    // - trim(from 'string')
1126    // - trim('string')
1127    // - trim(side 'string')
1128    fn parse_trim_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1129        self.expect_token(&Token::LParen)?;
1130        let name = match self.parse_one_of_keywords(&[BOTH, LEADING, TRAILING]) {
1131            None | Some(BOTH) => ident!("btrim"),
1132            Some(LEADING) => ident!("ltrim"),
1133            Some(TRAILING) => ident!("rtrim"),
1134            _ => unreachable!(),
1135        };
1136        let mut exprs = Vec::new();
1137        if self.parse_keyword(FROM) {
1138            // 'string'
1139            exprs.push(self.parse_expr()?);
1140        } else {
1141            // Either 'chars' or 'string'
1142            exprs.push(self.parse_expr()?);
1143            if self.parse_keyword(FROM) {
1144                // 'string'; previous must be 'chars'
1145                // Swap 'chars' and 'string' for compatibility with btrim, ltrim, and rtrim.
1146                exprs.insert(0, self.parse_expr()?);
1147            }
1148        }
1149        self.expect_token(&Token::RParen)?;
1150        Ok(Expr::Function(Function {
1151            name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
1152            args: FunctionArgs::args(exprs),
1153            filter: None,
1154            over: None,
1155            distinct: false,
1156        }))
1157    }
1158
1159    // Parse calls to position(), which has the special form position('string' in 'string').
1160    fn parse_position_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1161        self.expect_token(&Token::LParen)?;
1162        // we must be greater-equal the precedence of IN, which is Like to avoid
1163        // parsing away the IN as part of the sub expression
1164        let needle = self.parse_subexpr(Precedence::Like)?;
1165        self.expect_token(&Token::Keyword(IN))?;
1166        let haystack = self.parse_expr()?;
1167        self.expect_token(&Token::RParen)?;
1168        Ok(Expr::Function(Function {
1169            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("position"))),
1170            args: FunctionArgs::args(vec![needle, haystack]),
1171            filter: None,
1172            over: None,
1173            distinct: false,
1174        }))
1175    }
1176
1177    /// Parse calls to normalize(), which can take the form:
1178    /// - normalize('string')
1179    /// - normalize('string', NFC)
1180    /// - normalize('string', NFD)
1181    /// - normalize('string', NFKC)
1182    /// - normalize('string', NFKD)
1183    fn parse_normalize_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1184        self.expect_token(&Token::LParen)?;
1185        let expr = self.parse_expr()?;
1186
1187        let args = if self.consume_token(&Token::Comma) {
1188            let form = self
1189                .expect_one_of_keywords(&[NFC, NFD, NFKC, NFKD])?
1190                .as_str();
1191            vec![expr, Expr::Value(Value::String(form.to_owned()))]
1192        } else {
1193            vec![expr, Expr::Value(Value::String("NFC".to_owned()))]
1194        };
1195
1196        self.expect_token(&Token::RParen)?;
1197        Ok(Expr::Function(Function {
1198            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("normalize"))),
1199            args: FunctionArgs::args(args),
1200            filter: None,
1201            over: None,
1202            distinct: false,
1203        }))
1204    }
1205
1206    /// Parse an INTERVAL literal.
1207    ///
1208    /// Some syntactically valid intervals:
1209    ///
1210    ///   - `INTERVAL '1' DAY`
1211    ///   - `INTERVAL '1-1' YEAR TO MONTH`
1212    ///   - `INTERVAL '1' SECOND`
1213    ///   - `INTERVAL '1:1' MINUTE TO SECOND
1214    ///   - `INTERVAL '1:1:1.1' HOUR TO SECOND (5)`
1215    ///   - `INTERVAL '1.111' SECOND (2)`
1216    ///
1217    fn parse_interval_value(&mut self) -> Result<IntervalValue, ParserError> {
1218        // The first token in an interval is a string literal which specifies
1219        // the duration of the interval.
1220        let value = self.parse_literal_string()?;
1221
1222        // Determine the range of TimeUnits, whether explicit (`INTERVAL ... DAY TO MINUTE`) or
1223        // implicit (in which all date fields are eligible).
1224        let (precision_high, precision_low, fsec_max_precision) =
1225            match self.expect_one_of_keywords(&[
1226                YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, YEARS, MONTHS, DAYS, HOURS, MINUTES,
1227                SECONDS,
1228            ]) {
1229                Ok(d) => {
1230                    let d_pos = self.peek_prev_pos();
1231                    if self.parse_keyword(TO) {
1232                        let e = self.expect_one_of_keywords(&[
1233                            YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, YEARS, MONTHS, DAYS, HOURS,
1234                            MINUTES, SECONDS,
1235                        ])?;
1236
1237                        let high: DateTimeField = d
1238                            .as_str()
1239                            .parse()
1240                            .map_err(|e| self.error(self.peek_prev_pos(), e))?;
1241                        let low: DateTimeField = e
1242                            .as_str()
1243                            .parse()
1244                            .map_err(|e| self.error(self.peek_prev_pos(), e))?;
1245
1246                        // Check for invalid ranges, i.e. precision_high is the same
1247                        // as or a less significant DateTimeField than
1248                        // precision_low.
1249                        if high >= low {
1250                            return parser_err!(
1251                                self,
1252                                d_pos,
1253                                "Invalid field range in INTERVAL '{}' {} TO {}; the value in the \
1254                                 position of {} should be more significant than {}.",
1255                                value,
1256                                d,
1257                                e,
1258                                d,
1259                                e,
1260                            );
1261                        }
1262
1263                        let fsec_max_precision = if low == DateTimeField::Second {
1264                            self.parse_optional_precision()?
1265                        } else {
1266                            None
1267                        };
1268
1269                        (high, low, fsec_max_precision)
1270                    } else {
1271                        let low: DateTimeField = d
1272                            .as_str()
1273                            .parse()
1274                            .map_err(|e| self.error(self.peek_prev_pos(), e))?;
1275                        let fsec_max_precision = if low == DateTimeField::Second {
1276                            self.parse_optional_precision()?
1277                        } else {
1278                            None
1279                        };
1280
1281                        (DateTimeField::Year, low, fsec_max_precision)
1282                    }
1283                }
1284                Err(_) => (DateTimeField::Year, DateTimeField::Second, None),
1285            };
1286        Ok(IntervalValue {
1287            value,
1288            precision_high,
1289            precision_low,
1290            fsec_max_precision,
1291        })
1292    }
1293
1294    /// Parse an operator following an expression
1295    fn parse_infix(
1296        &mut self,
1297        expr: Expr<Raw>,
1298        precedence: Precedence,
1299    ) -> Result<Expr<Raw>, ParserError> {
1300        let tok = self.next_token().unwrap(); // safe as EOF's precedence is the lowest
1301
1302        let regular_binary_operator = match &tok {
1303            Token::Op(s) => Some(Op::bare(s)),
1304            Token::Eq => Some(Op::bare("=")),
1305            Token::Star => Some(Op::bare("*")),
1306            Token::Keyword(OPERATOR) => {
1307                self.expect_token(&Token::LParen)?;
1308                let op = self.parse_operator()?;
1309                self.expect_token(&Token::RParen)?;
1310                Some(op)
1311            }
1312            _ => None,
1313        };
1314
1315        if let Some(op) = regular_binary_operator {
1316            if let Some(kw) = self.parse_one_of_keywords(ANY_ALL_KEYWORDS) {
1317                self.parse_any_all(expr, op, kw)
1318            } else {
1319                Ok(Expr::Op {
1320                    op,
1321                    expr1: Box::new(expr),
1322                    expr2: Some(Box::new(self.parse_subexpr(precedence)?)),
1323                })
1324            }
1325        } else if let Token::Keyword(kw) = tok {
1326            match kw {
1327                IS => {
1328                    let negated = self.parse_keyword(NOT);
1329                    if let Some(construct) =
1330                        self.parse_one_of_keywords(&[NULL, TRUE, FALSE, UNKNOWN, DISTINCT])
1331                    {
1332                        let construct = match construct {
1333                            NULL => IsExprConstruct::Null,
1334                            TRUE => IsExprConstruct::True,
1335                            FALSE => IsExprConstruct::False,
1336                            UNKNOWN => IsExprConstruct::Unknown,
1337                            DISTINCT => {
1338                                self.expect_keyword(FROM)?;
1339                                // Parse the right-hand side at the precedence of
1340                                // the `IS` operator we are in the middle of, not
1341                                // at `Precedence::Zero`. Otherwise we greedily
1342                                // pull a trailing `AND`/`OR` into the RHS and
1343                                // parse `a IS DISTINCT FROM b AND c` as `a IS
1344                                // DISTINCT FROM (b AND c)`. `IS DISTINCT FROM`
1345                                // binds tighter than `AND`/`OR` (and looser than
1346                                // comparison and arithmetic), matching
1347                                // PostgreSQL.
1348                                let expr = self.parse_subexpr(precedence)?;
1349                                IsExprConstruct::DistinctFrom(Box::new(expr))
1350                            }
1351                            _ => unreachable!(),
1352                        };
1353                        Ok(Expr::IsExpr {
1354                            expr: Box::new(expr),
1355                            negated,
1356                            construct,
1357                        })
1358                    } else {
1359                        self.expected(
1360                            self.peek_pos(),
1361                            "NULL, NOT NULL, TRUE, NOT TRUE, FALSE, NOT FALSE, UNKNOWN, NOT UNKNOWN after IS",
1362                            self.peek_token(),
1363                        )
1364                    }
1365                }
1366                ISNULL => Ok(Expr::IsExpr {
1367                    expr: Box::new(expr),
1368                    negated: false,
1369                    construct: IsExprConstruct::Null,
1370                }),
1371                NOT | IN | LIKE | ILIKE | BETWEEN => {
1372                    self.prev_token();
1373                    let negated = self.parse_keyword(NOT);
1374                    if self.parse_keyword(IN) {
1375                        self.parse_in(expr, negated)
1376                    } else if self.parse_keyword(BETWEEN) {
1377                        self.parse_between(expr, negated)
1378                    } else if self.parse_keyword(LIKE) {
1379                        self.parse_like(expr, false, negated)
1380                    } else if self.parse_keyword(ILIKE) {
1381                        self.parse_like(expr, true, negated)
1382                    } else {
1383                        self.expected(
1384                            self.peek_pos(),
1385                            "IN, BETWEEN, LIKE, or ILIKE after NOT",
1386                            self.peek_token(),
1387                        )
1388                    }
1389                }
1390                AND => Ok(Expr::And {
1391                    left: Box::new(expr),
1392                    right: Box::new(self.parse_subexpr(precedence)?),
1393                }),
1394                OR => Ok(Expr::Or {
1395                    left: Box::new(expr),
1396                    right: Box::new(self.parse_subexpr(precedence)?),
1397                }),
1398                AT => {
1399                    self.expect_keywords(&[TIME, ZONE])?;
1400                    Ok(Expr::Function(Function {
1401                        name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
1402                            "timezone"
1403                        ))),
1404                        args: FunctionArgs::args(vec![self.parse_subexpr(precedence)?, expr]),
1405                        filter: None,
1406                        over: None,
1407                        distinct: false,
1408                    }))
1409                }
1410                COLLATE => Ok(Expr::Collate {
1411                    expr: Box::new(expr),
1412                    collation: self.parse_item_name()?,
1413                }),
1414                // Can only happen if `get_next_precedence` got out of sync with this function
1415                _ => panic!("No infix parser for token {:?}", tok),
1416            }
1417        } else if Token::DoubleColon == tok {
1418            self.parse_pg_cast(expr)
1419        } else if Token::LBracket == tok {
1420            self.prev_token();
1421            self.parse_subscript(expr)
1422        } else if Token::Dot == tok {
1423            match self.next_token() {
1424                Some(Token::Ident(id)) => Ok(Expr::FieldAccess {
1425                    expr: Box::new(expr),
1426                    field: self.new_identifier(id)?,
1427                }),
1428                // Per PostgreSQL, even reserved keywords are ok after a field
1429                // access operator.
1430                Some(Token::Keyword(kw)) => Ok(Expr::FieldAccess {
1431                    expr: Box::new(expr),
1432                    field: kw.into(),
1433                }),
1434                Some(Token::Star) => Ok(Expr::WildcardAccess(Box::new(expr))),
1435                unexpected => self.expected(
1436                    self.peek_prev_pos(),
1437                    "an identifier or a '*' after '.'",
1438                    unexpected,
1439                ),
1440            }
1441        } else {
1442            // Can only happen if `get_next_precedence` got out of sync with this function
1443            panic!("No infix parser for token {:?}", tok)
1444        }
1445    }
1446
1447    /// Parse subscript expression, i.e. either an index value or slice range.
1448    fn parse_subscript(&mut self, expr: Expr<Raw>) -> Result<Expr<Raw>, ParserError> {
1449        let mut positions = Vec::new();
1450
1451        while self.consume_token(&Token::LBracket) {
1452            let start = if self.peek_token() == Some(Token::Colon) {
1453                None
1454            } else {
1455                Some(self.parse_expr()?)
1456            };
1457
1458            let (end, explicit_slice) = if self.consume_token(&Token::Colon) {
1459                // Presence of a colon means these positions were explicit
1460                (
1461                    // Terminated expr
1462                    if self.peek_token() == Some(Token::RBracket) {
1463                        None
1464                    } else {
1465                        Some(self.parse_expr()?)
1466                    },
1467                    true,
1468                )
1469            } else {
1470                (None, false)
1471            };
1472
1473            assert!(
1474                start.is_some() || explicit_slice,
1475                "user typed something between brackets"
1476            );
1477
1478            assert!(
1479                explicit_slice || end.is_none(),
1480                "if end is some, must have an explicit slice"
1481            );
1482
1483            positions.push(SubscriptPosition {
1484                start,
1485                end,
1486                explicit_slice,
1487            });
1488            self.expect_token(&Token::RBracket)?;
1489        }
1490
1491        // If the expression that is being cast can end with a type name, then let's parenthesize
1492        // it. Otherwise, the `[...]` would melt into the type name (making it an array type).
1493        // Specifically, the only expressions whose printing can end with a type name are casts, so
1494        // check for that.
1495        if matches!(expr, Expr::Cast { .. }) {
1496            Ok(Expr::Subscript {
1497                expr: Box::new(Expr::Nested(Box::new(expr))),
1498                positions,
1499            })
1500        } else {
1501            Ok(Expr::Subscript {
1502                expr: Box::new(expr),
1503                positions,
1504            })
1505        }
1506    }
1507
1508    // Parse calls to substring(), which can take the form:
1509    // - substring('string', 'int')
1510    // - substring('string', 'int', 'int')
1511    // - substring('string' FROM 'int')
1512    // - substring('string' FROM 'int' FOR 'int')
1513    // - substring('string' FOR 'int')
1514    fn parse_substring_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1515        self.expect_token(&Token::LParen)?;
1516        let mut exprs = vec![self.parse_expr()?];
1517        if self.parse_keyword(FROM) {
1518            // 'string' FROM 'int'
1519            exprs.push(self.parse_expr()?);
1520            if self.parse_keyword(FOR) {
1521                // 'string' FROM 'int' FOR 'int'
1522                exprs.push(self.parse_expr()?);
1523            }
1524        } else if self.parse_keyword(FOR) {
1525            // 'string' FOR 'int'
1526            exprs.push(Expr::Value(Value::Number(String::from("1"))));
1527            exprs.push(self.parse_expr()?);
1528        } else {
1529            // 'string', 'int'
1530            // or
1531            // 'string', 'int', 'int'
1532            self.expect_token(&Token::Comma)?;
1533            exprs.extend(self.parse_comma_separated(Parser::parse_expr)?);
1534        }
1535
1536        self.expect_token(&Token::RParen)?;
1537        Ok(Expr::Function(Function {
1538            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("substring"))),
1539            args: FunctionArgs::args(exprs),
1540            filter: None,
1541            over: None,
1542            distinct: false,
1543        }))
1544    }
1545
1546    /// Parse an operator reference.
1547    ///
1548    /// Examples:
1549    ///   * `+`
1550    ///   * `OPERATOR(schema.+)`
1551    ///   * `OPERATOR("foo"."bar"."baz".@>)`
1552    fn parse_operator(&mut self) -> Result<Op, ParserError> {
1553        let mut namespace = vec![];
1554        let op = loop {
1555            match self.next_token() {
1556                Some(Token::Keyword(kw)) => namespace.push(kw.into()),
1557                Some(Token::Ident(id)) => namespace.push(self.new_identifier(id)?),
1558                Some(Token::Op(op)) => break op,
1559                Some(Token::Star) => break "*".to_string(),
1560                tok => self.expected(self.peek_prev_pos(), "operator", tok)?,
1561            }
1562            self.expect_token(&Token::Dot)?;
1563        };
1564        Ok(Op {
1565            namespace: Some(namespace),
1566            op,
1567        })
1568    }
1569
1570    /// Parses an `ANY`, `ALL`, or `SOME` operation, starting after the `ANY`,
1571    /// `ALL`, or `SOME` keyword.
1572    fn parse_any_all(
1573        &mut self,
1574        left: Expr<Raw>,
1575        op: Op,
1576        kw: Keyword,
1577    ) -> Result<Expr<Raw>, ParserError> {
1578        self.expect_token(&Token::LParen)?;
1579
1580        let expr = match self.parse_parenthesized_fragment()? {
1581            ParenthesizedFragment::Exprs(exprs) => {
1582                if exprs.len() > 1 {
1583                    return parser_err!(
1584                        self,
1585                        self.peek_pos(),
1586                        "{kw} requires a single expression or subquery, not an expression list",
1587                    );
1588                }
1589                let right = exprs.into_element();
1590                if kw == ALL {
1591                    Expr::AllExpr {
1592                        left: Box::new(left),
1593                        op,
1594                        right: Box::new(right),
1595                    }
1596                } else {
1597                    Expr::AnyExpr {
1598                        left: Box::new(left),
1599                        op,
1600                        right: Box::new(right),
1601                    }
1602                }
1603            }
1604            ParenthesizedFragment::Query(subquery) => {
1605                if kw == ALL {
1606                    Expr::AllSubquery {
1607                        left: Box::new(left),
1608                        op,
1609                        right: Box::new(subquery),
1610                    }
1611                } else {
1612                    Expr::AnySubquery {
1613                        left: Box::new(left),
1614                        op,
1615                        right: Box::new(subquery),
1616                    }
1617                }
1618            }
1619        };
1620
1621        self.expect_token(&Token::RParen)?;
1622
1623        Ok(expr)
1624    }
1625
1626    /// Parses the parens following the `[ NOT ] IN` operator
1627    fn parse_in(&mut self, expr: Expr<Raw>, negated: bool) -> Result<Expr<Raw>, ParserError> {
1628        self.expect_token(&Token::LParen)?;
1629        let in_op = match self.parse_parenthesized_fragment()? {
1630            ParenthesizedFragment::Exprs(list) => Expr::InList {
1631                expr: Box::new(expr),
1632                list,
1633                negated,
1634            },
1635            ParenthesizedFragment::Query(subquery) => Expr::InSubquery {
1636                expr: Box::new(expr),
1637                subquery: Box::new(subquery),
1638                negated,
1639            },
1640        };
1641        self.expect_token(&Token::RParen)?;
1642        Ok(in_op)
1643    }
1644
1645    /// Parses `BETWEEN <low> AND <high>`, assuming the `BETWEEN` keyword was already consumed
1646    fn parse_between(&mut self, expr: Expr<Raw>, negated: bool) -> Result<Expr<Raw>, ParserError> {
1647        // Stop parsing subexpressions for <low> and <high> on tokens with
1648        // precedence lower than that of `BETWEEN`, such as `AND`, `IS`, etc.
1649        let low = self.parse_subexpr(Precedence::Like)?;
1650        self.expect_keyword(AND)?;
1651        let high = self.parse_subexpr(Precedence::Like)?;
1652        Ok(Expr::Between {
1653            expr: Box::new(expr),
1654            negated,
1655            low: Box::new(low),
1656            high: Box::new(high),
1657        })
1658    }
1659
1660    /// Parses `LIKE <pattern> [ ESCAPE <char> ]`, assuming the `LIKE` keyword was already consumed
1661    fn parse_like(
1662        &mut self,
1663        expr: Expr<Raw>,
1664        case_insensitive: bool,
1665        negated: bool,
1666    ) -> Result<Expr<Raw>, ParserError> {
1667        if let Some(kw) = self.parse_one_of_keywords(ANY_ALL_KEYWORDS) {
1668            let op = match (case_insensitive, negated) {
1669                (false, false) => "~~",
1670                (false, true) => "!~~",
1671                (true, false) => "~~*",
1672                (true, true) => "!~~*",
1673            };
1674            return self.parse_any_all(expr, Op::bare(op), kw);
1675        }
1676        let pattern = self.parse_subexpr(Precedence::Like)?;
1677        let escape = if self.parse_keyword(ESCAPE) {
1678            Some(Box::new(self.parse_subexpr(Precedence::Like)?))
1679        } else {
1680            None
1681        };
1682        Ok(Expr::Like {
1683            expr: Box::new(expr),
1684            pattern: Box::new(pattern),
1685            escape,
1686            case_insensitive,
1687            negated,
1688        })
1689    }
1690
1691    /// Parse a postgresql casting style which is in the form of `expr::datatype`
1692    fn parse_pg_cast(&mut self, expr: Expr<Raw>) -> Result<Expr<Raw>, ParserError> {
1693        Ok(Expr::Cast {
1694            expr: Box::new(expr),
1695            data_type: self.parse_data_type()?,
1696        })
1697    }
1698
1699    /// Get the precedence of the next token
1700    fn get_next_precedence(&self) -> Precedence {
1701        if let Some(token) = self.peek_token() {
1702            match &token {
1703                Token::Keyword(OR) => Precedence::Or,
1704                Token::Keyword(AND) => Precedence::And,
1705                Token::Keyword(NOT) => match &self.peek_nth_token(1) {
1706                    // The precedence of NOT varies depending on keyword that
1707                    // follows it. If it is followed by IN, BETWEEN, or LIKE,
1708                    // it takes on the precedence of those tokens. Otherwise it
1709                    // is not an infix operator, and therefore has zero
1710                    // precedence.
1711                    Some(Token::Keyword(IN)) => Precedence::Like,
1712                    Some(Token::Keyword(BETWEEN)) => Precedence::Like,
1713                    Some(Token::Keyword(ILIKE)) => Precedence::Like,
1714                    Some(Token::Keyword(LIKE)) => Precedence::Like,
1715                    _ => Precedence::Zero,
1716                },
1717                Token::Keyword(IS) | Token::Keyword(ISNULL) => Precedence::Is,
1718                Token::Keyword(IN) => Precedence::Like,
1719                Token::Keyword(BETWEEN) => Precedence::Like,
1720                Token::Keyword(ILIKE) => Precedence::Like,
1721                Token::Keyword(LIKE) => Precedence::Like,
1722                Token::Keyword(OPERATOR) => Precedence::Other,
1723                Token::Op(s) => match s.as_str() {
1724                    "<" | "<=" | "<>" | "!=" | ">" | ">=" => Precedence::Cmp,
1725                    "+" | "-" => Precedence::PlusMinus,
1726                    "/" | "%" => Precedence::MultiplyDivide,
1727                    _ => Precedence::Other,
1728                },
1729                Token::Eq => Precedence::Cmp,
1730                Token::Star => Precedence::MultiplyDivide,
1731                Token::Keyword(COLLATE) | Token::Keyword(AT) => Precedence::PostfixCollateAt,
1732                Token::DoubleColon | Token::LBracket | Token::Dot => {
1733                    Precedence::PostfixSubscriptCast
1734                }
1735                _ => Precedence::Zero,
1736            }
1737        } else {
1738            Precedence::Zero
1739        }
1740    }
1741
1742    /// Return the first non-whitespace token that has not yet been processed
1743    /// (or None if reached end-of-file)
1744    fn peek_token(&self) -> Option<Token> {
1745        self.peek_nth_token(0)
1746    }
1747
1748    fn peek_keyword(&self, kw: Keyword) -> bool {
1749        match self.peek_token() {
1750            Some(Token::Keyword(k)) => k == kw,
1751            _ => false,
1752        }
1753    }
1754
1755    fn peek_keywords(&self, keywords: &[Keyword]) -> bool {
1756        self.peek_keywords_from(0, keywords)
1757    }
1758
1759    fn peek_keywords_from(&self, start: usize, keywords: &[Keyword]) -> bool {
1760        for (i, keyword) in keywords.iter().enumerate() {
1761            match self.peek_nth_token(start + i) {
1762                Some(Token::Keyword(k)) => {
1763                    if k != *keyword {
1764                        return false;
1765                    }
1766                }
1767                _ => return false,
1768            }
1769        }
1770        true
1771    }
1772
1773    fn peek_one_of_keywords(&self, kws: &[Keyword]) -> bool {
1774        match self.peek_token() {
1775            Some(Token::Keyword(k)) => kws.contains(&k),
1776            _ => false,
1777        }
1778    }
1779
1780    /// Returns whether the sequence of keywords is found at any point before
1781    /// the end of the unprocessed tokens.
1782    fn peek_keywords_lookahead(&self, keywords: &[Keyword]) -> bool {
1783        let mut index = 0;
1784        while index < self.tokens.len() {
1785            if self.peek_keywords_from(index, keywords) {
1786                return true;
1787            }
1788            index += 1;
1789        }
1790        false
1791    }
1792
1793    /// Return the nth token that has not yet been processed.
1794    fn peek_nth_token(&self, n: usize) -> Option<Token> {
1795        self.tokens
1796            .get(self.index + n)
1797            .map(|token| token.kind.clone())
1798    }
1799
1800    /// Return the next token that has not yet been processed, or None if
1801    /// reached end-of-file, and mark it as processed. OK to call repeatedly
1802    /// after reaching EOF.
1803    fn next_token(&mut self) -> Option<Token> {
1804        let token = self.tokens.get(self.index).map(|token| token.kind.clone());
1805        self.index += 1;
1806        token
1807    }
1808
1809    /// Push back the last one non-whitespace token. Must be called after
1810    /// `next_token()`, otherwise might panic. OK to call after
1811    /// `next_token()` indicates an EOF.
1812    fn prev_token(&mut self) {
1813        assert!(self.index > 0);
1814        self.index -= 1;
1815    }
1816
1817    /// Return the byte position within the query string at which the
1818    /// next token starts.
1819    fn peek_pos(&self) -> usize {
1820        match self.tokens.get(self.index) {
1821            Some(token) => token.offset,
1822            None => self.sql.len(),
1823        }
1824    }
1825
1826    /// Return the byte position within the query string at which the previous
1827    /// token starts.
1828    ///
1829    /// Must be called after `next_token()`, otherwise might panic.
1830    /// OK to call after `next_token()` indicates an EOF.
1831    fn peek_prev_pos(&self) -> usize {
1832        assert!(self.index > 0);
1833        match self.tokens.get(self.index - 1) {
1834            Some(token) => token.offset,
1835            None => self.sql.len(),
1836        }
1837    }
1838
1839    /// Report unexpected token
1840    fn expected<D, T>(
1841        &self,
1842        pos: usize,
1843        expected: D,
1844        found: Option<Token>,
1845    ) -> Result<T, ParserError>
1846    where
1847        D: fmt::Display,
1848    {
1849        parser_err!(
1850            self,
1851            pos,
1852            "Expected {}, found {}",
1853            expected,
1854            found.display_or("EOF"),
1855        )
1856    }
1857
1858    /// Look for an expected keyword and consume it if it exists
1859    #[must_use]
1860    fn parse_keyword(&mut self, kw: Keyword) -> bool {
1861        if self.peek_keyword(kw) {
1862            self.next_token();
1863            true
1864        } else {
1865            false
1866        }
1867    }
1868
1869    /// Look for an expected sequence of keywords and consume them if they exist
1870    #[must_use]
1871    fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
1872        if self.peek_keywords(keywords) {
1873            self.index += keywords.len();
1874            true
1875        } else {
1876            false
1877        }
1878    }
1879
1880    fn parse_at_most_one_keyword(
1881        &mut self,
1882        keywords: &[Keyword],
1883        location: &str,
1884    ) -> Result<Option<Keyword>, ParserError> {
1885        match self.parse_one_of_keywords(keywords) {
1886            Some(first) => {
1887                let remaining_keywords = keywords
1888                    .iter()
1889                    .cloned()
1890                    .filter(|k| *k != first)
1891                    .collect::<Vec<_>>();
1892                if let Some(second) = self.parse_one_of_keywords(remaining_keywords.as_slice()) {
1893                    let second_pos = self.peek_prev_pos();
1894                    parser_err!(
1895                        self,
1896                        second_pos,
1897                        "Cannot specify both {} and {} in {}",
1898                        first,
1899                        second,
1900                        location,
1901                    )
1902                } else {
1903                    Ok(Some(first))
1904                }
1905            }
1906            None => Ok(None),
1907        }
1908    }
1909
1910    /// Look for one of the given keywords and return the one that matches.
1911    #[must_use]
1912    fn parse_one_of_keywords(&mut self, kws: &[Keyword]) -> Option<Keyword> {
1913        match self.peek_token() {
1914            Some(Token::Keyword(k)) if kws.contains(&k) => {
1915                self.next_token();
1916                Some(k)
1917            }
1918            _ => None,
1919        }
1920    }
1921
1922    /// Bail out if the current token is not one of the expected keywords, or consume it if it is
1923    fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
1924        if let Some(keyword) = self.parse_one_of_keywords(keywords) {
1925            Ok(keyword)
1926        } else {
1927            self.expected(
1928                self.peek_pos(),
1929                format!("one of {}", keywords.iter().join(" or ")),
1930                self.peek_token(),
1931            )
1932        }
1933    }
1934
1935    /// Bail out if the current token is not an expected keyword, or consume it if it is
1936    fn expect_keyword(&mut self, expected: Keyword) -> Result<(), ParserError> {
1937        if self.parse_keyword(expected) {
1938            Ok(())
1939        } else {
1940            self.expected(self.peek_pos(), expected, self.peek_token())
1941        }
1942    }
1943
1944    /// Bail out if the following tokens are not the expected sequence of
1945    /// keywords, or consume them if they are.
1946    fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
1947        for kw in expected {
1948            self.expect_keyword(*kw)?;
1949        }
1950        Ok(())
1951    }
1952
1953    /// Consume the next token if it matches the expected token, otherwise return false
1954    #[must_use]
1955    fn consume_token(&mut self, expected: &Token) -> bool {
1956        match &self.peek_token() {
1957            Some(t) if *t == *expected => {
1958                self.next_token();
1959                true
1960            }
1961            _ => false,
1962        }
1963    }
1964
1965    /// Bail out if the current token is not an expected token, or consume it if it is
1966    fn expect_token(&mut self, expected: &Token) -> Result<(), ParserError> {
1967        if self.consume_token(expected) {
1968            Ok(())
1969        } else {
1970            self.expected(self.peek_pos(), expected, self.peek_token())
1971        }
1972    }
1973
1974    /// Bail out if the current token is not one of the expected tokens, or consume it if it is
1975    fn expect_one_of_tokens(&mut self, tokens: &[Token]) -> Result<Token, ParserError> {
1976        match self.peek_token() {
1977            Some(t) if tokens.iter().find(|token| t == **token).is_some() => {
1978                let _ = self.next_token();
1979                Ok(t)
1980            }
1981            _ => self.expected(
1982                self.peek_pos(),
1983                format!("one of {}", tokens.iter().join(" or ")),
1984                self.peek_token(),
1985            ),
1986        }
1987    }
1988
1989    /// Bail out if the current token is not an expected keyword or token, or consume it if it is
1990    fn expect_keyword_or_token(
1991        &mut self,
1992        expected_keyword: Keyword,
1993        expected_token: &Token,
1994    ) -> Result<(), ParserError> {
1995        if self.parse_keyword(expected_keyword) || self.consume_token(expected_token) {
1996            Ok(())
1997        } else {
1998            self.expected(
1999                self.peek_pos(),
2000                format!("{expected_keyword} or {expected_token}"),
2001                self.peek_token(),
2002            )
2003        }
2004    }
2005
2006    /// Optional '=', then comma-separated list in parens/brackets.
2007    fn parse_list_value<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
2008    where
2009        F: FnMut(&mut Self) -> Result<T, ParserError>,
2010    {
2011        let _ = self.consume_token(&Token::Eq);
2012        let delimiter = self.expect_one_of_tokens(&[Token::LParen, Token::LBracket])?;
2013        let values = self.parse_comma_separated(f)?;
2014        self.expect_token(&match delimiter {
2015            Token::LParen => Token::RParen,
2016            Token::LBracket => Token::RBracket,
2017            _ => unreachable!(),
2018        })?;
2019        Ok(values)
2020    }
2021
2022    /// Parse a comma-separated list of 1+ items accepted by `F`
2023    fn parse_comma_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
2024    where
2025        F: FnMut(&mut Self) -> Result<T, ParserError>,
2026    {
2027        let mut values = vec![];
2028        loop {
2029            values.push(f(self)?);
2030            if !self.consume_token(&Token::Comma) {
2031                break;
2032            }
2033        }
2034        Ok(values)
2035    }
2036
2037    #[must_use]
2038    fn maybe_parse<T, F>(&mut self, mut f: F) -> Option<T>
2039    where
2040        F: FnMut(&mut Self) -> Result<T, ParserError>,
2041    {
2042        if self.speculative_failures >= SPECULATIVE_FAILURES_PER_TOKEN * self.tokens.len() {
2043            return None;
2044        }
2045        let index = self.index;
2046        if let Ok(t) = f(self) {
2047            Some(t)
2048        } else {
2049            self.index = index;
2050            self.speculative_failures += 1;
2051            None
2052        }
2053    }
2054
2055    /// Parse a SQL CREATE statement
2056    fn parse_create(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
2057        if self.peek_keyword(DATABASE) {
2058            self.parse_create_database()
2059                .map_parser_err(StatementKind::CreateDatabase)
2060        } else if self.peek_keyword(SCHEMA) {
2061            self.parse_create_schema()
2062                .map_parser_err(StatementKind::CreateSchema)
2063        } else if self.peek_keyword(SINK) {
2064            self.parse_create_sink()
2065                .map_parser_err(StatementKind::CreateSink)
2066        } else if self.peek_keyword(TYPE) {
2067            self.parse_create_type()
2068                .map_parser_err(StatementKind::CreateType)
2069        } else if self.peek_keyword(ROLE) {
2070            self.parse_create_role()
2071                .map_parser_err(StatementKind::CreateRole)
2072        } else if self.peek_keyword(CLUSTER) {
2073            self.next_token();
2074            if self.peek_keyword(REPLICA) {
2075                self.parse_create_cluster_replica()
2076                    .map_parser_err(StatementKind::CreateClusterReplica)
2077            } else {
2078                self.parse_create_cluster()
2079                    .map_parser_err(StatementKind::CreateCluster)
2080            }
2081        } else if self.peek_keyword(INDEX) || self.peek_keywords(&[DEFAULT, INDEX]) {
2082            self.parse_create_index()
2083                .map_parser_err(StatementKind::CreateIndex)
2084        } else if self.peek_keyword(SOURCE) {
2085            self.parse_create_source()
2086                .map_parser_err(StatementKind::CreateSource)
2087        } else if self.peek_keyword(SUBSOURCE) {
2088            self.parse_create_subsource()
2089                .map_parser_err(StatementKind::CreateSubsource)
2090        } else if self.peek_keyword(TABLE)
2091            || self.peek_keywords(&[TEMP, TABLE])
2092            || self.peek_keywords(&[TEMPORARY, TABLE])
2093        {
2094            if self.peek_keywords_lookahead(&[FROM, SOURCE])
2095                || self.peek_keywords_lookahead(&[FROM, WEBHOOK])
2096            {
2097                self.parse_create_table_from_source()
2098                    .map_parser_err(StatementKind::CreateTableFromSource)
2099            } else {
2100                self.parse_create_table()
2101                    .map_parser_err(StatementKind::CreateTable)
2102            }
2103        } else if self.peek_keyword(SECRET) {
2104            self.parse_create_secret()
2105                .map_parser_err(StatementKind::CreateSecret)
2106        } else if self.peek_keyword(CONNECTION) {
2107            self.parse_create_connection()
2108                .map_parser_err(StatementKind::CreateConnection)
2109        } else if self.peek_keywords(&[MATERIALIZED, VIEW])
2110            || self.peek_keywords(&[OR, REPLACE, MATERIALIZED, VIEW])
2111            || self.peek_keywords(&[REPLACEMENT, MATERIALIZED, VIEW])
2112            || self.peek_keywords(&[OR, REPLACE, REPLACEMENT, MATERIALIZED, VIEW])
2113        {
2114            self.parse_create_materialized_view()
2115                .map_parser_err(StatementKind::CreateMaterializedView)
2116        } else if self.peek_keywords(&[USER]) {
2117            parser_err!(
2118                self,
2119                self.peek_pos(),
2120                "CREATE USER is not supported, for more information consult the documentation at https://materialize.com/docs/sql/create-role/#details"
2121            ).map_parser_err(StatementKind::CreateRole)
2122        } else if self.peek_keywords(&[NETWORK, POLICY]) {
2123            self.parse_create_network_policy()
2124                .map_parser_err(StatementKind::CreateNetworkPolicy)
2125        } else {
2126            let index = self.index;
2127
2128            // go over optional modifiers
2129            let parsed_or_replace = self.parse_keywords(&[OR, REPLACE]);
2130            let parsed_temporary = self.parse_one_of_keywords(&[TEMP, TEMPORARY]).is_some();
2131
2132            if self.parse_keyword(VIEW) {
2133                self.index = index;
2134                self.parse_create_view()
2135                    .map_parser_err(StatementKind::CreateView)
2136            } else {
2137                let expected_msg = match (parsed_or_replace, parsed_temporary) {
2138                    (true, true) => "VIEW after CREATE OR REPLACE TEMPORARY",
2139                    (true, false) => {
2140                        "[TEMPORARY] VIEW, or MATERIALIZED VIEW after CREATE OR REPLACE"
2141                    }
2142                    (false, true) => "TABLE, or VIEW after CREATE TEMPORARY",
2143                    (false, false) => {
2144                        "DATABASE, SCHEMA, ROLE, TYPE, INDEX, SINK, SOURCE, [TEMPORARY] TABLE, \
2145                        SECRET, [OR REPLACE] [TEMPORARY] VIEW, or [OR REPLACE] MATERIALIZED VIEW \
2146                        after CREATE"
2147                    }
2148                };
2149                self.expected(self.peek_pos(), expected_msg, self.peek_token())
2150                    .map_no_statement_parser_err()
2151            }
2152        }
2153    }
2154
2155    fn parse_create_database(&mut self) -> Result<Statement<Raw>, ParserError> {
2156        self.expect_keyword(DATABASE)?;
2157        let if_not_exists = self.parse_if_not_exists()?;
2158        let name = self.parse_database_name()?;
2159        Ok(Statement::CreateDatabase(CreateDatabaseStatement {
2160            name,
2161            if_not_exists,
2162        }))
2163    }
2164
2165    fn parse_create_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
2166        self.expect_keyword(SCHEMA)?;
2167        let if_not_exists = self.parse_if_not_exists()?;
2168        let name = self.parse_schema_name()?;
2169        Ok(Statement::CreateSchema(CreateSchemaStatement {
2170            name,
2171            if_not_exists,
2172        }))
2173    }
2174
2175    fn parse_format(&mut self) -> Result<Format<Raw>, ParserError> {
2176        let format = if self.parse_keyword(AVRO) {
2177            self.expect_keyword(USING)?;
2178            Format::Avro(self.parse_avro_schema()?)
2179        } else if self.parse_keyword(PROTOBUF) {
2180            Format::Protobuf(self.parse_protobuf_schema()?)
2181        } else if self.parse_keyword(REGEX) {
2182            let regex = self.parse_literal_string()?;
2183            Format::Regex(regex)
2184        } else if self.parse_keyword(CSV) {
2185            self.expect_keyword(WITH)?;
2186            let columns = if self.parse_keyword(HEADER) || self.parse_keyword(HEADERS) {
2187                CsvColumns::Header {
2188                    names: self.parse_parenthesized_column_list(Mandatory)?,
2189                }
2190            } else {
2191                let n_cols = self.parse_literal_uint()?;
2192                self.expect_keyword(COLUMNS)?;
2193                CsvColumns::Count(n_cols)
2194            };
2195            let delimiter = if self.parse_keywords(&[DELIMITED, BY]) {
2196                let s = self.parse_literal_string()?;
2197                match s.len() {
2198                    1 => Ok(s.chars().next().unwrap()),
2199                    _ => self.expected(self.peek_pos(), "one-character string", self.peek_token()),
2200                }?
2201            } else {
2202                ','
2203            };
2204            Format::Csv { columns, delimiter }
2205        } else if self.parse_keyword(JSON) {
2206            let array = self.parse_keyword(ARRAY);
2207            Format::Json { array }
2208        } else if self.parse_keyword(TEXT) {
2209            Format::Text
2210        } else if self.parse_keyword(BYTES) {
2211            Format::Bytes
2212        } else {
2213            return self.expected(
2214                self.peek_pos(),
2215                "AVRO, PROTOBUF, REGEX, CSV, JSON, TEXT, or BYTES",
2216                self.peek_token(),
2217            );
2218        };
2219        Ok(format)
2220    }
2221
2222    fn parse_avro_schema(&mut self) -> Result<AvroSchema<Raw>, ParserError> {
2223        let avro_schema = if self.parse_keywords(&[CONFLUENT, SCHEMA, REGISTRY]) {
2224            let csr_connection = self.parse_csr_connection_avro()?;
2225            AvroSchema::Csr { csr_connection }
2226        } else if self.parse_keywords(&[AWS, GLUE, SCHEMA, REGISTRY]) {
2227            self.expect_keyword(CONNECTION)?;
2228            let connection = self.parse_raw_name()?;
2229            let with_options = if self.consume_token(&Token::LParen) {
2230                let opts = self.parse_comma_separated(Parser::parse_glue_avro_option)?;
2231                self.expect_token(&Token::RParen)?;
2232                opts
2233            } else {
2234                vec![]
2235            };
2236            // SEED VALUE SCHEMA '<json>' is normally emitted by purification
2237            // and re-parsed when persisted create_sql is reloaded. A user may
2238            // also write it directly; that is accepted here (purification trusts
2239            // a pre-populated seed), though it is not the intended path.
2240            let seed = if self.parse_keyword(SEED) {
2241                self.expect_keywords(&[VALUE, SCHEMA])?;
2242                let value_schema = self.parse_literal_string()?;
2243                Some(GlueAvroSeed { value_schema })
2244            } else {
2245                None
2246            };
2247            AvroSchema::Glue {
2248                connection,
2249                with_options,
2250                seed,
2251            }
2252        } else if self.parse_keyword(SCHEMA) {
2253            self.prev_token();
2254            self.expect_keyword(SCHEMA)?;
2255            let schema = Schema {
2256                schema: self.parse_literal_string()?,
2257            };
2258            let with_options = if self.consume_token(&Token::LParen) {
2259                let with_options = self.parse_comma_separated(Parser::parse_avro_schema_option)?;
2260                self.expect_token(&Token::RParen)?;
2261                with_options
2262            } else {
2263                vec![]
2264            };
2265            AvroSchema::InlineSchema {
2266                schema,
2267                with_options,
2268            }
2269        } else {
2270            return self.expected(
2271                self.peek_pos(),
2272                "CONFLUENT SCHEMA REGISTRY, AWS GLUE SCHEMA REGISTRY, or SCHEMA",
2273                self.peek_token(),
2274            );
2275        };
2276        Ok(avro_schema)
2277    }
2278
2279    fn parse_avro_schema_option(&mut self) -> Result<AvroSchemaOption<Raw>, ParserError> {
2280        self.expect_keywords(&[CONFLUENT, WIRE, FORMAT])?;
2281        Ok(AvroSchemaOption {
2282            name: AvroSchemaOptionName::ConfluentWireFormat,
2283            value: self.parse_optional_option_value()?,
2284        })
2285    }
2286
2287    fn parse_glue_avro_option(&mut self) -> Result<GlueAvroOption<Raw>, ParserError> {
2288        self.expect_keywords(&[SCHEMA, NAME])?;
2289        // The value is parsed as optional even though SCHEMA NAME requires one currently.
2290        // Enforcing it here wouldn't let us drop the purification-layer check:
2291        // the whole option list is optional, so `CONNECTION glue_conn` and
2292        // `(...)` with no SCHEMA NAME bypass this function entirely. This also allows
2293        // us to provide more detailed errors.
2294        //
2295        // Future work may add mutually exclusive options (or interpret a lack of schema name).
2296        // For example, a lack of schema name may fall back to the default AWS Glue naming strategy:
2297        // See <https://github.com/awslabs/aws-glue-schema-registry/blob/4b9cac477d6876a883e2a8893738a30c072694dc/common/src/main/java/com/amazonaws/services/schemaregistry/common/AWSSchemaNamingStrategyDefaultImpl.java#L18>
2298        Ok(GlueAvroOption {
2299            name: GlueAvroOptionName::SchemaName,
2300            value: self.parse_optional_option_value()?,
2301        })
2302    }
2303
2304    fn parse_protobuf_schema(&mut self) -> Result<ProtobufSchema<Raw>, ParserError> {
2305        if self.parse_keywords(&[USING, CONFLUENT, SCHEMA, REGISTRY]) {
2306            let csr_connection = self.parse_csr_connection_proto()?;
2307            Ok(ProtobufSchema::Csr { csr_connection })
2308        } else if self.parse_keyword(MESSAGE) {
2309            let message_name = self.parse_literal_string()?;
2310            self.expect_keyword(USING)?;
2311            self.expect_keyword(SCHEMA)?;
2312            let schema = Schema {
2313                schema: self.parse_literal_string()?,
2314            };
2315            Ok(ProtobufSchema::InlineSchema {
2316                message_name,
2317                schema,
2318            })
2319        } else {
2320            self.expected(
2321                self.peek_pos(),
2322                "CONFLUENT SCHEMA REGISTRY or MESSAGE",
2323                self.peek_token(),
2324            )
2325        }
2326    }
2327
2328    fn parse_csr_connection_reference(&mut self) -> Result<CsrConnection<Raw>, ParserError> {
2329        self.expect_keyword(CONNECTION)?;
2330        let connection = self.parse_raw_name()?;
2331
2332        let options = if self.consume_token(&Token::LParen) {
2333            let options = self.parse_comma_separated(Parser::parse_csr_config_option)?;
2334            self.expect_token(&Token::RParen)?;
2335            options
2336        } else {
2337            vec![]
2338        };
2339
2340        Ok(CsrConnection {
2341            connection,
2342            options,
2343        })
2344    }
2345
2346    fn parse_csr_config_option(&mut self) -> Result<CsrConfigOption<Raw>, ParserError> {
2347        let name = match self.expect_one_of_keywords(&[AVRO, NULL, KEY, VALUE, DOC])? {
2348            AVRO => {
2349                let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
2350                    KEY => CsrConfigOptionName::AvroKeyFullname,
2351                    VALUE => CsrConfigOptionName::AvroValueFullname,
2352                    _ => unreachable!(),
2353                };
2354                self.expect_keyword(FULLNAME)?;
2355                name
2356            }
2357            NULL => {
2358                self.expect_keyword(DEFAULTS)?;
2359                CsrConfigOptionName::NullDefaults
2360            }
2361            KEY => match self.expect_one_of_keywords(&[DOC, COMPATIBILITY])? {
2362                DOC => {
2363                    self.expect_keyword(ON)?;
2364                    let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2365                    CsrConfigOptionName::AvroDocOn(AvroDocOn {
2366                        identifier: doc_on_identifier,
2367                        for_schema: DocOnSchema::KeyOnly,
2368                    })
2369                }
2370                COMPATIBILITY => {
2371                    self.expect_keyword(LEVEL)?;
2372                    CsrConfigOptionName::KeyCompatibilityLevel
2373                }
2374                _ => unreachable!(),
2375            },
2376            VALUE => match self.expect_one_of_keywords(&[DOC, COMPATIBILITY])? {
2377                DOC => {
2378                    self.expect_keyword(ON)?;
2379                    let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2380                    CsrConfigOptionName::AvroDocOn(AvroDocOn {
2381                        identifier: doc_on_identifier,
2382                        for_schema: DocOnSchema::ValueOnly,
2383                    })
2384                }
2385                COMPATIBILITY => {
2386                    self.expect_keyword(LEVEL)?;
2387                    CsrConfigOptionName::ValueCompatibilityLevel
2388                }
2389                _ => unreachable!(),
2390            },
2391            DOC => {
2392                self.expect_keyword(ON)?;
2393                let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2394                CsrConfigOptionName::AvroDocOn(AvroDocOn {
2395                    identifier: doc_on_identifier,
2396                    for_schema: DocOnSchema::All,
2397                })
2398            }
2399            _ => unreachable!(),
2400        };
2401        Ok(CsrConfigOption {
2402            name,
2403            value: self.parse_optional_option_value()?,
2404        })
2405    }
2406
2407    fn parse_avro_doc_on_option_name(&mut self) -> Result<DocOnIdentifier<Raw>, ParserError> {
2408        match self.expect_one_of_keywords(&[TYPE, COLUMN])? {
2409            TYPE => Ok(DocOnIdentifier::Type(self.parse_raw_name()?)),
2410            COLUMN => Ok(DocOnIdentifier::Column(self.parse_column_name()?)),
2411            _ => unreachable!(),
2412        }
2413    }
2414
2415    fn parse_csr_connection_avro(&mut self) -> Result<CsrConnectionAvro<Raw>, ParserError> {
2416        let connection = self.parse_csr_connection_reference()?;
2417        let seed = if self.parse_keyword(SEED) {
2418            let key_schema = if self.parse_keyword(KEY) {
2419                self.expect_keyword(SCHEMA)?;
2420                Some(self.parse_literal_string()?)
2421            } else {
2422                None
2423            };
2424
2425            // Parse KEY REFERENCES if present (only valid if we have a key schema)
2426            let key_reference_schemas =
2427                if key_schema.is_some() && self.parse_keywords(&[KEY, REFERENCES]) {
2428                    self.expect_token(&Token::LParen)?;
2429                    let refs = self.parse_comma_separated(|p| p.parse_literal_string())?;
2430                    self.expect_token(&Token::RParen)?;
2431                    refs
2432                } else {
2433                    vec![]
2434                };
2435
2436            self.expect_keywords(&[VALUE, SCHEMA])?;
2437            let value_schema = self.parse_literal_string()?;
2438
2439            // Parse VALUE REFERENCES if present
2440            let value_reference_schemas = if self.parse_keywords(&[VALUE, REFERENCES]) {
2441                self.expect_token(&Token::LParen)?;
2442                let refs = self.parse_comma_separated(|p| p.parse_literal_string())?;
2443                self.expect_token(&Token::RParen)?;
2444                refs
2445            } else {
2446                vec![]
2447            };
2448
2449            Some(CsrSeedAvro {
2450                key_schema,
2451                value_schema,
2452                key_reference_schemas,
2453                value_reference_schemas,
2454            })
2455        } else {
2456            None
2457        };
2458
2459        let mut parse_schema_strategy =
2460            |kws| -> Result<Option<ReaderSchemaSelectionStrategy>, ParserError> {
2461                if self.parse_keywords(kws) {
2462                    Ok(Some(
2463                        match self.expect_one_of_keywords(&[ID, LATEST, INLINE])? {
2464                            ID => {
2465                                let pos = self.index;
2466                                ReaderSchemaSelectionStrategy::ById(
2467                                    self.parse_literal_int()?.try_into().map_err(|_| {
2468                                        ParserError::new(pos, "Expected a 32-bit integer")
2469                                    })?,
2470                                )
2471                            }
2472                            LATEST => ReaderSchemaSelectionStrategy::Latest,
2473                            INLINE => {
2474                                ReaderSchemaSelectionStrategy::Inline(self.parse_literal_string()?)
2475                            }
2476                            _ => unreachable!(),
2477                        },
2478                    ))
2479                } else {
2480                    Ok(None)
2481                }
2482            };
2483
2484        let key_strategy = parse_schema_strategy(&[KEY, STRATEGY])?;
2485        let value_strategy = parse_schema_strategy(&[VALUE, STRATEGY])?;
2486
2487        Ok(CsrConnectionAvro {
2488            connection,
2489            seed,
2490            key_strategy,
2491            value_strategy,
2492        })
2493    }
2494
2495    fn parse_csr_connection_proto(&mut self) -> Result<CsrConnectionProtobuf<Raw>, ParserError> {
2496        let connection = self.parse_csr_connection_reference()?;
2497
2498        let seed = if self.parse_keyword(SEED) {
2499            let key = if self.parse_keyword(KEY) {
2500                self.expect_keyword(SCHEMA)?;
2501                let schema = self.parse_literal_string()?;
2502                self.expect_keyword(MESSAGE)?;
2503                let message_name = self.parse_literal_string()?;
2504                Some(CsrSeedProtobufSchema {
2505                    schema,
2506                    message_name,
2507                })
2508            } else {
2509                None
2510            };
2511            self.expect_keywords(&[VALUE, SCHEMA])?;
2512            let value_schema = self.parse_literal_string()?;
2513            self.expect_keyword(MESSAGE)?;
2514            let value_message_name = self.parse_literal_string()?;
2515            Some(CsrSeedProtobuf {
2516                value: CsrSeedProtobufSchema {
2517                    schema: value_schema,
2518                    message_name: value_message_name,
2519                },
2520                key,
2521            })
2522        } else {
2523            None
2524        };
2525
2526        Ok(CsrConnectionProtobuf { connection, seed })
2527    }
2528
2529    fn parse_source_error_policy_option(&mut self) -> Result<SourceErrorPolicy, ParserError> {
2530        match self.expect_one_of_keywords(&[INLINE])? {
2531            INLINE => Ok(SourceErrorPolicy::Inline {
2532                alias: self.parse_alias()?,
2533            }),
2534            _ => unreachable!(),
2535        }
2536    }
2537
2538    fn parse_source_envelope(&mut self) -> Result<SourceEnvelope, ParserError> {
2539        let envelope = if self.parse_keyword(NONE) {
2540            SourceEnvelope::None
2541        } else if self.parse_keyword(DEBEZIUM) {
2542            SourceEnvelope::Debezium
2543        } else if self.parse_keyword(UPSERT) {
2544            let value_decode_err_policy = if self.consume_token(&Token::LParen) {
2545                // We only support the `VALUE DECODING ERRORS` option for now, but if we add another
2546                // we should extract this into a helper function.
2547                self.expect_keywords(&[VALUE, DECODING, ERRORS])?;
2548                let _ = self.consume_token(&Token::Eq);
2549                let open_inner = self.consume_token(&Token::LParen);
2550                let value_decode_err_policy =
2551                    self.parse_comma_separated(Parser::parse_source_error_policy_option)?;
2552                if open_inner {
2553                    self.expect_token(&Token::RParen)?;
2554                }
2555                self.expect_token(&Token::RParen)?;
2556                value_decode_err_policy
2557            } else {
2558                vec![]
2559            };
2560
2561            SourceEnvelope::Upsert {
2562                value_decode_err_policy,
2563            }
2564        } else if self.parse_keyword(MATERIALIZE) {
2565            SourceEnvelope::CdcV2
2566        } else {
2567            return self.expected(
2568                self.peek_pos(),
2569                "NONE, UPSERT, or MATERIALIZE",
2570                self.peek_token(),
2571            );
2572        };
2573        Ok(envelope)
2574    }
2575
2576    fn parse_sink_envelope(&mut self) -> Result<SinkEnvelope, ParserError> {
2577        if self.parse_keyword(UPSERT) {
2578            Ok(SinkEnvelope::Upsert)
2579        } else if self.parse_keyword(DEBEZIUM) {
2580            Ok(SinkEnvelope::Debezium)
2581        } else {
2582            self.expected(self.peek_pos(), "UPSERT, DEBEZIUM", self.peek_token())
2583        }
2584    }
2585
2586    fn parse_iceberg_sink_mode(&mut self) -> Result<IcebergSinkMode, ParserError> {
2587        if self.parse_keyword(UPSERT) {
2588            Ok(IcebergSinkMode::Upsert)
2589        } else if self.parse_keyword(APPEND) {
2590            Ok(IcebergSinkMode::Append)
2591        } else {
2592            self.expected(self.peek_pos(), "UPSERT, APPEND", self.peek_token())
2593        }
2594    }
2595
2596    /// Parse a `VALIDATE` statement
2597    fn parse_validate(&mut self) -> Result<Statement<Raw>, ParserError> {
2598        self.expect_keyword(CONNECTION)?;
2599        let name = self.parse_raw_name()?;
2600        Ok(Statement::ValidateConnection(ValidateConnectionStatement {
2601            name,
2602        }))
2603    }
2604
2605    fn parse_create_connection(&mut self) -> Result<Statement<Raw>, ParserError> {
2606        self.expect_keyword(CONNECTION)?;
2607        let if_not_exists = self.parse_if_not_exists()?;
2608        let name = self.parse_item_name()?;
2609        let expect_paren = match self.expect_one_of_keywords(&[FOR, TO])? {
2610            FOR => false,
2611            TO => true,
2612            _ => unreachable!(),
2613        };
2614        let connection_type = match self.expect_one_of_keywords(&[
2615            AWS, GCP, KAFKA, CONFLUENT, POSTGRES, SSH, SQL, MYSQL, ICEBERG,
2616        ])? {
2617            AWS => {
2618                if self.parse_keyword(PRIVATELINK) {
2619                    CreateConnectionType::AwsPrivatelink
2620                } else if self.parse_keyword(GLUE) {
2621                    self.expect_keywords(&[SCHEMA, REGISTRY])?;
2622                    CreateConnectionType::GlueSchemaRegistry
2623                } else {
2624                    CreateConnectionType::Aws
2625                }
2626            }
2627            GCP => CreateConnectionType::Gcp,
2628            KAFKA => CreateConnectionType::Kafka,
2629            CONFLUENT => {
2630                self.expect_keywords(&[SCHEMA, REGISTRY])?;
2631                CreateConnectionType::Csr
2632            }
2633            POSTGRES => CreateConnectionType::Postgres,
2634            SSH => {
2635                self.expect_keyword(TUNNEL)?;
2636                CreateConnectionType::Ssh
2637            }
2638            SQL => {
2639                self.expect_keyword(SERVER)?;
2640                CreateConnectionType::SqlServer
2641            }
2642            MYSQL => CreateConnectionType::MySql,
2643            ICEBERG => {
2644                self.expect_keyword(CATALOG)?;
2645                CreateConnectionType::IcebergCatalog
2646            }
2647            _ => unreachable!(),
2648        };
2649        if expect_paren {
2650            self.expect_token(&Token::LParen)?;
2651        }
2652        let values = self.parse_comma_separated(Parser::parse_connection_option_unified)?;
2653        if expect_paren {
2654            self.expect_token(&Token::RParen)?;
2655        }
2656
2657        let with_options = if self.parse_keyword(WITH) {
2658            self.expect_token(&Token::LParen)?;
2659            let options = self.parse_comma_separated(Parser::parse_create_connection_option)?;
2660            self.expect_token(&Token::RParen)?;
2661            options
2662        } else {
2663            vec![]
2664        };
2665
2666        Ok(Statement::CreateConnection(CreateConnectionStatement {
2667            name,
2668            connection_type,
2669            values,
2670            if_not_exists,
2671            with_options,
2672        }))
2673    }
2674
2675    fn parse_create_connection_option_name(
2676        &mut self,
2677    ) -> Result<CreateConnectionOptionName, ParserError> {
2678        let name = match self.expect_one_of_keywords(&[VALIDATE])? {
2679            VALIDATE => CreateConnectionOptionName::Validate,
2680            _ => unreachable!(),
2681        };
2682        Ok(name)
2683    }
2684
2685    /// Parses a single valid option in the WITH block of a create source
2686    fn parse_create_connection_option(
2687        &mut self,
2688    ) -> Result<CreateConnectionOption<Raw>, ParserError> {
2689        let name = self.parse_create_connection_option_name()?;
2690        Ok(CreateConnectionOption {
2691            name,
2692            value: self.parse_optional_option_value()?,
2693        })
2694    }
2695
2696    fn parse_default_aws_privatelink(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2697        let _ = self.consume_token(&Token::Eq);
2698        Ok(WithOptionValue::ConnectionAwsPrivatelink(
2699            self.parse_default_aws_privatelink_()?,
2700        ))
2701    }
2702
2703    fn parse_default_aws_privatelink_(
2704        &mut self,
2705    ) -> Result<ConnectionDefaultAwsPrivatelink<Raw>, ParserError> {
2706        let connection = self.parse_raw_name()?;
2707        let port = if self.consume_token(&Token::LParen) {
2708            self.expect_keyword(PORT)?;
2709            let pos = self.peek_pos();
2710            let Ok(port) = u16::try_from(self.parse_literal_int()?) else {
2711                return parser_err!(self, pos, "Could not parse value into port");
2712            };
2713            self.expect_token(&Token::RParen)?;
2714            Some(port)
2715        } else {
2716            None
2717        };
2718        Ok(ConnectionDefaultAwsPrivatelink { connection, port })
2719    }
2720
2721    /// This is just like 'parse_default_aws_privatelink_' except it supports more PrivateLink options.
2722    fn parse_aws_privatelink(&mut self) -> Result<KafkaBrokerAwsPrivatelink<Raw>, ParserError> {
2723        let connection = self.parse_raw_name()?;
2724        let options = if self.consume_token(&Token::LParen) {
2725            let options =
2726                self.parse_comma_separated(Parser::parse_kafka_broker_aws_privatelink_option)?;
2727            self.expect_token(&Token::RParen)?;
2728            options
2729        } else {
2730            vec![]
2731        };
2732        Ok(KafkaBrokerAwsPrivatelink {
2733            connection,
2734            options,
2735        })
2736    }
2737
2738    fn parse_connection_rule_pattern(&mut self) -> Result<ConnectionRulePattern, ParserError> {
2739        let s = self.parse_literal_string()?;
2740        let pos = self.peek_prev_pos();
2741        let mut prefix_wildcard = false;
2742        let mut suffix_wildcard = false;
2743        let mut remainder = &s[..];
2744
2745        if let Some(stripped) = remainder.strip_prefix('*') {
2746            prefix_wildcard = true;
2747            remainder = stripped;
2748        }
2749        if let Some(stripped) = remainder.strip_suffix('*') {
2750            suffix_wildcard = true;
2751            remainder = stripped;
2752        }
2753
2754        if remainder.contains('*') {
2755            return parser_err!(
2756                self,
2757                pos,
2758                "pattern may only contain `*` as a leading and/or trailing wildcard"
2759            );
2760        }
2761
2762        Ok(ConnectionRulePattern {
2763            prefix_wildcard,
2764            literal_match: remainder.to_owned(),
2765            suffix_wildcard,
2766        })
2767    }
2768
2769    fn parse_kafka_broker_or_matching_rule(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2770        if self.parse_keyword(MATCHING) {
2771            let pattern = self.parse_connection_rule_pattern()?;
2772            self.expect_keyword(USING)?;
2773            self.expect_keywords(&[AWS, PRIVATELINK])?;
2774            let tunnel = self.parse_aws_privatelink()?;
2775            Ok(WithOptionValue::KafkaMatchingBrokerRule(
2776                KafkaMatchingBrokerRule { pattern, tunnel },
2777            ))
2778        } else {
2779            self.parse_kafka_broker()
2780        }
2781    }
2782
2783    fn parse_kafka_broker(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2784        let _ = self.consume_token(&Token::Eq);
2785        let address = self.parse_literal_string()?;
2786        let tunnel = if self.parse_keyword(USING) {
2787            match self.expect_one_of_keywords(&[AWS, SSH])? {
2788                AWS => {
2789                    self.expect_keywords(&[PRIVATELINK])?;
2790                    KafkaBrokerTunnel::AwsPrivatelink(self.parse_aws_privatelink()?)
2791                }
2792                SSH => {
2793                    self.expect_keywords(&[TUNNEL])?;
2794                    KafkaBrokerTunnel::SshTunnel(self.parse_raw_name()?)
2795                }
2796                _ => unreachable!(),
2797            }
2798        } else {
2799            KafkaBrokerTunnel::Direct
2800        };
2801
2802        Ok(WithOptionValue::ConnectionKafkaBroker(KafkaBroker {
2803            address,
2804            tunnel,
2805        }))
2806    }
2807
2808    fn parse_kafka_broker_aws_privatelink_option(
2809        &mut self,
2810    ) -> Result<KafkaBrokerAwsPrivatelinkOption<Raw>, ParserError> {
2811        let name = match self.expect_one_of_keywords(&[AVAILABILITY, PORT])? {
2812            AVAILABILITY => {
2813                self.expect_keywords(&[ZONE])?;
2814                KafkaBrokerAwsPrivatelinkOptionName::AvailabilityZone
2815            }
2816            PORT => KafkaBrokerAwsPrivatelinkOptionName::Port,
2817            _ => unreachable!(),
2818        };
2819        let value = self.parse_optional_option_value()?;
2820        Ok(KafkaBrokerAwsPrivatelinkOption { name, value })
2821    }
2822
2823    fn parse_kafka_source_config_option(
2824        &mut self,
2825    ) -> Result<KafkaSourceConfigOption<Raw>, ParserError> {
2826        let name = match self.expect_one_of_keywords(&[GROUP, START, TOPIC])? {
2827            GROUP => {
2828                self.expect_keywords(&[ID, PREFIX])?;
2829                KafkaSourceConfigOptionName::GroupIdPrefix
2830            }
2831            START => match self.expect_one_of_keywords(&[OFFSET, TIMESTAMP])? {
2832                OFFSET => KafkaSourceConfigOptionName::StartOffset,
2833                TIMESTAMP => KafkaSourceConfigOptionName::StartTimestamp,
2834                _ => unreachable!(),
2835            },
2836            TOPIC => {
2837                if self.parse_keyword(METADATA) {
2838                    self.expect_keywords(&[REFRESH, INTERVAL])?;
2839                    KafkaSourceConfigOptionName::TopicMetadataRefreshInterval
2840                } else {
2841                    KafkaSourceConfigOptionName::Topic
2842                }
2843            }
2844            _ => unreachable!(),
2845        };
2846        Ok(KafkaSourceConfigOption {
2847            name,
2848            value: self.parse_optional_option_value()?,
2849        })
2850    }
2851
2852    fn parse_iceberg_sink_config_option(
2853        &mut self,
2854    ) -> Result<IcebergSinkConfigOption<Raw>, ParserError> {
2855        let name = match self.expect_one_of_keywords(&[NAMESPACE, TABLE])? {
2856            NAMESPACE => IcebergSinkConfigOptionName::Namespace,
2857            TABLE => IcebergSinkConfigOptionName::Table,
2858            _ => unreachable!(),
2859        };
2860        Ok(IcebergSinkConfigOption {
2861            name,
2862            value: self.parse_optional_option_value()?,
2863        })
2864    }
2865
2866    fn parse_kafka_sink_config_option(
2867        &mut self,
2868    ) -> Result<KafkaSinkConfigOption<Raw>, ParserError> {
2869        let name = match self.expect_one_of_keywords(&[
2870            COMPRESSION,
2871            PARTITION,
2872            PROGRESS,
2873            TOPIC,
2874            LEGACY,
2875            TRANSACTIONAL,
2876        ])? {
2877            COMPRESSION => {
2878                self.expect_keyword(TYPE)?;
2879                KafkaSinkConfigOptionName::CompressionType
2880            }
2881            PARTITION => {
2882                self.expect_keyword(BY)?;
2883                let _ = self.consume_token(&Token::Eq);
2884                return Ok(KafkaSinkConfigOption {
2885                    name: KafkaSinkConfigOptionName::PartitionBy,
2886                    value: Some(WithOptionValue::Expr(self.parse_expr()?)),
2887                });
2888            }
2889            PROGRESS => {
2890                self.expect_keywords(&[GROUP, ID, PREFIX])?;
2891                KafkaSinkConfigOptionName::ProgressGroupIdPrefix
2892            }
2893            TOPIC => {
2894                match self.parse_one_of_keywords(&[METADATA, PARTITION, REPLICATION, CONFIG]) {
2895                    None => KafkaSinkConfigOptionName::Topic,
2896                    Some(METADATA) => {
2897                        self.expect_keywords(&[REFRESH, INTERVAL])?;
2898                        KafkaSinkConfigOptionName::TopicMetadataRefreshInterval
2899                    }
2900                    Some(PARTITION) => {
2901                        self.expect_keyword(COUNT)?;
2902                        KafkaSinkConfigOptionName::TopicPartitionCount
2903                    }
2904                    Some(REPLICATION) => {
2905                        self.expect_keyword(FACTOR)?;
2906                        KafkaSinkConfigOptionName::TopicReplicationFactor
2907                    }
2908                    Some(CONFIG) => KafkaSinkConfigOptionName::TopicConfig,
2909                    Some(other) => {
2910                        return parser_err!(
2911                            self,
2912                            self.peek_prev_pos(),
2913                            "unexpected keyword {}",
2914                            other
2915                        );
2916                    }
2917                }
2918            }
2919            TRANSACTIONAL => {
2920                self.expect_keywords(&[ID, PREFIX])?;
2921                KafkaSinkConfigOptionName::TransactionalIdPrefix
2922            }
2923            LEGACY => {
2924                self.expect_keywords(&[IDS])?;
2925                KafkaSinkConfigOptionName::LegacyIds
2926            }
2927            _ => unreachable!(),
2928        };
2929        Ok(KafkaSinkConfigOption {
2930            name,
2931            value: self.parse_optional_option_value()?,
2932        })
2933    }
2934
2935    fn parse_connection_option_name(&mut self) -> Result<ConnectionOptionName, ParserError> {
2936        Ok(
2937            match self.expect_one_of_keywords(&[
2938                ACCESS,
2939                ASSUME,
2940                AVAILABILITY,
2941                AWS,
2942                BROKER,
2943                BROKERS,
2944                CATALOG,
2945                CREDENTIAL,
2946                DATABASE,
2947                ENDPOINT,
2948                GCP,
2949                HOST,
2950                PASSWORD,
2951                PORT,
2952                PUBLIC,
2953                PROGRESS,
2954                REGION,
2955                REGISTRY,
2956                SASL,
2957                SCOPE,
2958                SECRET,
2959                SECURITY,
2960                SERVICE,
2961                SESSION,
2962                SSH,
2963                SSL,
2964                URL,
2965                USER,
2966                USERNAME,
2967                WAREHOUSE,
2968            ])? {
2969                ACCESS => {
2970                    self.expect_keywords(&[KEY, ID])?;
2971                    ConnectionOptionName::AccessKeyId
2972                }
2973                ASSUME => {
2974                    self.expect_keyword(ROLE)?;
2975                    match self.expect_one_of_keywords(&[ARN, SESSION])? {
2976                        ARN => ConnectionOptionName::AssumeRoleArn,
2977                        SESSION => {
2978                            self.expect_keyword(NAME)?;
2979                            ConnectionOptionName::AssumeRoleSessionName
2980                        }
2981                        _ => unreachable!(),
2982                    }
2983                }
2984                AVAILABILITY => {
2985                    self.expect_keyword(ZONES)?;
2986                    ConnectionOptionName::AvailabilityZones
2987                }
2988                AWS => match self.expect_one_of_keywords(&[CONNECTION, PRIVATELINK])? {
2989                    CONNECTION => ConnectionOptionName::AwsConnection,
2990                    PRIVATELINK => ConnectionOptionName::AwsPrivatelink,
2991                    _ => unreachable!(),
2992                },
2993                BROKER => ConnectionOptionName::Broker,
2994                BROKERS => ConnectionOptionName::Brokers,
2995                CATALOG => {
2996                    self.expect_keyword(TYPE)?;
2997                    ConnectionOptionName::CatalogType
2998                }
2999                CREDENTIAL => ConnectionOptionName::Credential,
3000                DATABASE => ConnectionOptionName::Database,
3001                ENDPOINT => ConnectionOptionName::Endpoint,
3002                GCP => {
3003                    self.expect_keyword(CONNECTION)?;
3004                    ConnectionOptionName::GcpConnection
3005                }
3006                HOST => ConnectionOptionName::Host,
3007                PASSWORD => ConnectionOptionName::Password,
3008                PORT => ConnectionOptionName::Port,
3009                PUBLIC => {
3010                    self.expect_keyword(KEY)?;
3011                    match self.next_token() {
3012                        Some(Token::Number(n)) if n == "1" => ConnectionOptionName::PublicKey1,
3013                        Some(Token::Number(n)) if n == "2" => ConnectionOptionName::PublicKey2,
3014                        t => self.expected(self.peek_prev_pos(), "1 or 2 after PUBLIC KEY", t)?,
3015                    }
3016                }
3017                PROGRESS => {
3018                    self.expect_keyword(TOPIC)?;
3019                    match self.parse_keywords(&[REPLICATION, FACTOR]) {
3020                        true => ConnectionOptionName::ProgressTopicReplicationFactor,
3021                        false => ConnectionOptionName::ProgressTopic,
3022                    }
3023                }
3024                SECURITY => {
3025                    self.expect_keyword(PROTOCOL)?;
3026                    ConnectionOptionName::SecurityProtocol
3027                }
3028                REGION => ConnectionOptionName::Region,
3029                REGISTRY => ConnectionOptionName::Registry,
3030                SASL => match self.expect_one_of_keywords(&[MECHANISMS, PASSWORD, USERNAME])? {
3031                    MECHANISMS => ConnectionOptionName::SaslMechanisms,
3032                    PASSWORD => ConnectionOptionName::SaslPassword,
3033                    USERNAME => ConnectionOptionName::SaslUsername,
3034                    _ => unreachable!(),
3035                },
3036                SCOPE => ConnectionOptionName::Scope,
3037                SECRET => {
3038                    self.expect_keywords(&[ACCESS, KEY])?;
3039                    ConnectionOptionName::SecretAccessKey
3040                }
3041                SERVICE => match self.expect_one_of_keywords(&[ACCOUNT, NAME])? {
3042                    ACCOUNT => {
3043                        self.expect_keyword(KEY)?;
3044                        ConnectionOptionName::ServiceAccountKey
3045                    }
3046                    NAME => ConnectionOptionName::ServiceName,
3047                    _ => unreachable!(),
3048                },
3049                SESSION => {
3050                    self.expect_keyword(TOKEN)?;
3051                    ConnectionOptionName::SessionToken
3052                }
3053                SSH => {
3054                    self.expect_keyword(TUNNEL)?;
3055                    ConnectionOptionName::SshTunnel
3056                }
3057                SSL => match self.expect_one_of_keywords(&[CERTIFICATE, MODE, KEY])? {
3058                    CERTIFICATE => {
3059                        if self.parse_keyword(AUTHORITY) {
3060                            ConnectionOptionName::SslCertificateAuthority
3061                        } else {
3062                            ConnectionOptionName::SslCertificate
3063                        }
3064                    }
3065                    KEY => ConnectionOptionName::SslKey,
3066                    MODE => ConnectionOptionName::SslMode,
3067                    _ => unreachable!(),
3068                },
3069                URL => ConnectionOptionName::Url,
3070                // TYPE => ConnectionOptionName::CatalogType,
3071                WAREHOUSE => ConnectionOptionName::Warehouse,
3072                USER | USERNAME => ConnectionOptionName::User,
3073                _ => unreachable!(),
3074            },
3075        )
3076    }
3077
3078    fn parse_connection_option_unified(&mut self) -> Result<ConnectionOption<Raw>, ParserError> {
3079        let name = self.parse_connection_option_name()?;
3080        let value = match name {
3081            ConnectionOptionName::AwsConnection => Some(self.parse_object_option_value()?),
3082            ConnectionOptionName::AwsPrivatelink => Some(self.parse_default_aws_privatelink()?),
3083            ConnectionOptionName::Broker => Some(self.parse_kafka_broker()?),
3084            ConnectionOptionName::Brokers => Some(WithOptionValue::Sequence(
3085                self.parse_list_value(Parser::parse_kafka_broker_or_matching_rule)?,
3086            )),
3087            ConnectionOptionName::GcpConnection => Some(self.parse_object_option_value()?),
3088            ConnectionOptionName::SshTunnel => Some(self.parse_object_option_value()?),
3089            _ if name.value_contains_sensitive_data() => {
3090                self.parse_optional_connection_credential_option_value()?
3091            }
3092            _ => self.parse_optional_option_value()?,
3093        };
3094        Ok(ConnectionOption { name, value })
3095    }
3096
3097    fn parse_create_subsource(&mut self) -> Result<Statement<Raw>, ParserError> {
3098        self.expect_keyword(SUBSOURCE)?;
3099        let if_not_exists = self.parse_if_not_exists()?;
3100        let name = self.parse_item_name()?;
3101
3102        let (columns, constraints) = self.parse_columns(Mandatory)?;
3103
3104        let of_source = if self.parse_keyword(OF) {
3105            self.expect_keyword(SOURCE)?;
3106            Some(self.parse_raw_name()?)
3107        } else {
3108            None
3109        };
3110
3111        let with_options = if self.parse_keyword(WITH) {
3112            self.expect_token(&Token::LParen)?;
3113            let options = self.parse_comma_separated(Parser::parse_create_subsource_option)?;
3114            self.expect_token(&Token::RParen)?;
3115            options
3116        } else {
3117            vec![]
3118        };
3119
3120        Ok(Statement::CreateSubsource(CreateSubsourceStatement {
3121            name,
3122            if_not_exists,
3123            columns,
3124            of_source,
3125            constraints,
3126            with_options,
3127        }))
3128    }
3129
3130    fn parse_create_subsource_option(&mut self) -> Result<CreateSubsourceOption<Raw>, ParserError> {
3131        let option = match self
3132            .expect_one_of_keywords(&[EXTERNAL, PROGRESS, TEXT, EXCLUDE, IGNORE, DETAILS, RETAIN])?
3133        {
3134            EXTERNAL => {
3135                self.expect_keyword(REFERENCE)?;
3136                CreateSubsourceOption {
3137                    name: CreateSubsourceOptionName::ExternalReference,
3138                    value: self.parse_optional_option_value()?,
3139                }
3140            }
3141            PROGRESS => CreateSubsourceOption {
3142                name: CreateSubsourceOptionName::Progress,
3143                value: self.parse_optional_option_value()?,
3144            },
3145            ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
3146                self.expect_keyword(COLUMNS)?;
3147
3148                let _ = self.consume_token(&Token::Eq);
3149
3150                let value = self
3151                    .parse_option_sequence(Parser::parse_identifier)?
3152                    .map(|inner| {
3153                        WithOptionValue::Sequence(
3154                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
3155                        )
3156                    });
3157
3158                CreateSubsourceOption {
3159                    name: match *keyword {
3160                        TEXT => CreateSubsourceOptionName::TextColumns,
3161                        // IGNORE is historical syntax for this option.
3162                        EXCLUDE | IGNORE => CreateSubsourceOptionName::ExcludeColumns,
3163                        _ => unreachable!(),
3164                    },
3165                    value,
3166                }
3167            }
3168            DETAILS => CreateSubsourceOption {
3169                name: CreateSubsourceOptionName::Details,
3170                value: self.parse_optional_option_value()?,
3171            },
3172            RETAIN => {
3173                self.expect_keyword(HISTORY)?;
3174                CreateSubsourceOption {
3175                    name: CreateSubsourceOptionName::RetainHistory,
3176                    value: self.parse_option_retain_history()?,
3177                }
3178            }
3179            _ => unreachable!(),
3180        };
3181        Ok(option)
3182    }
3183
3184    fn parse_create_source(&mut self) -> Result<Statement<Raw>, ParserError> {
3185        self.expect_keyword(SOURCE)?;
3186        let if_not_exists = self.parse_if_not_exists()?;
3187        let name = self.parse_item_name()?;
3188
3189        let (col_names, key_constraint) = self.parse_source_columns()?;
3190
3191        let in_cluster = self.parse_optional_in_cluster()?;
3192        self.expect_keyword(FROM)?;
3193
3194        // Webhook Source, which works differently than all other sources.
3195        if self.parse_keyword(WEBHOOK) {
3196            return self.parse_create_webhook_source(name, if_not_exists, in_cluster, false);
3197        }
3198
3199        let connection = self.parse_create_source_connection()?;
3200        let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
3201            Some(KEY) => {
3202                self.expect_keyword(FORMAT)?;
3203                let key = self.parse_format()?;
3204                self.expect_keywords(&[VALUE, FORMAT])?;
3205                let value = self.parse_format()?;
3206                Some(FormatSpecifier::KeyValue { key, value })
3207            }
3208            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3209            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3210            None => None,
3211        };
3212        let include_metadata = self.parse_source_include_metadata()?;
3213
3214        let envelope = if self.parse_keyword(ENVELOPE) {
3215            Some(self.parse_source_envelope()?)
3216        } else {
3217            None
3218        };
3219
3220        let referenced_subsources = if self.parse_keywords(&[FOR, TABLES]) {
3221            self.expect_token(&Token::LParen)?;
3222            let subsources = self.parse_comma_separated(Parser::parse_subsource_references)?;
3223            self.expect_token(&Token::RParen)?;
3224            Some(ExternalReferences::SubsetTables(subsources))
3225        } else if self.parse_keywords(&[FOR, SCHEMAS]) {
3226            self.expect_token(&Token::LParen)?;
3227            let schemas = self.parse_comma_separated(Parser::parse_identifier)?;
3228            self.expect_token(&Token::RParen)?;
3229            Some(ExternalReferences::SubsetSchemas(schemas))
3230        } else if self.parse_keywords(&[FOR, ALL, TABLES]) {
3231            Some(ExternalReferences::All)
3232        } else {
3233            None
3234        };
3235
3236        let progress_subsource = if self.parse_keywords(&[EXPOSE, PROGRESS, AS]) {
3237            Some(self.parse_deferred_item_name()?)
3238        } else {
3239            None
3240        };
3241
3242        // New WITH block
3243        let with_options = if self.parse_keyword(WITH) {
3244            self.expect_token(&Token::LParen)?;
3245            let options = self.parse_comma_separated(Parser::parse_source_option)?;
3246            self.expect_token(&Token::RParen)?;
3247            options
3248        } else {
3249            vec![]
3250        };
3251
3252        Ok(Statement::CreateSource(CreateSourceStatement {
3253            name,
3254            in_cluster,
3255            col_names,
3256            connection,
3257            format,
3258            include_metadata,
3259            envelope,
3260            if_not_exists,
3261            key_constraint,
3262            external_references: referenced_subsources,
3263            progress_subsource,
3264            with_options,
3265        }))
3266    }
3267
3268    fn parse_subsource_references(&mut self) -> Result<ExternalReferenceExport, ParserError> {
3269        let reference = self.parse_item_name()?;
3270        let subsource = if self.parse_one_of_keywords(&[AS, INTO]).is_some() {
3271            Some(self.parse_item_name()?)
3272        } else {
3273            None
3274        };
3275
3276        Ok(ExternalReferenceExport {
3277            reference,
3278            alias: subsource,
3279        })
3280    }
3281
3282    /// Parses the column section of a CREATE SOURCE statement which can be
3283    /// empty or a comma-separated list of column identifiers and a single key
3284    /// constraint, e.g.
3285    ///
3286    /// (col_0, col_i, ..., col_n, key_constraint)
3287    fn parse_source_columns(&mut self) -> Result<(Vec<Ident>, Option<KeyConstraint>), ParserError> {
3288        if self.consume_token(&Token::LParen) {
3289            let mut columns = vec![];
3290            let mut key_constraints = vec![];
3291            loop {
3292                let pos = self.peek_pos();
3293                if let Some(key_constraint) = self.parse_key_constraint()? {
3294                    if !key_constraints.is_empty() {
3295                        return parser_err!(self, pos, "Multiple key constraints not allowed");
3296                    }
3297                    key_constraints.push(key_constraint);
3298                } else {
3299                    columns.push(self.parse_identifier()?);
3300                }
3301                if !self.consume_token(&Token::Comma) {
3302                    break;
3303                }
3304            }
3305            self.expect_token(&Token::RParen)?;
3306            Ok((columns, key_constraints.into_iter().next()))
3307        } else {
3308            Ok((vec![], None))
3309        }
3310    }
3311
3312    /// Parses a key constraint.
3313    fn parse_key_constraint(&mut self) -> Result<Option<KeyConstraint>, ParserError> {
3314        // PRIMARY KEY (col_1, ..., col_n) NOT ENFORCED
3315        if self.parse_keywords(&[PRIMARY, KEY]) {
3316            let columns = self.parse_parenthesized_column_list(Mandatory)?;
3317            self.expect_keywords(&[NOT, ENFORCED])?;
3318            Ok(Some(KeyConstraint::PrimaryKeyNotEnforced { columns }))
3319        } else {
3320            Ok(None)
3321        }
3322    }
3323
3324    fn parse_source_option_name(&mut self) -> Result<CreateSourceOptionName, ParserError> {
3325        let name = match self.expect_one_of_keywords(&[TIMESTAMP, RETAIN])? {
3326            TIMESTAMP => {
3327                self.expect_keyword(INTERVAL)?;
3328                CreateSourceOptionName::TimestampInterval
3329            }
3330            RETAIN => {
3331                self.expect_keyword(HISTORY)?;
3332                CreateSourceOptionName::RetainHistory
3333            }
3334            _ => unreachable!(),
3335        };
3336        Ok(name)
3337    }
3338
3339    /// Parses a single valid option in the WITH block of a create source
3340    fn parse_source_option(&mut self) -> Result<CreateSourceOption<Raw>, ParserError> {
3341        let name = self.parse_source_option_name()?;
3342        if name == CreateSourceOptionName::RetainHistory {
3343            let _ = self.consume_token(&Token::Eq);
3344            return Ok(CreateSourceOption {
3345                name,
3346                value: self.parse_option_retain_history()?,
3347            });
3348        }
3349        Ok(CreateSourceOption {
3350            name,
3351            value: self.parse_optional_option_value()?,
3352        })
3353    }
3354
3355    fn parse_create_webhook_source(
3356        &mut self,
3357        name: UnresolvedItemName,
3358        if_not_exists: bool,
3359        in_cluster: Option<RawClusterName>,
3360        is_table: bool,
3361    ) -> Result<Statement<Raw>, ParserError> {
3362        self.expect_keywords(&[BODY, FORMAT])?;
3363
3364        // Note: we don't use `parse_format()` here because we support fewer formats than other
3365        // sources, and the user gets better errors if we reject the formats here.
3366        let body_format = match self.expect_one_of_keywords(&[JSON, TEXT, BYTES])? {
3367            JSON => {
3368                let array = self.parse_keyword(ARRAY);
3369                Format::Json { array }
3370            }
3371            TEXT => Format::Text,
3372            BYTES => Format::Bytes,
3373            _ => unreachable!(),
3374        };
3375
3376        let mut include_headers = CreateWebhookSourceIncludeHeaders::default();
3377        while self.parse_keyword(INCLUDE) {
3378            match self.expect_one_of_keywords(&[HEADER, HEADERS])? {
3379                HEADER => {
3380                    let header_name = self.parse_literal_string()?;
3381                    self.expect_keyword(AS)?;
3382                    let column_name = self.parse_identifier()?;
3383                    let use_bytes = self.parse_keyword(BYTES);
3384
3385                    include_headers.mappings.push(CreateWebhookSourceMapHeader {
3386                        header_name,
3387                        column_name,
3388                        use_bytes,
3389                    });
3390                }
3391                HEADERS => {
3392                    let header_filters = include_headers.column.get_or_insert_with(Vec::default);
3393                    if self.consume_token(&Token::LParen) {
3394                        let filters = self.parse_comma_separated(|f| {
3395                            let block = f.parse_keyword(NOT);
3396                            let header_name = f.parse_literal_string()?;
3397                            Ok(CreateWebhookSourceFilterHeader { block, header_name })
3398                        })?;
3399                        header_filters.extend(filters);
3400
3401                        self.expect_token(&Token::RParen)?;
3402                    }
3403                }
3404                k => unreachable!("programming error, didn't expect {k}"),
3405            }
3406        }
3407
3408        let validate_using = if self.parse_keyword(CHECK) {
3409            self.expect_token(&Token::LParen)?;
3410
3411            let options = if self.parse_keyword(WITH) {
3412                self.expect_token(&Token::LParen)?;
3413                let options = self.parse_create_webhook_check_options()?;
3414                self.expect_token(&Token::RParen)?;
3415
3416                Some(options)
3417            } else {
3418                None
3419            };
3420
3421            let using = self.parse_expr()?;
3422            self.expect_token(&Token::RParen)?;
3423
3424            Some(CreateWebhookSourceCheck { options, using })
3425        } else {
3426            None
3427        };
3428
3429        Ok(Statement::CreateWebhookSource(
3430            CreateWebhookSourceStatement {
3431                name,
3432                is_table,
3433                if_not_exists,
3434                body_format,
3435                include_headers,
3436                validate_using,
3437                in_cluster,
3438            },
3439        ))
3440    }
3441
3442    fn parse_create_webhook_check_options(
3443        &mut self,
3444    ) -> Result<CreateWebhookSourceCheckOptions<Raw>, ParserError> {
3445        let mut secrets = vec![];
3446        let mut headers = vec![];
3447        let mut bodies = vec![];
3448
3449        fn parse_alias(parser: &mut Parser<'_>) -> Result<Option<Ident>, ParserError> {
3450            parser
3451                .parse_keyword(AS)
3452                .then(|| parser.parse_identifier())
3453                .transpose()
3454        }
3455
3456        self.parse_comma_separated(|f| {
3457            match f.expect_one_of_keywords(&[SECRET, HEADERS, BODY])? {
3458                SECRET => {
3459                    let secret = f.parse_raw_name()?;
3460                    let alias = parse_alias(f)?;
3461                    let use_bytes = f.parse_keyword(Keyword::Bytes);
3462
3463                    secrets.push(CreateWebhookSourceSecret {
3464                        secret,
3465                        alias,
3466                        use_bytes,
3467                    });
3468
3469                    Ok(())
3470                }
3471                HEADERS => {
3472                    // TODO(parkmycar): Support filtering down to specific headers.
3473                    let alias = parse_alias(f)?;
3474                    let use_bytes = f.parse_keyword(Keyword::Bytes);
3475                    headers.push(CreateWebhookSourceHeader { alias, use_bytes });
3476
3477                    Ok(())
3478                }
3479                BODY => {
3480                    let alias = parse_alias(f)?;
3481                    let use_bytes = f.parse_keyword(Keyword::Bytes);
3482                    bodies.push(CreateWebhookSourceBody { alias, use_bytes });
3483
3484                    Ok(())
3485                }
3486                k => unreachable!("Unexpected keyword! {k}"),
3487            }
3488        })?;
3489
3490        Ok(CreateWebhookSourceCheckOptions {
3491            secrets,
3492            headers,
3493            bodies,
3494        })
3495    }
3496
3497    fn parse_create_iceberg_sink(
3498        &mut self,
3499        name: Option<UnresolvedItemName>,
3500        in_cluster: Option<RawClusterName>,
3501        from: RawItemName,
3502        if_not_exists: bool,
3503        connection: CreateSinkConnection<Raw>,
3504    ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3505        let mode = if self.parse_keyword(MODE) {
3506            Some(self.parse_iceberg_sink_mode()?)
3507        } else {
3508            None
3509        };
3510
3511        let with_options = if self.parse_keyword(WITH) {
3512            self.expect_token(&Token::LParen)?;
3513            let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3514            self.expect_token(&Token::RParen)?;
3515            options
3516        } else {
3517            vec![]
3518        };
3519
3520        Ok(CreateSinkStatement {
3521            name,
3522            in_cluster,
3523            from,
3524            connection,
3525            format: None,
3526            envelope: None,
3527            mode,
3528            if_not_exists,
3529            with_options,
3530        })
3531    }
3532
3533    fn parse_create_kafka_sink(
3534        &mut self,
3535        name: Option<UnresolvedItemName>,
3536        in_cluster: Option<RawClusterName>,
3537        from: RawItemName,
3538        if_not_exists: bool,
3539        connection: CreateSinkConnection<Raw>,
3540    ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3541        let format = match &self.parse_one_of_keywords(&[KEY, FORMAT]) {
3542            Some(KEY) => {
3543                self.expect_keyword(FORMAT)?;
3544                let key = self.parse_format()?;
3545                self.expect_keywords(&[VALUE, FORMAT])?;
3546                let value = self.parse_format()?;
3547                Some(FormatSpecifier::KeyValue { key, value })
3548            }
3549            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3550            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3551            None => None,
3552        };
3553        let envelope = if self.parse_keyword(ENVELOPE) {
3554            Some(self.parse_sink_envelope()?)
3555        } else {
3556            None
3557        };
3558
3559        let with_options = if self.parse_keyword(WITH) {
3560            self.expect_token(&Token::LParen)?;
3561            let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3562            self.expect_token(&Token::RParen)?;
3563            options
3564        } else {
3565            vec![]
3566        };
3567
3568        Ok(CreateSinkStatement {
3569            name,
3570            in_cluster,
3571            from,
3572            connection,
3573            format,
3574            envelope,
3575            mode: None,
3576            if_not_exists,
3577            with_options,
3578        })
3579    }
3580
3581    fn parse_create_sink(&mut self) -> Result<Statement<Raw>, ParserError> {
3582        self.expect_keyword(SINK)?;
3583        let if_not_exists = self.parse_if_not_exists()?;
3584
3585        let mut name = Some(self.parse_item_name()?);
3586
3587        // Sniff out `CREATE SINK IN CLUSTER <c> ...` and `CREATE SINK FROM
3588        // <view>...`  and ensure they are parsed as nameless `CREATE SINK`
3589        // commands.
3590        //
3591        // This is a bit gross, but we didn't have the foresight to make
3592        // `IN` and `FROM` reserved keywords for sink names.
3593        if (name == Some(UnresolvedItemName::unqualified(ident!("in")))
3594            && self.peek_keyword(CLUSTER))
3595            || (name == Some(UnresolvedItemName::unqualified(ident!("from")))
3596                && !self.peek_keyword(FROM))
3597        {
3598            name = None;
3599            self.prev_token();
3600        }
3601
3602        let in_cluster = self.parse_optional_in_cluster()?;
3603        self.expect_keyword(FROM)?;
3604        let from = self.parse_raw_name()?;
3605        self.expect_keyword(INTO)?;
3606        let connection = self.parse_create_sink_connection()?;
3607
3608        let statement = match connection {
3609            conn @ CreateSinkConnection::Kafka { .. } => {
3610                self.parse_create_kafka_sink(name, in_cluster, from, if_not_exists, conn)
3611            }
3612            conn @ CreateSinkConnection::Iceberg { .. } => {
3613                self.parse_create_iceberg_sink(name, in_cluster, from, if_not_exists, conn)
3614            }
3615        }?;
3616
3617        Ok(Statement::CreateSink(statement))
3618    }
3619
3620    /// Parse the name of a CREATE SINK optional parameter
3621    fn parse_create_sink_option_name(&mut self) -> Result<CreateSinkOptionName, ParserError> {
3622        let name = match self.expect_one_of_keywords(&[PARTITION, SNAPSHOT, VERSION, COMMIT])? {
3623            SNAPSHOT => CreateSinkOptionName::Snapshot,
3624            VERSION => CreateSinkOptionName::Version,
3625            PARTITION => {
3626                self.expect_keyword(STRATEGY)?;
3627                CreateSinkOptionName::PartitionStrategy
3628            }
3629            COMMIT => {
3630                self.expect_keyword(INTERVAL)?;
3631                CreateSinkOptionName::CommitInterval
3632            }
3633            _ => unreachable!(),
3634        };
3635        Ok(name)
3636    }
3637
3638    /// Parse a NAME = VALUE parameter for CREATE SINK
3639    fn parse_create_sink_option(&mut self) -> Result<CreateSinkOption<Raw>, ParserError> {
3640        Ok(CreateSinkOption {
3641            name: self.parse_create_sink_option_name()?,
3642            value: self.parse_optional_option_value()?,
3643        })
3644    }
3645
3646    fn parse_create_source_connection(
3647        &mut self,
3648    ) -> Result<CreateSourceConnection<Raw>, ParserError> {
3649        match self.expect_one_of_keywords(&[KAFKA, POSTGRES, SQL, MYSQL, LOAD])? {
3650            POSTGRES => {
3651                self.expect_keyword(CONNECTION)?;
3652                let connection = self.parse_raw_name()?;
3653
3654                let options = if self.consume_token(&Token::LParen) {
3655                    let options = self.parse_comma_separated(Parser::parse_pg_connection_option)?;
3656                    self.expect_token(&Token::RParen)?;
3657                    options
3658                } else {
3659                    vec![]
3660                };
3661
3662                Ok(CreateSourceConnection::Postgres {
3663                    connection,
3664                    options,
3665                })
3666            }
3667            SQL => {
3668                self.expect_keywords(&[SERVER, CONNECTION])?;
3669                let connection = self.parse_raw_name()?;
3670
3671                let options = if self.consume_token(&Token::LParen) {
3672                    let options =
3673                        self.parse_comma_separated(Parser::parse_sql_server_connection_option)?;
3674                    self.expect_token(&Token::RParen)?;
3675                    options
3676                } else {
3677                    vec![]
3678                };
3679
3680                Ok(CreateSourceConnection::SqlServer {
3681                    connection,
3682                    options,
3683                })
3684            }
3685            MYSQL => {
3686                self.expect_keyword(CONNECTION)?;
3687                let connection = self.parse_raw_name()?;
3688
3689                let options = if self.consume_token(&Token::LParen) {
3690                    let options =
3691                        self.parse_comma_separated(Parser::parse_mysql_connection_option)?;
3692                    self.expect_token(&Token::RParen)?;
3693                    options
3694                } else {
3695                    vec![]
3696                };
3697
3698                Ok(CreateSourceConnection::MySql {
3699                    connection,
3700                    options,
3701                })
3702            }
3703            KAFKA => {
3704                self.expect_keyword(CONNECTION)?;
3705                let connection = self.parse_raw_name()?;
3706
3707                let options = if self.consume_token(&Token::LParen) {
3708                    let options =
3709                        self.parse_comma_separated(Parser::parse_kafka_source_config_option)?;
3710                    self.expect_token(&Token::RParen)?;
3711                    options
3712                } else {
3713                    vec![]
3714                };
3715
3716                Ok(CreateSourceConnection::Kafka {
3717                    connection,
3718                    options,
3719                })
3720            }
3721            LOAD => {
3722                self.expect_keyword(GENERATOR)?;
3723                let generator = match self.expect_one_of_keywords(&[
3724                    CLOCK, COUNTER, MARKETING, AUCTION, TPCH, DATUMS, KEY,
3725                ])? {
3726                    CLOCK => LoadGenerator::Clock,
3727                    COUNTER => LoadGenerator::Counter,
3728                    AUCTION => LoadGenerator::Auction,
3729                    TPCH => LoadGenerator::Tpch,
3730                    DATUMS => LoadGenerator::Datums,
3731                    MARKETING => LoadGenerator::Marketing,
3732                    KEY => {
3733                        self.expect_keyword(VALUE)?;
3734                        LoadGenerator::KeyValue
3735                    }
3736                    _ => unreachable!(),
3737                };
3738                let options = if self.consume_token(&Token::LParen) {
3739                    let options =
3740                        self.parse_comma_separated(Parser::parse_load_generator_option)?;
3741                    self.expect_token(&Token::RParen)?;
3742                    options
3743                } else {
3744                    vec![]
3745                };
3746                Ok(CreateSourceConnection::LoadGenerator { generator, options })
3747            }
3748            _ => unreachable!(),
3749        }
3750    }
3751
3752    fn parse_pg_connection_option(&mut self) -> Result<PgConfigOption<Raw>, ParserError> {
3753        let name = match self.expect_one_of_keywords(&[DETAILS, PUBLICATION, TEXT, EXCLUDE])? {
3754            DETAILS => PgConfigOptionName::Details,
3755            PUBLICATION => PgConfigOptionName::Publication,
3756            TEXT => {
3757                self.expect_keyword(COLUMNS)?;
3758
3759                let _ = self.consume_token(&Token::Eq);
3760
3761                let value = self
3762                    .parse_option_sequence(Parser::parse_item_name)?
3763                    .map(|inner| {
3764                        WithOptionValue::Sequence(
3765                            inner
3766                                .into_iter()
3767                                .map(WithOptionValue::UnresolvedItemName)
3768                                .collect_vec(),
3769                        )
3770                    });
3771
3772                return Ok(PgConfigOption {
3773                    name: PgConfigOptionName::TextColumns,
3774                    value,
3775                });
3776            }
3777            EXCLUDE => {
3778                self.expect_keyword(COLUMNS)?;
3779
3780                let _ = self.consume_token(&Token::Eq);
3781
3782                let value = self
3783                    .parse_option_sequence(Parser::parse_item_name)?
3784                    .map(|inner| {
3785                        WithOptionValue::Sequence(
3786                            inner
3787                                .into_iter()
3788                                .map(WithOptionValue::UnresolvedItemName)
3789                                .collect_vec(),
3790                        )
3791                    });
3792
3793                return Ok(PgConfigOption {
3794                    name: PgConfigOptionName::ExcludeColumns,
3795                    value,
3796                });
3797            }
3798            _ => unreachable!(),
3799        };
3800        Ok(PgConfigOption {
3801            name,
3802            value: self.parse_optional_option_value()?,
3803        })
3804    }
3805
3806    fn parse_mysql_connection_option(&mut self) -> Result<MySqlConfigOption<Raw>, ParserError> {
3807        match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE, IGNORE])? {
3808            DETAILS => Ok(MySqlConfigOption {
3809                name: MySqlConfigOptionName::Details,
3810                value: self.parse_optional_option_value()?,
3811            }),
3812            TEXT => {
3813                self.expect_keyword(COLUMNS)?;
3814
3815                let _ = self.consume_token(&Token::Eq);
3816
3817                let value = self
3818                    .parse_option_sequence(Parser::parse_item_name)?
3819                    .map(|inner| {
3820                        WithOptionValue::Sequence(
3821                            inner
3822                                .into_iter()
3823                                .map(WithOptionValue::UnresolvedItemName)
3824                                .collect_vec(),
3825                        )
3826                    });
3827
3828                Ok(MySqlConfigOption {
3829                    name: MySqlConfigOptionName::TextColumns,
3830                    value,
3831                })
3832            }
3833            // IGNORE is historical syntax for the option.
3834            EXCLUDE | IGNORE => {
3835                self.expect_keyword(COLUMNS)?;
3836
3837                let _ = self.consume_token(&Token::Eq);
3838
3839                let value = self
3840                    .parse_option_sequence(Parser::parse_item_name)?
3841                    .map(|inner| {
3842                        WithOptionValue::Sequence(
3843                            inner
3844                                .into_iter()
3845                                .map(WithOptionValue::UnresolvedItemName)
3846                                .collect_vec(),
3847                        )
3848                    });
3849
3850                Ok(MySqlConfigOption {
3851                    name: MySqlConfigOptionName::ExcludeColumns,
3852                    value,
3853                })
3854            }
3855            _ => unreachable!(),
3856        }
3857    }
3858
3859    fn parse_sql_server_connection_option(
3860        &mut self,
3861    ) -> Result<SqlServerConfigOption<Raw>, ParserError> {
3862        match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE])? {
3863            DETAILS => Ok(SqlServerConfigOption {
3864                name: SqlServerConfigOptionName::Details,
3865                value: self.parse_optional_option_value()?,
3866            }),
3867            TEXT => {
3868                self.expect_keyword(COLUMNS)?;
3869
3870                let _ = self.consume_token(&Token::Eq);
3871
3872                let value = self
3873                    .parse_option_sequence(Parser::parse_item_name)?
3874                    .map(|inner| {
3875                        WithOptionValue::Sequence(
3876                            inner
3877                                .into_iter()
3878                                .map(WithOptionValue::UnresolvedItemName)
3879                                .collect_vec(),
3880                        )
3881                    });
3882
3883                Ok(SqlServerConfigOption {
3884                    name: SqlServerConfigOptionName::TextColumns,
3885                    value,
3886                })
3887            }
3888            EXCLUDE => {
3889                self.expect_keyword(COLUMNS)?;
3890
3891                let _ = self.consume_token(&Token::Eq);
3892
3893                let value = self
3894                    .parse_option_sequence(Parser::parse_item_name)?
3895                    .map(|inner| {
3896                        WithOptionValue::Sequence(
3897                            inner
3898                                .into_iter()
3899                                .map(WithOptionValue::UnresolvedItemName)
3900                                .collect_vec(),
3901                        )
3902                    });
3903
3904                Ok(SqlServerConfigOption {
3905                    name: SqlServerConfigOptionName::ExcludeColumns,
3906                    value,
3907                })
3908            }
3909            _ => unreachable!(),
3910        }
3911    }
3912
3913    fn parse_load_generator_option(&mut self) -> Result<LoadGeneratorOption<Raw>, ParserError> {
3914        let name = match self.expect_one_of_keywords(&[
3915            AS,
3916            UP,
3917            SCALE,
3918            TICK,
3919            MAX,
3920            KEYS,
3921            SNAPSHOT,
3922            TRANSACTIONAL,
3923            VALUE,
3924            SEED,
3925            PARTITIONS,
3926            BATCH,
3927        ])? {
3928            AS => {
3929                self.expect_keyword(OF)?;
3930                LoadGeneratorOptionName::AsOf
3931            }
3932            UP => {
3933                self.expect_keyword(TO)?;
3934                LoadGeneratorOptionName::UpTo
3935            }
3936            SCALE => {
3937                self.expect_keyword(FACTOR)?;
3938                LoadGeneratorOptionName::ScaleFactor
3939            }
3940            TICK => {
3941                self.expect_keyword(INTERVAL)?;
3942                LoadGeneratorOptionName::TickInterval
3943            }
3944            MAX => {
3945                self.expect_keyword(CARDINALITY)?;
3946                LoadGeneratorOptionName::MaxCardinality
3947            }
3948            KEYS => LoadGeneratorOptionName::Keys,
3949            SNAPSHOT => {
3950                self.expect_keyword(ROUNDS)?;
3951                LoadGeneratorOptionName::SnapshotRounds
3952            }
3953            TRANSACTIONAL => {
3954                self.expect_keyword(SNAPSHOT)?;
3955                LoadGeneratorOptionName::TransactionalSnapshot
3956            }
3957            VALUE => {
3958                self.expect_keyword(SIZE)?;
3959                LoadGeneratorOptionName::ValueSize
3960            }
3961            SEED => LoadGeneratorOptionName::Seed,
3962            PARTITIONS => LoadGeneratorOptionName::Partitions,
3963            BATCH => {
3964                self.expect_keyword(SIZE)?;
3965                LoadGeneratorOptionName::BatchSize
3966            }
3967            _ => unreachable!(),
3968        };
3969
3970        let _ = self.consume_token(&Token::Eq);
3971        Ok(LoadGeneratorOption {
3972            name,
3973            value: self.parse_optional_option_value()?,
3974        })
3975    }
3976
3977    fn parse_create_kafka_sink_connection(
3978        &mut self,
3979    ) -> Result<CreateSinkConnection<Raw>, ParserError> {
3980        self.expect_keyword(CONNECTION)?;
3981
3982        let connection = self.parse_raw_name()?;
3983
3984        let options = if self.consume_token(&Token::LParen) {
3985            let options = self.parse_comma_separated(Parser::parse_kafka_sink_config_option)?;
3986            self.expect_token(&Token::RParen)?;
3987            options
3988        } else {
3989            vec![]
3990        };
3991
3992        // one token of lookahead:
3993        // * `KEY (` means we're parsing a list of columns for the key
3994        // * `KEY FORMAT` means there is no key, we'll parse a KeyValueFormat later
3995        let key =
3996            if self.peek_keyword(KEY) && self.peek_nth_token(1) != Some(Token::Keyword(FORMAT)) {
3997                let _ = self.expect_keyword(KEY);
3998                let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
3999
4000                let not_enforced = if self.peek_keywords(&[NOT, ENFORCED]) {
4001                    self.expect_keywords(&[NOT, ENFORCED])?;
4002                    true
4003                } else {
4004                    false
4005                };
4006                Some(SinkKey {
4007                    key_columns,
4008                    not_enforced,
4009                })
4010            } else {
4011                None
4012            };
4013
4014        let headers = if self.parse_keyword(HEADERS) {
4015            Some(self.parse_identifier()?)
4016        } else {
4017            None
4018        };
4019
4020        Ok(CreateSinkConnection::Kafka {
4021            connection,
4022            options,
4023            key,
4024            headers,
4025        })
4026    }
4027
4028    fn parse_create_iceberg_sink_connection(
4029        &mut self,
4030    ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4031        self.expect_keyword(CONNECTION)?;
4032        let catalog_connection = self.parse_raw_name()?;
4033
4034        let options = if self.consume_token(&Token::LParen) {
4035            let options = self.parse_comma_separated(Parser::parse_iceberg_sink_config_option)?;
4036            self.expect_token(&Token::RParen)?;
4037            options
4038        } else {
4039            vec![]
4040        };
4041
4042        let aws_connection = if self.parse_keywords(&[USING, AWS, CONNECTION]) {
4043            Some(self.parse_raw_name()?)
4044        } else {
4045            None
4046        };
4047
4048        let key = if self.parse_keyword(KEY) {
4049            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4050
4051            let not_enforced = self.parse_keywords(&[NOT, ENFORCED]);
4052            Some(SinkKey {
4053                key_columns,
4054                not_enforced,
4055            })
4056        } else {
4057            None
4058        };
4059
4060        Ok(CreateSinkConnection::Iceberg {
4061            catalog_connection,
4062            aws_connection,
4063            key,
4064            options,
4065        })
4066    }
4067
4068    fn parse_create_sink_connection(&mut self) -> Result<CreateSinkConnection<Raw>, ParserError> {
4069        match self.expect_one_of_keywords(&[KAFKA, ICEBERG])? {
4070            KAFKA => self.parse_create_kafka_sink_connection(),
4071            ICEBERG => {
4072                self.expect_keyword(CATALOG)?;
4073                self.parse_create_iceberg_sink_connection()
4074            }
4075            _ => unreachable!(),
4076        }
4077    }
4078
4079    fn parse_create_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4080        let mut if_exists = if self.parse_keyword(OR) {
4081            self.expect_keyword(REPLACE)?;
4082            IfExistsBehavior::Replace
4083        } else {
4084            IfExistsBehavior::Error
4085        };
4086        let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
4087        self.expect_keyword(VIEW)?;
4088        if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4089            if_exists = IfExistsBehavior::Skip;
4090        }
4091
4092        let definition = self.parse_view_definition()?;
4093        Ok(Statement::CreateView(CreateViewStatement {
4094            temporary,
4095            if_exists,
4096            definition,
4097        }))
4098    }
4099
4100    fn parse_view_definition(&mut self) -> Result<ViewDefinition<Raw>, ParserError> {
4101        // ANSI SQL and Postgres support RECURSIVE here, but we don't.
4102        let name = self.parse_item_name()?;
4103        let columns = self.parse_parenthesized_column_list(Optional)?;
4104        // Postgres supports WITH options here, but we don't.
4105        self.expect_keyword(AS)?;
4106        let query = self.parse_query()?;
4107        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
4108        Ok(ViewDefinition {
4109            name,
4110            columns,
4111            query,
4112        })
4113    }
4114
4115    fn parse_create_materialized_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4116        let mut if_exists = if self.parse_keyword(OR) {
4117            self.expect_keyword(REPLACE)?;
4118            IfExistsBehavior::Replace
4119        } else {
4120            IfExistsBehavior::Error
4121        };
4122        let replacement = self.parse_keyword(REPLACEMENT);
4123        self.expect_keywords(&[MATERIALIZED, VIEW])?;
4124        if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4125            if_exists = IfExistsBehavior::Skip;
4126        }
4127
4128        let name = self.parse_item_name()?;
4129        let columns = self.parse_parenthesized_column_list(Optional)?;
4130        let replacement_for = if replacement {
4131            self.expect_keyword(FOR)?;
4132            Some(self.parse_raw_name()?)
4133        } else {
4134            None
4135        };
4136        let (in_cluster, in_cluster_replica) = if self.parse_keywords(&[IN, CLUSTER]) {
4137            let cluster = self.parse_raw_ident()?;
4138            let replica = if self.parse_keyword(REPLICA) {
4139                Some(self.parse_identifier()?)
4140            } else {
4141                None
4142            };
4143            (Some(cluster), replica)
4144        } else if self.parse_keywords(&[IN, REPLICA]) {
4145            let replica = self.parse_identifier()?;
4146            (None, Some(replica))
4147        } else {
4148            (None, None)
4149        };
4150
4151        let with_options = if self.parse_keyword(WITH) {
4152            self.expect_token(&Token::LParen)?;
4153            let options = self.parse_comma_separated(Parser::parse_materialized_view_option)?;
4154            self.expect_token(&Token::RParen)?;
4155            options
4156        } else {
4157            vec![]
4158        };
4159
4160        self.expect_keyword(AS)?;
4161        let query = self.parse_query()?;
4162        let as_of = self.parse_optional_internal_as_of()?;
4163
4164        Ok(Statement::CreateMaterializedView(
4165            CreateMaterializedViewStatement {
4166                if_exists,
4167                name,
4168                columns,
4169                replacement_for,
4170                in_cluster,
4171                in_cluster_replica,
4172                query,
4173                as_of,
4174                with_options,
4175            },
4176        ))
4177    }
4178
4179    fn parse_materialized_view_option_name(
4180        &mut self,
4181    ) -> Result<MaterializedViewOptionName, ParserError> {
4182        let option = self.expect_one_of_keywords(&[ASSERT, PARTITION, RETAIN, REFRESH])?;
4183        let name = match option {
4184            ASSERT => {
4185                self.expect_keywords(&[NOT, NULL])?;
4186                MaterializedViewOptionName::AssertNotNull
4187            }
4188            PARTITION => {
4189                self.expect_keyword(BY)?;
4190                MaterializedViewOptionName::PartitionBy
4191            }
4192            RETAIN => {
4193                self.expect_keyword(HISTORY)?;
4194                MaterializedViewOptionName::RetainHistory
4195            }
4196            REFRESH => MaterializedViewOptionName::Refresh,
4197            _ => unreachable!(),
4198        };
4199        Ok(name)
4200    }
4201
4202    fn parse_materialized_view_option(
4203        &mut self,
4204    ) -> Result<MaterializedViewOption<Raw>, ParserError> {
4205        let name = self.parse_materialized_view_option_name()?;
4206        let value = match name {
4207            MaterializedViewOptionName::RetainHistory => self.parse_option_retain_history()?,
4208            MaterializedViewOptionName::Refresh => {
4209                Some(self.parse_materialized_view_refresh_option_value()?)
4210            }
4211            _ => self.parse_optional_option_value()?,
4212        };
4213        Ok(MaterializedViewOption { name, value })
4214    }
4215
4216    fn parse_option_retain_history(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
4217        Ok(Some(self.parse_retain_history()?))
4218    }
4219
4220    fn parse_retain_history(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
4221        let _ = self.consume_token(&Token::Eq);
4222        self.expect_keyword(FOR)?;
4223        let value = self.parse_value()?;
4224        Ok(WithOptionValue::RetainHistoryFor(value))
4225    }
4226
4227    fn parse_materialized_view_refresh_option_value(
4228        &mut self,
4229    ) -> Result<WithOptionValue<Raw>, ParserError> {
4230        let _ = self.consume_token(&Token::Eq);
4231
4232        match self.expect_one_of_keywords(&[ON, AT, EVERY])? {
4233            ON => {
4234                self.expect_keyword(COMMIT)?;
4235                Ok(WithOptionValue::Refresh(RefreshOptionValue::OnCommit))
4236            }
4237            AT => {
4238                if self.parse_keyword(CREATION) {
4239                    Ok(WithOptionValue::Refresh(RefreshOptionValue::AtCreation))
4240                } else {
4241                    Ok(WithOptionValue::Refresh(RefreshOptionValue::At(
4242                        RefreshAtOptionValue {
4243                            time: self.parse_expr()?,
4244                        },
4245                    )))
4246                }
4247            }
4248            EVERY => {
4249                let interval = self.parse_interval_value()?;
4250                let aligned_to = if self.parse_keywords(&[ALIGNED, TO]) {
4251                    Some(self.parse_expr()?)
4252                } else {
4253                    None
4254                };
4255                Ok(WithOptionValue::Refresh(RefreshOptionValue::Every(
4256                    RefreshEveryOptionValue {
4257                        interval,
4258                        aligned_to,
4259                    },
4260                )))
4261            }
4262            _ => unreachable!(),
4263        }
4264    }
4265
4266    fn parse_create_index(&mut self) -> Result<Statement<Raw>, ParserError> {
4267        let default_index = self.parse_keyword(DEFAULT);
4268        self.expect_keyword(INDEX)?;
4269
4270        let if_not_exists = self.parse_if_not_exists()?;
4271        let name = if self.peek_keyword(IN) || self.peek_keyword(ON) {
4272            if if_not_exists && !default_index {
4273                return self.expected(self.peek_pos(), "index name", self.peek_token());
4274            }
4275            None
4276        } else {
4277            Some(self.parse_identifier()?)
4278        };
4279        let in_cluster = self.parse_optional_in_cluster()?;
4280        self.expect_keyword(ON)?;
4281        let on_name = self.parse_raw_name()?;
4282
4283        // Arrangements are the only index type we support, so we can just ignore this
4284        if self.parse_keyword(USING) {
4285            self.expect_keyword(ARRANGEMENT)?;
4286        }
4287
4288        let key_parts = if default_index {
4289            None
4290        } else {
4291            self.expect_token(&Token::LParen)?;
4292            if self.consume_token(&Token::RParen) {
4293                Some(vec![])
4294            } else {
4295                let key_parts = self
4296                    .parse_comma_separated(Parser::parse_order_by_expr)?
4297                    .into_iter()
4298                    .map(|x| x.expr)
4299                    .collect::<Vec<_>>();
4300                self.expect_token(&Token::RParen)?;
4301                Some(key_parts)
4302            }
4303        };
4304
4305        let with_options = if self.parse_keyword(WITH) {
4306            self.expect_token(&Token::LParen)?;
4307            let o = if matches!(self.peek_token(), Some(Token::RParen)) {
4308                vec![]
4309            } else {
4310                self.parse_comma_separated(Parser::parse_index_option)?
4311            };
4312            self.expect_token(&Token::RParen)?;
4313            o
4314        } else {
4315            vec![]
4316        };
4317
4318        Ok(Statement::CreateIndex(CreateIndexStatement {
4319            name,
4320            in_cluster,
4321            on_name,
4322            key_parts,
4323            with_options,
4324            if_not_exists,
4325        }))
4326    }
4327
4328    fn parse_table_option_name(&mut self) -> Result<TableOptionName, ParserError> {
4329        // this is only so we can test redacted values, of which no other
4330        // examples exist as of its introduction.
4331        if self.parse_keyword(REDACTED) {
4332            return Ok(TableOptionName::RedactedTest);
4333        }
4334        let name = match self.expect_one_of_keywords(&[PARTITION, RETAIN])? {
4335            PARTITION => {
4336                self.expect_keyword(BY)?;
4337                TableOptionName::PartitionBy
4338            }
4339            RETAIN => {
4340                self.expect_keyword(HISTORY)?;
4341                TableOptionName::RetainHistory
4342            }
4343            _ => unreachable!(),
4344        };
4345        Ok(name)
4346    }
4347
4348    fn parse_table_option(&mut self) -> Result<TableOption<Raw>, ParserError> {
4349        let name = self.parse_table_option_name()?;
4350        let value = match name {
4351            TableOptionName::PartitionBy => self.parse_optional_option_value(),
4352            TableOptionName::RetainHistory => self.parse_option_retain_history(),
4353            TableOptionName::RedactedTest => self.parse_optional_option_value(),
4354        }?;
4355        Ok(TableOption { name, value })
4356    }
4357
4358    fn parse_index_option_name(&mut self) -> Result<IndexOptionName, ParserError> {
4359        self.expect_keywords(&[RETAIN, HISTORY])?;
4360        Ok(IndexOptionName::RetainHistory)
4361    }
4362
4363    fn parse_index_option(&mut self) -> Result<IndexOption<Raw>, ParserError> {
4364        let name = self.parse_index_option_name()?;
4365        let value = match name {
4366            IndexOptionName::RetainHistory => self.parse_option_retain_history(),
4367        }?;
4368        Ok(IndexOption { name, value })
4369    }
4370
4371    fn parse_raw_ident(&mut self) -> Result<RawClusterName, ParserError> {
4372        if self.consume_token(&Token::LBracket) {
4373            let id = self.parse_raw_ident_str()?;
4374            self.expect_token(&Token::RBracket)?;
4375            Ok(RawClusterName::Resolved(id))
4376        } else {
4377            Ok(RawClusterName::Unresolved(self.parse_identifier()?))
4378        }
4379    }
4380
4381    fn parse_raw_network_policy_name(&mut self) -> Result<RawNetworkPolicyName, ParserError> {
4382        if self.consume_token(&Token::LBracket) {
4383            let id = self.parse_raw_ident_str()?;
4384            self.expect_token(&Token::RBracket)?;
4385            Ok(RawNetworkPolicyName::Resolved(id))
4386        } else {
4387            Ok(RawNetworkPolicyName::Unresolved(self.parse_identifier()?))
4388        }
4389    }
4390
4391    fn parse_raw_ident_str(&mut self) -> Result<String, ParserError> {
4392        let id = match self.next_token() {
4393            Some(Token::Ident(id)) => id.into_inner(),
4394            Some(Token::Number(n)) => n,
4395            _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4396        };
4397        // A resolved name renders as `[id]`; an empty id (e.g. `[""]`) would
4398        // display as `[]` and fail to reparse. Reject it.
4399        if id.is_empty() {
4400            return parser_err!(self, self.peek_prev_pos(), "expected id");
4401        }
4402        Ok(id)
4403    }
4404
4405    fn parse_optional_in_cluster(&mut self) -> Result<Option<RawClusterName>, ParserError> {
4406        if self.parse_keywords(&[IN, CLUSTER]) {
4407            Ok(Some(self.parse_raw_ident()?))
4408        } else {
4409            Ok(None)
4410        }
4411    }
4412
4413    fn parse_create_role(&mut self) -> Result<Statement<Raw>, ParserError> {
4414        self.expect_keyword(ROLE)?;
4415        let name = self.parse_identifier()?;
4416        let _ = self.parse_keyword(WITH);
4417        let options = self.parse_role_attributes()?;
4418        Ok(Statement::CreateRole(CreateRoleStatement { name, options }))
4419    }
4420
4421    fn parse_role_attributes(&mut self) -> Result<Vec<RoleAttribute>, ParserError> {
4422        let mut options = vec![];
4423        loop {
4424            match self.parse_one_of_keywords(&[
4425                SUPERUSER,
4426                NOSUPERUSER,
4427                LOGIN,
4428                NOLOGIN,
4429                INHERIT,
4430                NOINHERIT,
4431                CREATECLUSTER,
4432                NOCREATECLUSTER,
4433                CREATEDB,
4434                NOCREATEDB,
4435                CREATEROLE,
4436                NOCREATEROLE,
4437                PASSWORD,
4438            ]) {
4439                None => break,
4440                Some(SUPERUSER) => options.push(RoleAttribute::SuperUser),
4441                Some(NOSUPERUSER) => options.push(RoleAttribute::NoSuperUser),
4442                Some(LOGIN) => options.push(RoleAttribute::Login),
4443                Some(NOLOGIN) => options.push(RoleAttribute::NoLogin),
4444                Some(INHERIT) => options.push(RoleAttribute::Inherit),
4445                Some(NOINHERIT) => options.push(RoleAttribute::NoInherit),
4446                Some(CREATECLUSTER) => options.push(RoleAttribute::CreateCluster),
4447                Some(NOCREATECLUSTER) => options.push(RoleAttribute::NoCreateCluster),
4448                Some(CREATEDB) => options.push(RoleAttribute::CreateDB),
4449                Some(NOCREATEDB) => options.push(RoleAttribute::NoCreateDB),
4450                Some(CREATEROLE) => options.push(RoleAttribute::CreateRole),
4451                Some(NOCREATEROLE) => options.push(RoleAttribute::NoCreateRole),
4452                Some(PASSWORD) => {
4453                    if self.parse_keyword(NULL) {
4454                        options.push(RoleAttribute::Password(None));
4455                        continue;
4456                    }
4457                    let password = self.parse_literal_string()?;
4458                    options.push(RoleAttribute::Password(Some(password)));
4459                }
4460                Some(_) => unreachable!(),
4461            }
4462        }
4463        Ok(options)
4464    }
4465
4466    fn parse_create_secret(&mut self) -> Result<Statement<Raw>, ParserError> {
4467        self.expect_keyword(SECRET)?;
4468        let if_not_exists = self.parse_if_not_exists()?;
4469        let name = self.parse_item_name()?;
4470        self.expect_keyword(AS)?;
4471        let value = self.parse_expr()?;
4472        Ok(Statement::CreateSecret(CreateSecretStatement {
4473            name,
4474            if_not_exists,
4475            value,
4476        }))
4477    }
4478
4479    fn parse_create_type(&mut self) -> Result<Statement<Raw>, ParserError> {
4480        self.expect_keyword(TYPE)?;
4481        let name = self.parse_item_name()?;
4482        self.expect_keyword(AS)?;
4483
4484        match self.parse_one_of_keywords(&[LIST, MAP]) {
4485            Some(LIST) => {
4486                self.expect_token(&Token::LParen)?;
4487                let options = self.parse_comma_separated(Parser::parse_create_type_list_option)?;
4488                self.expect_token(&Token::RParen)?;
4489                Ok(Statement::CreateType(CreateTypeStatement {
4490                    name,
4491                    as_type: CreateTypeAs::List { options },
4492                }))
4493            }
4494            Some(MAP) => {
4495                self.expect_token(&Token::LParen)?;
4496                let options = self.parse_comma_separated(Parser::parse_create_type_map_option)?;
4497                self.expect_token(&Token::RParen)?;
4498                Ok(Statement::CreateType(CreateTypeStatement {
4499                    name,
4500                    as_type: CreateTypeAs::Map { options },
4501                }))
4502            }
4503            None => {
4504                let column_defs = self.parse_composite_type_definition()?;
4505
4506                Ok(Statement::CreateType(CreateTypeStatement {
4507                    name,
4508                    as_type: CreateTypeAs::Record { column_defs },
4509                }))
4510            }
4511            _ => unreachable!(),
4512        }
4513    }
4514
4515    fn parse_create_type_list_option(&mut self) -> Result<CreateTypeListOption<Raw>, ParserError> {
4516        self.expect_keywords(&[ELEMENT, TYPE])?;
4517        let name = CreateTypeListOptionName::ElementType;
4518        Ok(CreateTypeListOption {
4519            name,
4520            value: Some(self.parse_data_type_option_value()?),
4521        })
4522    }
4523
4524    fn parse_create_type_map_option(&mut self) -> Result<CreateTypeMapOption<Raw>, ParserError> {
4525        let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
4526            KEY => {
4527                self.expect_keyword(TYPE)?;
4528                CreateTypeMapOptionName::KeyType
4529            }
4530            VALUE => {
4531                self.expect_keyword(TYPE)?;
4532                CreateTypeMapOptionName::ValueType
4533            }
4534            _ => unreachable!(),
4535        };
4536        Ok(CreateTypeMapOption {
4537            name,
4538            value: Some(self.parse_data_type_option_value()?),
4539        })
4540    }
4541
4542    fn parse_create_cluster(&mut self) -> Result<Statement<Raw>, ParserError> {
4543        let name = self.parse_identifier()?;
4544        // For historical reasons, the parentheses around the options can be
4545        // omitted.
4546        let paren = self.consume_token(&Token::LParen);
4547        let options = self.parse_comma_separated(Parser::parse_cluster_option)?;
4548        if paren {
4549            self.expect_token(&Token::RParen)?;
4550        }
4551
4552        let features = if self.parse_keywords(&[FEATURES]) {
4553            self.expect_token(&Token::LParen)?;
4554            let features = self.parse_comma_separated(Parser::parse_cluster_feature)?;
4555            self.expect_token(&Token::RParen)?;
4556            features
4557        } else {
4558            Vec::new()
4559        };
4560
4561        Ok(Statement::CreateCluster(CreateClusterStatement {
4562            name,
4563            options,
4564            features,
4565        }))
4566    }
4567
4568    fn parse_cluster_option_name(&mut self) -> Result<ClusterOptionName, ParserError> {
4569        let option = self.expect_one_of_keywords(&[
4570            AVAILABILITY,
4571            DISK,
4572            INTROSPECTION,
4573            MANAGED,
4574            REPLICAS,
4575            REPLICATION,
4576            SIZE,
4577            SCHEDULE,
4578            WORKLOAD,
4579        ])?;
4580        let name = match option {
4581            AVAILABILITY => {
4582                self.expect_keyword(ZONES)?;
4583                ClusterOptionName::AvailabilityZones
4584            }
4585            DISK => ClusterOptionName::Disk,
4586            INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4587                DEBUGGING => ClusterOptionName::IntrospectionDebugging,
4588                INTERVAL => ClusterOptionName::IntrospectionInterval,
4589                _ => unreachable!(),
4590            },
4591            MANAGED => ClusterOptionName::Managed,
4592            REPLICAS => ClusterOptionName::Replicas,
4593            REPLICATION => {
4594                self.expect_keyword(FACTOR)?;
4595                ClusterOptionName::ReplicationFactor
4596            }
4597            SIZE => ClusterOptionName::Size,
4598            SCHEDULE => ClusterOptionName::Schedule,
4599            WORKLOAD => {
4600                self.expect_keyword(CLASS)?;
4601                ClusterOptionName::WorkloadClass
4602            }
4603            _ => unreachable!(),
4604        };
4605        Ok(name)
4606    }
4607
4608    fn parse_cluster_option(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4609        let name = self.parse_cluster_option_name()?;
4610
4611        match name {
4612            ClusterOptionName::Replicas => self.parse_cluster_option_replicas(),
4613            ClusterOptionName::Schedule => self.parse_cluster_option_schedule(),
4614            _ => {
4615                let value = self.parse_optional_option_value()?;
4616                Ok(ClusterOption { name, value })
4617            }
4618        }
4619    }
4620
4621    fn parse_alter_cluster_option(&mut self) -> Result<ClusterAlterOption<Raw>, ParserError> {
4622        let (name, value) = match self.expect_one_of_keywords(&[WAIT])? {
4623            WAIT => {
4624                let _ = self.consume_token(&Token::Eq);
4625                let v = match self.expect_one_of_keywords(&[FOR, UNTIL])? {
4626                    FOR => Some(WithOptionValue::ClusterAlterStrategy(
4627                        ClusterAlterOptionValue::For(self.parse_value()?),
4628                    )),
4629                    UNTIL => {
4630                        self.expect_keyword(READY)?;
4631                        let _ = self.consume_token(&Token::Eq);
4632                        self.expect_token(&Token::LParen)?;
4633                        let opts = Some(WithOptionValue::ClusterAlterStrategy(
4634                            ClusterAlterOptionValue::UntilReady(self.parse_comma_separated(
4635                                Parser::parse_cluster_alter_until_ready_option,
4636                            )?),
4637                        ));
4638                        self.expect_token(&Token::RParen)?;
4639                        opts
4640                    }
4641                    _ => unreachable!(),
4642                };
4643                (ClusterAlterOptionName::Wait, v)
4644            }
4645            _ => unreachable!(),
4646        };
4647        Ok(ClusterAlterOption { name, value })
4648    }
4649
4650    fn parse_cluster_alter_until_ready_option(
4651        &mut self,
4652    ) -> Result<ClusterAlterUntilReadyOption<Raw>, ParserError> {
4653        let name = match self.expect_one_of_keywords(&[TIMEOUT, ON])? {
4654            ON => {
4655                self.expect_keywords(&[TIMEOUT])?;
4656                ClusterAlterUntilReadyOptionName::OnTimeout
4657            }
4658            TIMEOUT => ClusterAlterUntilReadyOptionName::Timeout,
4659            _ => unreachable!(),
4660        };
4661        let value = self.parse_optional_option_value()?;
4662        Ok(ClusterAlterUntilReadyOption { name, value })
4663    }
4664
4665    fn parse_cluster_option_replicas(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4666        let _ = self.consume_token(&Token::Eq);
4667        self.expect_token(&Token::LParen)?;
4668        let replicas = if self.consume_token(&Token::RParen) {
4669            vec![]
4670        } else {
4671            let replicas = self.parse_comma_separated(|parser| {
4672                let name = parser.parse_identifier()?;
4673                parser.expect_token(&Token::LParen)?;
4674                let options = parser.parse_comma_separated(Parser::parse_replica_option)?;
4675                parser.expect_token(&Token::RParen)?;
4676                Ok(ReplicaDefinition { name, options })
4677            })?;
4678            self.expect_token(&Token::RParen)?;
4679            replicas
4680        };
4681        Ok(ClusterOption {
4682            name: ClusterOptionName::Replicas,
4683            value: Some(WithOptionValue::ClusterReplicas(replicas)),
4684        })
4685    }
4686
4687    fn parse_cluster_option_schedule(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4688        let _ = self.consume_token(&Token::Eq);
4689        let kw = self.expect_one_of_keywords(&[MANUAL, ON])?;
4690        let value = match kw {
4691            MANUAL => ClusterScheduleOptionValue::Manual,
4692            ON => {
4693                self.expect_keyword(REFRESH)?;
4694                // Parse optional `(HYDRATION TIME ESTIMATE ...)`
4695                let hydration_time_estimate = if self.consume_token(&Token::LParen) {
4696                    self.expect_keywords(&[HYDRATION, TIME, ESTIMATE])?;
4697                    let _ = self.consume_token(&Token::Eq);
4698                    let interval = self.parse_interval_value()?;
4699                    self.expect_token(&Token::RParen)?;
4700                    Some(interval)
4701                } else {
4702                    None
4703                };
4704                ClusterScheduleOptionValue::Refresh {
4705                    hydration_time_estimate,
4706                }
4707            }
4708            _ => unreachable!(),
4709        };
4710        Ok(ClusterOption {
4711            name: ClusterOptionName::Schedule,
4712            value: Some(WithOptionValue::ClusterScheduleOptionValue(value)),
4713        })
4714    }
4715
4716    fn parse_replica_option(&mut self) -> Result<ReplicaOption<Raw>, ParserError> {
4717        let name = match self.expect_one_of_keywords(&[
4718            AVAILABILITY,
4719            BILLED,
4720            COMPUTE,
4721            COMPUTECTL,
4722            DISK,
4723            INTERNAL,
4724            INTROSPECTION,
4725            SIZE,
4726            STORAGE,
4727            STORAGECTL,
4728            WORKERS,
4729        ])? {
4730            AVAILABILITY => {
4731                self.expect_keyword(ZONE)?;
4732                ReplicaOptionName::AvailabilityZone
4733            }
4734            BILLED => {
4735                self.expect_keyword(AS)?;
4736                ReplicaOptionName::BilledAs
4737            }
4738            COMPUTE => {
4739                self.expect_keyword(ADDRESSES)?;
4740                ReplicaOptionName::ComputeAddresses
4741            }
4742            COMPUTECTL => {
4743                self.expect_keyword(ADDRESSES)?;
4744                ReplicaOptionName::ComputectlAddresses
4745            }
4746            DISK => ReplicaOptionName::Disk,
4747            INTERNAL => ReplicaOptionName::Internal,
4748            INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4749                DEBUGGING => ReplicaOptionName::IntrospectionDebugging,
4750                INTERVAL => ReplicaOptionName::IntrospectionInterval,
4751                _ => unreachable!(),
4752            },
4753            SIZE => ReplicaOptionName::Size,
4754            STORAGE => {
4755                self.expect_keyword(ADDRESSES)?;
4756                ReplicaOptionName::StorageAddresses
4757            }
4758            STORAGECTL => {
4759                self.expect_keyword(ADDRESSES)?;
4760                ReplicaOptionName::StoragectlAddresses
4761            }
4762            WORKERS => ReplicaOptionName::Workers,
4763            _ => unreachable!(),
4764        };
4765        let value = self.parse_optional_option_value()?;
4766        Ok(ReplicaOption { name, value })
4767    }
4768
4769    fn parse_cluster_feature(&mut self) -> Result<ClusterFeature<Raw>, ParserError> {
4770        Ok(ClusterFeature {
4771            name: self.parse_cluster_feature_name()?,
4772            value: self.parse_optional_option_value()?,
4773        })
4774    }
4775
4776    fn parse_create_cluster_replica(&mut self) -> Result<Statement<Raw>, ParserError> {
4777        self.next_token();
4778        let of_cluster = self.parse_identifier()?;
4779        self.expect_token(&Token::Dot)?;
4780        let name = self.parse_identifier()?;
4781        // For historical reasons, the parentheses around the options can be
4782        // omitted.
4783        let paren = self.consume_token(&Token::LParen);
4784        let options = self.parse_comma_separated(Parser::parse_replica_option)?;
4785        if paren {
4786            let _ = self.consume_token(&Token::RParen);
4787        }
4788        Ok(Statement::CreateClusterReplica(
4789            CreateClusterReplicaStatement {
4790                of_cluster,
4791                definition: ReplicaDefinition { name, options },
4792            },
4793        ))
4794    }
4795
4796    fn parse_if_exists(&mut self) -> Result<bool, ParserError> {
4797        if self.parse_keyword(IF) {
4798            self.expect_keyword(EXISTS)?;
4799            Ok(true)
4800        } else {
4801            Ok(false)
4802        }
4803    }
4804
4805    fn parse_if_not_exists(&mut self) -> Result<bool, ParserError> {
4806        if self.parse_keyword(IF) {
4807            self.expect_keywords(&[NOT, EXISTS])?;
4808            Ok(true)
4809        } else {
4810            Ok(false)
4811        }
4812    }
4813
4814    fn parse_alias(&mut self) -> Result<Option<Ident>, ParserError> {
4815        self.parse_keyword(AS)
4816            .then(|| self.parse_identifier())
4817            .transpose()
4818    }
4819
4820    fn parse_source_include_metadata(&mut self) -> Result<Vec<SourceIncludeMetadata>, ParserError> {
4821        if self.parse_keyword(INCLUDE) {
4822            self.parse_comma_separated(|parser| {
4823                let metadata = match parser
4824                    .expect_one_of_keywords(&[KEY, TIMESTAMP, PARTITION, OFFSET, HEADERS, HEADER])?
4825                {
4826                    KEY => SourceIncludeMetadata::Key {
4827                        alias: parser.parse_alias()?,
4828                    },
4829                    TIMESTAMP => SourceIncludeMetadata::Timestamp {
4830                        alias: parser.parse_alias()?,
4831                    },
4832                    PARTITION => SourceIncludeMetadata::Partition {
4833                        alias: parser.parse_alias()?,
4834                    },
4835                    OFFSET => SourceIncludeMetadata::Offset {
4836                        alias: parser.parse_alias()?,
4837                    },
4838                    HEADERS => SourceIncludeMetadata::Headers {
4839                        alias: parser.parse_alias()?,
4840                    },
4841                    HEADER => {
4842                        let key: String = parser.parse_literal_string()?;
4843                        parser.expect_keyword(AS)?;
4844                        let alias = parser.parse_identifier()?;
4845                        let use_bytes = parser.parse_keyword(BYTES);
4846                        SourceIncludeMetadata::Header {
4847                            alias,
4848                            key,
4849                            use_bytes,
4850                        }
4851                    }
4852                    _ => unreachable!("only explicitly allowed items can be parsed"),
4853                };
4854                Ok(metadata)
4855            })
4856        } else {
4857            Ok(vec![])
4858        }
4859    }
4860
4861    fn parse_discard(&mut self) -> Result<Statement<Raw>, ParserError> {
4862        let target = match self.expect_one_of_keywords(&[ALL, PLANS, SEQUENCES, TEMP, TEMPORARY])? {
4863            ALL => DiscardTarget::All,
4864            PLANS => DiscardTarget::Plans,
4865            SEQUENCES => DiscardTarget::Sequences,
4866            TEMP | TEMPORARY => DiscardTarget::Temp,
4867            _ => unreachable!(),
4868        };
4869        Ok(Statement::Discard(DiscardStatement { target }))
4870    }
4871
4872    fn parse_drop(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
4873        if self.parse_keyword(OWNED) {
4874            self.parse_drop_owned()
4875                .map_parser_err(StatementKind::DropOwned)
4876        } else {
4877            self.parse_drop_objects()
4878                .map_parser_err(StatementKind::DropObjects)
4879        }
4880    }
4881
4882    fn parse_drop_objects(&mut self) -> Result<Statement<Raw>, ParserError> {
4883        let object_type = self.expect_object_type()?;
4884        let if_exists = self.parse_if_exists()?;
4885        match object_type {
4886            ObjectType::Database => {
4887                let name = UnresolvedObjectName::Database(self.parse_database_name()?);
4888                let restrict = matches!(
4889                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4890                    Some(RESTRICT),
4891                );
4892                Ok(Statement::DropObjects(DropObjectsStatement {
4893                    object_type: ObjectType::Database,
4894                    if_exists,
4895                    names: vec![name],
4896                    cascade: !restrict,
4897                }))
4898            }
4899            ObjectType::Schema => {
4900                let names = self.parse_comma_separated(|parser| {
4901                    Ok(UnresolvedObjectName::Schema(parser.parse_schema_name()?))
4902                })?;
4903
4904                let cascade = matches!(
4905                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4906                    Some(CASCADE),
4907                );
4908                Ok(Statement::DropObjects(DropObjectsStatement {
4909                    object_type: ObjectType::Schema,
4910                    if_exists,
4911                    names,
4912                    cascade,
4913                }))
4914            }
4915            ObjectType::Role => {
4916                let names = self.parse_comma_separated(|parser| {
4917                    Ok(UnresolvedObjectName::Role(parser.parse_identifier()?))
4918                })?;
4919                Ok(Statement::DropObjects(DropObjectsStatement {
4920                    object_type: ObjectType::Role,
4921                    if_exists,
4922                    names,
4923                    cascade: false,
4924                }))
4925            }
4926            ObjectType::NetworkPolicy => {
4927                let names = self.parse_comma_separated(|parser| {
4928                    Ok(UnresolvedObjectName::NetworkPolicy(
4929                        parser.parse_identifier()?,
4930                    ))
4931                })?;
4932                Ok(Statement::DropObjects(DropObjectsStatement {
4933                    object_type: ObjectType::NetworkPolicy,
4934                    if_exists,
4935                    names,
4936                    cascade: false,
4937                }))
4938            }
4939            ObjectType::Cluster => self.parse_drop_clusters(if_exists),
4940            ObjectType::ClusterReplica => self.parse_drop_cluster_replicas(if_exists),
4941            ObjectType::Table
4942            | ObjectType::View
4943            | ObjectType::MaterializedView
4944            | ObjectType::Source
4945            | ObjectType::Sink
4946            | ObjectType::Index
4947            | ObjectType::Type
4948            | ObjectType::Secret
4949            | ObjectType::Connection => {
4950                let names = self.parse_comma_separated(|parser| {
4951                    Ok(UnresolvedObjectName::Item(parser.parse_item_name()?))
4952                })?;
4953                let cascade = matches!(
4954                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4955                    Some(CASCADE),
4956                );
4957                Ok(Statement::DropObjects(DropObjectsStatement {
4958                    object_type,
4959                    if_exists,
4960                    names,
4961                    cascade,
4962                }))
4963            }
4964            ObjectType::Func | ObjectType::Subsource => parser_err!(
4965                self,
4966                self.peek_prev_pos(),
4967                format!("Unsupported DROP on {object_type}")
4968            ),
4969        }
4970    }
4971
4972    fn parse_drop_clusters(&mut self, if_exists: bool) -> Result<Statement<Raw>, ParserError> {
4973        let names = self.parse_comma_separated(|parser| {
4974            Ok(UnresolvedObjectName::Cluster(parser.parse_identifier()?))
4975        })?;
4976        let cascade = matches!(
4977            self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4978            Some(CASCADE),
4979        );
4980        Ok(Statement::DropObjects(DropObjectsStatement {
4981            object_type: ObjectType::Cluster,
4982            if_exists,
4983            names,
4984            cascade,
4985        }))
4986    }
4987
4988    fn parse_drop_cluster_replicas(
4989        &mut self,
4990        if_exists: bool,
4991    ) -> Result<Statement<Raw>, ParserError> {
4992        let names = self.parse_comma_separated(|p| {
4993            Ok(UnresolvedObjectName::ClusterReplica(
4994                p.parse_cluster_replica_name()?,
4995            ))
4996        })?;
4997        Ok(Statement::DropObjects(DropObjectsStatement {
4998            object_type: ObjectType::ClusterReplica,
4999            if_exists,
5000            names,
5001            cascade: false,
5002        }))
5003    }
5004
5005    fn parse_drop_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
5006        self.expect_keyword(BY)?;
5007        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
5008        let cascade = if self.parse_keyword(CASCADE) {
5009            Some(true)
5010        } else if self.parse_keyword(RESTRICT) {
5011            Some(false)
5012        } else {
5013            None
5014        };
5015        Ok(Statement::DropOwned(DropOwnedStatement {
5016            role_names,
5017            cascade,
5018        }))
5019    }
5020
5021    fn parse_cluster_replica_name(&mut self) -> Result<QualifiedReplica, ParserError> {
5022        let cluster = self.parse_identifier()?;
5023        self.expect_token(&Token::Dot)?;
5024        let replica = self.parse_identifier()?;
5025        Ok(QualifiedReplica { cluster, replica })
5026    }
5027
5028    fn parse_alter_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5029        let name = self.parse_identifier()?;
5030        self.expect_keyword(SET)?;
5031        self.expect_token(&Token::LParen)?;
5032        let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5033        self.expect_token(&Token::RParen)?;
5034        Ok(Statement::AlterNetworkPolicy(AlterNetworkPolicyStatement {
5035            name,
5036            options,
5037        }))
5038    }
5039
5040    fn parse_create_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5041        self.expect_keywords(&[NETWORK, POLICY])?;
5042        let name = self.parse_identifier()?;
5043        self.expect_token(&Token::LParen)?;
5044        let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5045        self.expect_token(&Token::RParen)?;
5046        Ok(Statement::CreateNetworkPolicy(
5047            CreateNetworkPolicyStatement { name, options },
5048        ))
5049    }
5050
5051    fn parse_network_policy_option(&mut self) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5052        let name = match self.expect_one_of_keywords(&[RULES])? {
5053            RULES => NetworkPolicyOptionName::Rules,
5054            v => panic!("found unreachable keyword {}", v),
5055        };
5056        match name {
5057            NetworkPolicyOptionName::Rules => self.parse_network_policy_option_rules(),
5058        }
5059    }
5060
5061    fn parse_network_policy_option_rules(
5062        &mut self,
5063    ) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5064        let _ = self.consume_token(&Token::Eq);
5065        self.expect_token(&Token::LParen)?;
5066        let rules = if self.consume_token(&Token::RParen) {
5067            vec![]
5068        } else {
5069            let rules = self.parse_comma_separated(|parser| {
5070                let name = parser.parse_identifier()?;
5071                parser.expect_token(&Token::LParen)?;
5072                let options =
5073                    parser.parse_comma_separated(Parser::parse_network_policy_rule_option)?;
5074                parser.expect_token(&Token::RParen)?;
5075                Ok(NetworkPolicyRuleDefinition { name, options })
5076            })?;
5077            self.expect_token(&Token::RParen)?;
5078            rules
5079        };
5080        Ok(NetworkPolicyOption {
5081            name: NetworkPolicyOptionName::Rules,
5082            value: Some(WithOptionValue::NetworkPolicyRules(rules)),
5083        })
5084    }
5085
5086    fn parse_network_policy_rule_option(
5087        &mut self,
5088    ) -> Result<NetworkPolicyRuleOption<Raw>, ParserError> {
5089        let name = match self.expect_one_of_keywords(&[ACTION, ADDRESS, DIRECTION])? {
5090            ACTION => NetworkPolicyRuleOptionName::Action,
5091            ADDRESS => NetworkPolicyRuleOptionName::Address,
5092            DIRECTION => NetworkPolicyRuleOptionName::Direction,
5093            v => panic!("found unreachable keyword {}", v),
5094        };
5095        let value = self.parse_optional_option_value()?;
5096        Ok(NetworkPolicyRuleOption { name, value })
5097    }
5098
5099    fn parse_create_table(&mut self) -> Result<Statement<Raw>, ParserError> {
5100        let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
5101        self.expect_keyword(TABLE)?;
5102        let if_not_exists = self.parse_if_not_exists()?;
5103        let table_name = self.parse_item_name()?;
5104        // parse optional column list (schema)
5105        let (columns, constraints) = self.parse_columns(Mandatory)?;
5106
5107        let with_options = if self.parse_keyword(WITH) {
5108            self.expect_token(&Token::LParen)?;
5109            let o = if matches!(self.peek_token(), Some(Token::RParen)) {
5110                vec![]
5111            } else {
5112                self.parse_comma_separated(Parser::parse_table_option)?
5113            };
5114            self.expect_token(&Token::RParen)?;
5115            o
5116        } else {
5117            vec![]
5118        };
5119
5120        Ok(Statement::CreateTable(CreateTableStatement {
5121            name: table_name,
5122            columns,
5123            constraints,
5124            if_not_exists,
5125            temporary,
5126            with_options,
5127        }))
5128    }
5129
5130    fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5131        if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5132            return parser_err!(
5133                self,
5134                self.peek_prev_pos(),
5135                "temporary tables FROM SOURCE are not supported"
5136            );
5137        }
5138        self.expect_keyword(TABLE)?;
5139        let if_not_exists = self.parse_if_not_exists()?;
5140        let table_name = self.parse_item_name()?;
5141
5142        if self.parse_keywords(&[FROM, WEBHOOK]) {
5143            // Webhook Source, which works differently than all other sources.
5144            return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5145        }
5146
5147        let (columns, constraints) = self.parse_table_from_source_columns()?;
5148
5149        self.expect_keywords(&[FROM, SOURCE])?;
5150
5151        let source = self.parse_raw_name()?;
5152
5153        let external_reference = if self.consume_token(&Token::LParen) {
5154            self.expect_keyword(REFERENCE)?;
5155            let _ = self.consume_token(&Token::Eq);
5156            let external_reference = self.parse_item_name()?;
5157            self.expect_token(&Token::RParen)?;
5158            Some(external_reference)
5159        } else {
5160            None
5161        };
5162
5163        let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5164            Some(KEY) => {
5165                self.expect_keyword(FORMAT)?;
5166                let key = self.parse_format()?;
5167                self.expect_keywords(&[VALUE, FORMAT])?;
5168                let value = self.parse_format()?;
5169                Some(FormatSpecifier::KeyValue { key, value })
5170            }
5171            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5172            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5173            None => None,
5174        };
5175        let include_metadata = self.parse_source_include_metadata()?;
5176
5177        let envelope = if self.parse_keyword(ENVELOPE) {
5178            Some(self.parse_source_envelope()?)
5179        } else {
5180            None
5181        };
5182
5183        let with_options = if self.parse_keyword(WITH) {
5184            self.expect_token(&Token::LParen)?;
5185            let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5186            self.expect_token(&Token::RParen)?;
5187            options
5188        } else {
5189            vec![]
5190        };
5191
5192        Ok(Statement::CreateTableFromSource(
5193            CreateTableFromSourceStatement {
5194                name: table_name,
5195                columns,
5196                constraints,
5197                if_not_exists,
5198                source,
5199                external_reference,
5200                format,
5201                include_metadata,
5202                envelope,
5203                with_options,
5204            },
5205        ))
5206    }
5207
5208    fn parse_table_from_source_option(
5209        &mut self,
5210    ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5211        let option = match self
5212            .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5213        {
5214            ref keyword @ (TEXT | EXCLUDE) => {
5215                self.expect_keyword(COLUMNS)?;
5216
5217                let _ = self.consume_token(&Token::Eq);
5218
5219                let value = self
5220                    .parse_option_sequence(Parser::parse_identifier)?
5221                    .map(|inner| {
5222                        WithOptionValue::Sequence(
5223                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5224                        )
5225                    });
5226
5227                TableFromSourceOption {
5228                    name: match *keyword {
5229                        TEXT => TableFromSourceOptionName::TextColumns,
5230                        EXCLUDE => TableFromSourceOptionName::ExcludeColumns,
5231                        _ => unreachable!(),
5232                    },
5233                    value,
5234                }
5235            }
5236            DETAILS => TableFromSourceOption {
5237                name: TableFromSourceOptionName::Details,
5238                value: self.parse_optional_option_value()?,
5239            },
5240            IGNORE => {
5241                self.expect_keyword(COLUMNS)?;
5242                let _ = self.consume_token(&Token::Eq);
5243
5244                let value = self
5245                    .parse_option_sequence(Parser::parse_identifier)?
5246                    .map(|inner| {
5247                        WithOptionValue::Sequence(
5248                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5249                        )
5250                    });
5251                TableFromSourceOption {
5252                    // IGNORE is historical syntax for this option.
5253                    name: TableFromSourceOptionName::ExcludeColumns,
5254                    value,
5255                }
5256            }
5257            PARTITION => {
5258                self.expect_keyword(BY)?;
5259                TableFromSourceOption {
5260                    name: TableFromSourceOptionName::PartitionBy,
5261                    value: self.parse_optional_option_value()?,
5262                }
5263            }
5264            RETAIN => {
5265                self.expect_keyword(HISTORY)?;
5266                TableFromSourceOption {
5267                    name: TableFromSourceOptionName::RetainHistory,
5268                    value: self.parse_option_retain_history()?,
5269                }
5270            }
5271            _ => unreachable!(),
5272        };
5273        Ok(option)
5274    }
5275
5276    fn parse_table_from_source_columns(
5277        &mut self,
5278    ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5279        let mut constraints = vec![];
5280
5281        if !self.consume_token(&Token::LParen) {
5282            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5283        }
5284        if self.consume_token(&Token::RParen) {
5285            // Tables with zero columns are a PostgreSQL extension.
5286            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5287        }
5288
5289        let mut column_names = vec![];
5290        let mut column_defs = vec![];
5291        loop {
5292            if let Some(constraint) = self.parse_optional_table_constraint()? {
5293                constraints.push(constraint);
5294            } else if let Some(column_name) = self.consume_identifier()? {
5295                let next_token = self.peek_token();
5296                match next_token {
5297                    Some(Token::Comma) | Some(Token::RParen) => {
5298                        column_names.push(column_name);
5299                    }
5300                    _ => {
5301                        let data_type = self.parse_data_type()?;
5302                        let collation = if self.parse_keyword(COLLATE) {
5303                            Some(self.parse_item_name()?)
5304                        } else {
5305                            None
5306                        };
5307                        let mut options = vec![];
5308                        loop {
5309                            match self.peek_token() {
5310                                None | Some(Token::Comma) | Some(Token::RParen) => break,
5311                                _ => options.push(self.parse_column_option_def()?),
5312                            }
5313                        }
5314
5315                        column_defs.push(ColumnDef {
5316                            name: column_name,
5317                            data_type,
5318                            collation,
5319                            options,
5320                        });
5321                    }
5322                }
5323            } else {
5324                return self.expected(
5325                    self.peek_pos(),
5326                    "column name or constraint definition",
5327                    self.peek_token(),
5328                );
5329            }
5330            if self.consume_token(&Token::Comma) {
5331                // Continue.
5332            } else if self.consume_token(&Token::RParen) {
5333                break;
5334            } else {
5335                return self.expected(
5336                    self.peek_pos(),
5337                    "',' or ')' after column definition",
5338                    self.peek_token(),
5339                );
5340            }
5341        }
5342        if !column_defs.is_empty() && !column_names.is_empty() {
5343            return parser_err!(
5344                self,
5345                self.peek_prev_pos(),
5346                "cannot mix column definitions and column names"
5347            );
5348        }
5349
5350        let columns = match column_defs.is_empty() {
5351            true => match column_names.is_empty() {
5352                true => TableFromSourceColumns::NotSpecified,
5353                false => TableFromSourceColumns::Named(column_names),
5354            },
5355            false => TableFromSourceColumns::Defined(column_defs),
5356        };
5357
5358        Ok((columns, constraints))
5359    }
5360
5361    fn parse_columns(
5362        &mut self,
5363        optional: IsOptional,
5364    ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5365        let mut columns = vec![];
5366        let mut constraints = vec![];
5367
5368        if !self.consume_token(&Token::LParen) {
5369            if optional == Optional {
5370                return Ok((columns, constraints));
5371            } else {
5372                return self.expected(
5373                    self.peek_pos(),
5374                    "a list of columns in parentheses",
5375                    self.peek_token(),
5376                );
5377            }
5378        }
5379        if self.consume_token(&Token::RParen) {
5380            // Tables with zero columns are a PostgreSQL extension.
5381            return Ok((columns, constraints));
5382        }
5383
5384        loop {
5385            if let Some(constraint) = self.parse_optional_table_constraint()? {
5386                constraints.push(constraint);
5387            } else if let Some(column_name) = self.consume_identifier()? {
5388                let data_type = self.parse_data_type()?;
5389                let collation = if self.parse_keyword(COLLATE) {
5390                    Some(self.parse_item_name()?)
5391                } else {
5392                    None
5393                };
5394                let mut options = vec![];
5395                loop {
5396                    match self.peek_token() {
5397                        None | Some(Token::Comma) | Some(Token::RParen) => break,
5398                        _ => options.push(self.parse_column_option_def()?),
5399                    }
5400                }
5401
5402                columns.push(ColumnDef {
5403                    name: column_name,
5404                    data_type,
5405                    collation,
5406                    options,
5407                });
5408            } else {
5409                return self.expected(
5410                    self.peek_pos(),
5411                    "column name or constraint definition",
5412                    self.peek_token(),
5413                );
5414            }
5415            if self.consume_token(&Token::Comma) {
5416                // Continue.
5417            } else if self.consume_token(&Token::RParen) {
5418                break;
5419            } else {
5420                return self.expected(
5421                    self.peek_pos(),
5422                    "',' or ')' after column definition",
5423                    self.peek_token(),
5424                );
5425            }
5426        }
5427
5428        Ok((columns, constraints))
5429    }
5430
5431    fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5432        let name = if self.parse_keyword(CONSTRAINT) {
5433            Some(self.parse_identifier()?)
5434        } else {
5435            None
5436        };
5437
5438        let option = if self.parse_keywords(&[NOT, NULL]) {
5439            ColumnOption::NotNull
5440        } else if self.parse_keyword(NULL) {
5441            ColumnOption::Null
5442        } else if self.parse_keyword(DEFAULT) {
5443            ColumnOption::Default(self.parse_expr()?)
5444        } else if self.parse_keywords(&[PRIMARY, KEY]) {
5445            ColumnOption::Unique { is_primary: true }
5446        } else if self.parse_keyword(UNIQUE) {
5447            ColumnOption::Unique { is_primary: false }
5448        } else if self.parse_keyword(REFERENCES) {
5449            let foreign_table = self.parse_item_name()?;
5450            let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5451            ColumnOption::ForeignKey {
5452                foreign_table,
5453                referred_columns,
5454            }
5455        } else if self.parse_keyword(CHECK) {
5456            self.expect_token(&Token::LParen)?;
5457            let expr = self.parse_expr()?;
5458            self.expect_token(&Token::RParen)?;
5459            ColumnOption::Check(expr)
5460        } else if self.parse_keyword(VERSION) {
5461            self.expect_keyword(ADDED)?;
5462            let action = ColumnVersioned::Added;
5463            let version = self.parse_version()?;
5464
5465            ColumnOption::Versioned { action, version }
5466        } else {
5467            return self.expected(self.peek_pos(), "column option", self.peek_token());
5468        };
5469
5470        Ok(ColumnOptionDef { name, option })
5471    }
5472
5473    fn parse_optional_table_constraint(
5474        &mut self,
5475    ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5476        let name = if self.parse_keyword(CONSTRAINT) {
5477            Some(self.parse_identifier()?)
5478        } else {
5479            None
5480        };
5481        match self.next_token() {
5482            Some(Token::Keyword(PRIMARY)) => {
5483                self.expect_keyword(KEY)?;
5484                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5485                Ok(Some(TableConstraint::Unique {
5486                    name,
5487                    columns,
5488                    is_primary: true,
5489                    nulls_not_distinct: false,
5490                }))
5491            }
5492            Some(Token::Keyword(UNIQUE)) => {
5493                let nulls_not_distinct = if self.parse_keyword(NULLS) {
5494                    self.expect_keywords(&[NOT, DISTINCT])?;
5495                    true
5496                } else {
5497                    false
5498                };
5499
5500                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5501                Ok(Some(TableConstraint::Unique {
5502                    name,
5503                    columns,
5504                    is_primary: false,
5505                    nulls_not_distinct,
5506                }))
5507            }
5508            Some(Token::Keyword(FOREIGN)) => {
5509                self.expect_keyword(KEY)?;
5510                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5511                self.expect_keyword(REFERENCES)?;
5512                let foreign_table = self.parse_raw_name()?;
5513                let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5514                Ok(Some(TableConstraint::ForeignKey {
5515                    name,
5516                    columns,
5517                    foreign_table,
5518                    referred_columns,
5519                }))
5520            }
5521            Some(Token::Keyword(CHECK)) => {
5522                self.expect_token(&Token::LParen)?;
5523                let expr = Box::new(self.parse_expr()?);
5524                self.expect_token(&Token::RParen)?;
5525                Ok(Some(TableConstraint::Check { name, expr }))
5526            }
5527            unexpected => {
5528                if name.is_some() {
5529                    self.expected(
5530                        self.peek_prev_pos(),
5531                        "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5532                        unexpected,
5533                    )
5534                } else {
5535                    self.prev_token();
5536                    Ok(None)
5537                }
5538            }
5539        }
5540    }
5541
5542    fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5543        let _ = self.consume_token(&Token::Eq);
5544        Ok(WithOptionValue::Item(self.parse_raw_name()?))
5545    }
5546
5547    fn parse_optional_connection_credential_option_value(
5548        &mut self,
5549    ) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5550        match self.peek_token() {
5551            Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5552            _ => {
5553                let _ = self.consume_token(&Token::Eq);
5554                Ok(Some(self.parse_connection_credential_option_value()?))
5555            }
5556        }
5557    }
5558
5559    fn parse_connection_credential_option_value(
5560        &mut self,
5561    ) -> Result<WithOptionValue<Raw>, ParserError> {
5562        if self.parse_keyword(SECRET) {
5563            if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5564                Ok(WithOptionValue::Secret(secret))
5565            } else {
5566                Ok(WithOptionValue::Value(Value::String("secret".to_string())))
5567            }
5568        } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5569            Ok(WithOptionValue::Value(value))
5570        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
5571            Ok(WithOptionValue::Value(Value::String(ident.into_string())))
5572        } else {
5573            self.expected(
5574                self.peek_pos(),
5575                "connection credential value",
5576                self.peek_token(),
5577            )
5578        }
5579    }
5580
5581    fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5582        // The next token might be a value and might not. The only valid things
5583        // that indicate no value would be `)` for end-of-options , `,` for
5584        // another-option, or ';'/nothing for end-of-statement. Either of those
5585        // means there's no value, anything else means we expect a valid value.
5586        match self.peek_token() {
5587            Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5588            _ => {
5589                let _ = self.consume_token(&Token::Eq);
5590                Ok(Some(self.parse_option_value()?))
5591            }
5592        }
5593    }
5594
5595    fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5596    where
5597        F: FnMut(&mut Self) -> Result<T, ParserError>,
5598    {
5599        Ok(if self.consume_token(&Token::LParen) {
5600            let options = if self.consume_token(&Token::RParen) {
5601                vec![]
5602            } else {
5603                let options = self.parse_comma_separated(f)?;
5604                self.expect_token(&Token::RParen)?;
5605                options
5606            };
5607
5608            Some(options)
5609        } else if self.consume_token(&Token::LBracket) {
5610            let options = if self.consume_token(&Token::RBracket) {
5611                vec![]
5612            } else {
5613                let options = self.parse_comma_separated(f)?;
5614
5615                self.expect_token(&Token::RBracket)?;
5616                options
5617            };
5618
5619            Some(options)
5620        } else {
5621            None
5622        })
5623    }
5624
5625    fn parse_option_map(
5626        &mut self,
5627    ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5628        Ok(if self.parse_keyword(MAP) {
5629            self.expect_token(&Token::LBracket)?;
5630            let mut map = BTreeMap::new();
5631            loop {
5632                if let Some(Token::RBracket) = self.peek_token() {
5633                    break;
5634                }
5635                let key = match self.next_token() {
5636                    Some(Token::String(s)) => s,
5637                    token => return self.expected(self.peek_pos(), "string", token),
5638                };
5639                self.expect_token(&Token::Arrow)?;
5640                let value = Parser::parse_option_value(self)?;
5641                map.insert(key, value);
5642                if !self.consume_token(&Token::Comma) {
5643                    break;
5644                }
5645            }
5646            self.expect_token(&Token::RBracket)?;
5647            Some(map)
5648        } else {
5649            None
5650        })
5651    }
5652
5653    fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5654        if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5655            Ok(WithOptionValue::Sequence(seq))
5656        } else if let Some(map) = self.parse_option_map()? {
5657            Ok(WithOptionValue::Map(map))
5658        } else if self.parse_keyword(SECRET) {
5659            if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5660                Ok(WithOptionValue::Secret(secret))
5661            } else {
5662                Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5663                    vec![ident!("secret")],
5664                )))
5665            }
5666        } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5667            Ok(WithOptionValue::Value(value))
5668        } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5669            Ok(WithOptionValue::UnresolvedItemName(item_name))
5670        } else {
5671            self.expected(self.peek_pos(), "option value", self.peek_token())
5672        }
5673    }
5674
5675    fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5676        let _ = self.consume_token(&Token::Eq);
5677        Ok(WithOptionValue::DataType(self.parse_data_type()?))
5678    }
5679
5680    fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5681        if self.parse_keyword(SYSTEM) {
5682            self.parse_alter_system()
5683        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5684            self.parse_alter_default_privileges()
5685                .map_parser_err(StatementKind::AlterDefaultPrivileges)
5686        } else {
5687            self.parse_alter_object()
5688        }
5689    }
5690
5691    fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5692        let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5693
5694        match object_type {
5695            ObjectType::Role => self
5696                .parse_alter_role()
5697                .map_parser_err(StatementKind::AlterRole),
5698            ObjectType::Sink => self.parse_alter_sink(),
5699            ObjectType::Source => self.parse_alter_source(),
5700            ObjectType::Index => self.parse_alter_index(),
5701            ObjectType::Secret => self.parse_alter_secret(),
5702            ObjectType::Connection => self.parse_alter_connection(),
5703            ObjectType::View | ObjectType::MaterializedView | ObjectType::Table => {
5704                self.parse_alter_views(object_type)
5705            }
5706            ObjectType::Type => {
5707                let if_exists = self
5708                    .parse_if_exists()
5709                    .map_parser_err(StatementKind::AlterOwner)?;
5710                let name = UnresolvedObjectName::Item(
5711                    self.parse_item_name()
5712                        .map_parser_err(StatementKind::AlterOwner)?,
5713                );
5714                self.expect_keywords(&[OWNER, TO])
5715                    .map_parser_err(StatementKind::AlterOwner)?;
5716                let new_owner = self
5717                    .parse_identifier()
5718                    .map_parser_err(StatementKind::AlterOwner)?;
5719                Ok(Statement::AlterOwner(AlterOwnerStatement {
5720                    object_type,
5721                    if_exists,
5722                    name,
5723                    new_owner,
5724                }))
5725            }
5726            ObjectType::Cluster => self.parse_alter_cluster(object_type),
5727            ObjectType::ClusterReplica => {
5728                let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5729                let name = UnresolvedObjectName::ClusterReplica(
5730                    self.parse_cluster_replica_name()
5731                        .map_no_statement_parser_err()?,
5732                );
5733                let action = self
5734                    .expect_one_of_keywords(&[OWNER, RENAME])
5735                    .map_no_statement_parser_err()?;
5736                self.expect_keyword(TO).map_no_statement_parser_err()?;
5737                match action {
5738                    OWNER => {
5739                        let new_owner = self
5740                            .parse_identifier()
5741                            .map_parser_err(StatementKind::AlterOwner)?;
5742                        Ok(Statement::AlterOwner(AlterOwnerStatement {
5743                            object_type,
5744                            if_exists,
5745                            name,
5746                            new_owner,
5747                        }))
5748                    }
5749                    RENAME => {
5750                        let to_item_name = self
5751                            .parse_identifier()
5752                            .map_parser_err(StatementKind::AlterObjectRename)?;
5753                        Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5754                            object_type,
5755                            if_exists,
5756                            name,
5757                            to_item_name,
5758                        }))
5759                    }
5760                    _ => unreachable!(),
5761                }
5762            }
5763            ObjectType::Database => {
5764                let if_exists = self
5765                    .parse_if_exists()
5766                    .map_parser_err(StatementKind::AlterOwner)?;
5767                let name = UnresolvedObjectName::Database(
5768                    self.parse_database_name()
5769                        .map_parser_err(StatementKind::AlterOwner)?,
5770                );
5771                self.expect_keywords(&[OWNER, TO])
5772                    .map_parser_err(StatementKind::AlterOwner)?;
5773                let new_owner = self
5774                    .parse_identifier()
5775                    .map_parser_err(StatementKind::AlterOwner)?;
5776                Ok(Statement::AlterOwner(AlterOwnerStatement {
5777                    object_type,
5778                    if_exists,
5779                    name,
5780                    new_owner,
5781                }))
5782            }
5783            ObjectType::Schema => self.parse_alter_schema(object_type),
5784            ObjectType::NetworkPolicy => self
5785                .parse_alter_network_policy()
5786                .map_parser_err(StatementKind::AlterNetworkPolicy),
5787            ObjectType::Func | ObjectType::Subsource => parser_err!(
5788                self,
5789                self.peek_prev_pos(),
5790                format!("Unsupported ALTER on {object_type}")
5791            )
5792            .map_no_statement_parser_err(),
5793        }
5794    }
5795
5796    fn parse_alter_cluster(
5797        &mut self,
5798        object_type: ObjectType,
5799    ) -> Result<Statement<Raw>, ParserStatementError> {
5800        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5801        let name = self.parse_identifier().map_no_statement_parser_err()?;
5802        let action = self
5803            .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
5804            .map_no_statement_parser_err()?;
5805        match action {
5806            OWNER => {
5807                self.expect_keyword(TO)
5808                    .map_parser_err(StatementKind::AlterOwner)?;
5809                let new_owner = self
5810                    .parse_identifier()
5811                    .map_parser_err(StatementKind::AlterOwner)?;
5812                let name = UnresolvedObjectName::Cluster(name);
5813                Ok(Statement::AlterOwner(AlterOwnerStatement {
5814                    object_type,
5815                    if_exists,
5816                    name,
5817                    new_owner,
5818                }))
5819            }
5820            RENAME => {
5821                self.expect_keyword(TO)
5822                    .map_parser_err(StatementKind::AlterObjectRename)?;
5823                let to_item_name = self
5824                    .parse_identifier()
5825                    .map_parser_err(StatementKind::AlterObjectRename)?;
5826                let name = UnresolvedObjectName::Cluster(name);
5827                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5828                    object_type,
5829                    if_exists,
5830                    name,
5831                    to_item_name,
5832                }))
5833            }
5834            RESET => {
5835                self.expect_token(&Token::LParen)
5836                    .map_parser_err(StatementKind::AlterCluster)?;
5837                let names = self
5838                    .parse_comma_separated(Parser::parse_cluster_option_name)
5839                    .map_parser_err(StatementKind::AlterCluster)?;
5840                self.expect_token(&Token::RParen)
5841                    .map_parser_err(StatementKind::AlterCluster)?;
5842                Ok(Statement::AlterCluster(AlterClusterStatement {
5843                    if_exists,
5844                    name,
5845                    action: AlterClusterAction::ResetOptions(names),
5846                }))
5847            }
5848            SET => {
5849                self.expect_token(&Token::LParen)
5850                    .map_parser_err(StatementKind::AlterCluster)?;
5851                let options = self
5852                    .parse_comma_separated(Parser::parse_cluster_option)
5853                    .map_parser_err(StatementKind::AlterCluster)?;
5854                self.expect_token(&Token::RParen)
5855                    .map_parser_err(StatementKind::AlterCluster)?;
5856                let with_options = if self.parse_keyword(WITH) {
5857                    self.expect_token(&Token::LParen)
5858                        .map_parser_err(StatementKind::AlterCluster)?;
5859                    let options = self
5860                        .parse_comma_separated(Parser::parse_alter_cluster_option)
5861                        .map_parser_err(StatementKind::AlterCluster)?;
5862                    self.expect_token(&Token::RParen)
5863                        .map_parser_err(StatementKind::AlterCluster)?;
5864                    options
5865                } else {
5866                    vec![]
5867                };
5868                Ok(Statement::AlterCluster(AlterClusterStatement {
5869                    if_exists,
5870                    name,
5871                    action: AlterClusterAction::SetOptions {
5872                        options,
5873                        with_options,
5874                    },
5875                }))
5876            }
5877            SWAP => {
5878                self.expect_keyword(WITH)
5879                    .map_parser_err(StatementKind::AlterObjectSwap)?;
5880                let name_b = self
5881                    .parse_identifier()
5882                    .map_parser_err(StatementKind::AlterObjectSwap)?;
5883
5884                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
5885                    object_type,
5886                    if_exists,
5887                    name_a: UnresolvedObjectName::Cluster(name),
5888                    name_b,
5889                }))
5890            }
5891            _ => unreachable!(),
5892        }
5893    }
5894
5895    fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5896        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5897        let source_name = self.parse_item_name().map_no_statement_parser_err()?;
5898
5899        Ok(
5900            match self
5901                .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
5902                .map_no_statement_parser_err()?
5903            {
5904                ADD => {
5905                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5906                        .map_parser_err(StatementKind::AlterSource)?;
5907
5908                    // TODO: Add IF NOT EXISTS?
5909                    let subsources = self
5910                        .parse_comma_separated(Parser::parse_subsource_references)
5911                        .map_parser_err(StatementKind::AlterSource)?;
5912
5913                    let options = if self.parse_keyword(WITH) {
5914                        self.expect_token(&Token::LParen)
5915                            .map_parser_err(StatementKind::AlterSource)?;
5916                        let options = self
5917                            .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
5918                            .map_parser_err(StatementKind::AlterSource)?;
5919                        self.expect_token(&Token::RParen)
5920                            .map_parser_err(StatementKind::AlterSource)?;
5921                        options
5922                    } else {
5923                        vec![]
5924                    };
5925
5926                    Statement::AlterSource(AlterSourceStatement {
5927                        source_name,
5928                        if_exists,
5929                        action: AlterSourceAction::AddSubsources {
5930                            external_references: subsources,
5931                            options,
5932                        },
5933                    })
5934                }
5935                DROP => {
5936                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5937                        .map_parser_err(StatementKind::AlterSource)?;
5938
5939                    let if_exists_inner = self
5940                        .parse_if_exists()
5941                        .map_parser_err(StatementKind::AlterSource)?;
5942
5943                    let names = self
5944                        .parse_comma_separated(Parser::parse_item_name)
5945                        .map_parser_err(StatementKind::AlterSource)?;
5946
5947                    let cascade = matches!(
5948                        self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
5949                            .map_parser_err(StatementKind::AlterSource)?,
5950                        Some(CASCADE),
5951                    );
5952
5953                    Statement::AlterSource(AlterSourceStatement {
5954                        source_name,
5955                        if_exists,
5956                        action: AlterSourceAction::DropSubsources {
5957                            if_exists: if_exists_inner,
5958                            cascade,
5959                            names,
5960                        },
5961                    })
5962                }
5963                RESET => {
5964                    self.expect_token(&Token::LParen)
5965                        .map_parser_err(StatementKind::AlterSource)?;
5966                    let reset_options = self
5967                        .parse_comma_separated(Parser::parse_source_option_name)
5968                        .map_parser_err(StatementKind::AlterSource)?;
5969                    self.expect_token(&Token::RParen)
5970                        .map_parser_err(StatementKind::AlterSource)?;
5971
5972                    Statement::AlterSource(AlterSourceStatement {
5973                        source_name,
5974                        if_exists,
5975                        action: AlterSourceAction::ResetOptions(reset_options),
5976                    })
5977                }
5978                SET => {
5979                    if let Some(stmt) = self.maybe_parse_alter_set_cluster(
5980                        if_exists,
5981                        &source_name,
5982                        ObjectType::Source,
5983                    ) {
5984                        return stmt;
5985                    }
5986                    self.expect_token(&Token::LParen)
5987                        .map_parser_err(StatementKind::AlterSource)?;
5988                    let set_options = self
5989                        .parse_comma_separated(Parser::parse_source_option)
5990                        .map_parser_err(StatementKind::AlterSource)?;
5991                    self.expect_token(&Token::RParen)
5992                        .map_parser_err(StatementKind::AlterSource)?;
5993                    Statement::AlterSource(AlterSourceStatement {
5994                        source_name,
5995                        if_exists,
5996                        action: AlterSourceAction::SetOptions(set_options),
5997                    })
5998                }
5999                RENAME => {
6000                    self.expect_keyword(TO)
6001                        .map_parser_err(StatementKind::AlterObjectRename)?;
6002                    let to_item_name = self
6003                        .parse_identifier()
6004                        .map_parser_err(StatementKind::AlterObjectRename)?;
6005
6006                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6007                        object_type: ObjectType::Source,
6008                        if_exists,
6009                        name: UnresolvedObjectName::Item(source_name),
6010                        to_item_name,
6011                    })
6012                }
6013                OWNER => {
6014                    self.expect_keyword(TO)
6015                        .map_parser_err(StatementKind::AlterOwner)?;
6016                    let new_owner = self
6017                        .parse_identifier()
6018                        .map_parser_err(StatementKind::AlterOwner)?;
6019
6020                    Statement::AlterOwner(AlterOwnerStatement {
6021                        object_type: ObjectType::Source,
6022                        if_exists,
6023                        name: UnresolvedObjectName::Item(source_name),
6024                        new_owner,
6025                    })
6026                }
6027                REFRESH => {
6028                    self.expect_keyword(REFERENCES)
6029                        .map_parser_err(StatementKind::AlterSource)?;
6030                    Statement::AlterSource(AlterSourceStatement {
6031                        source_name,
6032                        if_exists,
6033                        action: AlterSourceAction::RefreshReferences,
6034                    })
6035                }
6036                _ => unreachable!(),
6037            },
6038        )
6039    }
6040
6041    fn parse_alter_source_add_subsource_option(
6042        &mut self,
6043    ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6044        match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6045            ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6046                self.expect_keyword(COLUMNS)?;
6047
6048                let _ = self.consume_token(&Token::Eq);
6049
6050                let value = self
6051                    .parse_option_sequence(Parser::parse_item_name)?
6052                    .map(|inner| {
6053                        WithOptionValue::Sequence(
6054                            inner
6055                                .into_iter()
6056                                .map(WithOptionValue::UnresolvedItemName)
6057                                .collect_vec(),
6058                        )
6059                    });
6060
6061                Ok(AlterSourceAddSubsourceOption {
6062                    name: match *keyword {
6063                        TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6064                        // IGNORE is historical syntax for this option.
6065                        EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6066                        _ => unreachable!(),
6067                    },
6068                    value,
6069                })
6070            }
6071            _ => unreachable!(),
6072        }
6073    }
6074
6075    fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6076        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6077        let name = self.parse_item_name().map_no_statement_parser_err()?;
6078
6079        Ok(
6080            match self
6081                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6082                .map_no_statement_parser_err()?
6083            {
6084                RESET => {
6085                    self.expect_token(&Token::LParen)
6086                        .map_parser_err(StatementKind::AlterIndex)?;
6087                    let reset_options = self
6088                        .parse_comma_separated(Parser::parse_index_option_name)
6089                        .map_parser_err(StatementKind::AlterIndex)?;
6090                    self.expect_token(&Token::RParen)
6091                        .map_parser_err(StatementKind::AlterIndex)?;
6092
6093                    Statement::AlterIndex(AlterIndexStatement {
6094                        index_name: name,
6095                        if_exists,
6096                        action: AlterIndexAction::ResetOptions(reset_options),
6097                    })
6098                }
6099                SET => {
6100                    self.expect_token(&Token::LParen)
6101                        .map_parser_err(StatementKind::AlterIndex)?;
6102                    let set_options = self
6103                        .parse_comma_separated(Parser::parse_index_option)
6104                        .map_parser_err(StatementKind::AlterIndex)?;
6105                    self.expect_token(&Token::RParen)
6106                        .map_parser_err(StatementKind::AlterIndex)?;
6107                    Statement::AlterIndex(AlterIndexStatement {
6108                        index_name: name,
6109                        if_exists,
6110                        action: AlterIndexAction::SetOptions(set_options),
6111                    })
6112                }
6113                RENAME => {
6114                    self.expect_keyword(TO)
6115                        .map_parser_err(StatementKind::AlterObjectRename)?;
6116                    let to_item_name = self
6117                        .parse_identifier()
6118                        .map_parser_err(StatementKind::AlterObjectRename)?;
6119
6120                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6121                        object_type: ObjectType::Index,
6122                        if_exists,
6123                        name: UnresolvedObjectName::Item(name),
6124                        to_item_name,
6125                    })
6126                }
6127                OWNER => {
6128                    self.expect_keyword(TO)
6129                        .map_parser_err(StatementKind::AlterOwner)?;
6130                    let new_owner = self
6131                        .parse_identifier()
6132                        .map_parser_err(StatementKind::AlterOwner)?;
6133
6134                    Statement::AlterOwner(AlterOwnerStatement {
6135                        object_type: ObjectType::Index,
6136                        if_exists,
6137                        name: UnresolvedObjectName::Item(name),
6138                        new_owner,
6139                    })
6140                }
6141                _ => unreachable!(),
6142            },
6143        )
6144    }
6145
6146    fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6147        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6148        let name = self.parse_item_name().map_no_statement_parser_err()?;
6149
6150        Ok(
6151            match self
6152                .expect_one_of_keywords(&[AS, RENAME, OWNER])
6153                .map_no_statement_parser_err()?
6154            {
6155                AS => {
6156                    let value = self
6157                        .parse_expr()
6158                        .map_parser_err(StatementKind::AlterSecret)?;
6159                    Statement::AlterSecret(AlterSecretStatement {
6160                        name,
6161                        if_exists,
6162                        value,
6163                    })
6164                }
6165                RENAME => {
6166                    self.expect_keyword(TO)
6167                        .map_parser_err(StatementKind::AlterObjectRename)?;
6168                    let to_item_name = self
6169                        .parse_identifier()
6170                        .map_parser_err(StatementKind::AlterObjectRename)?;
6171
6172                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6173                        object_type: ObjectType::Secret,
6174                        if_exists,
6175                        name: UnresolvedObjectName::Item(name),
6176                        to_item_name,
6177                    })
6178                }
6179                OWNER => {
6180                    self.expect_keyword(TO)
6181                        .map_parser_err(StatementKind::AlterOwner)?;
6182                    let new_owner = self
6183                        .parse_identifier()
6184                        .map_parser_err(StatementKind::AlterOwner)?;
6185
6186                    Statement::AlterOwner(AlterOwnerStatement {
6187                        object_type: ObjectType::Secret,
6188                        if_exists,
6189                        name: UnresolvedObjectName::Item(name),
6190                        new_owner,
6191                    })
6192                }
6193                _ => unreachable!(),
6194            },
6195        )
6196    }
6197
6198    /// Parse an ALTER SINK statement.
6199    fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6200        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6201        let name = self.parse_item_name().map_no_statement_parser_err()?;
6202
6203        Ok(
6204            match self
6205                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6206                .map_no_statement_parser_err()?
6207            {
6208                RESET => {
6209                    self.expect_token(&Token::LParen)
6210                        .map_parser_err(StatementKind::AlterSink)?;
6211                    let reset_options = self
6212                        .parse_comma_separated(Parser::parse_create_sink_option_name)
6213                        .map_parser_err(StatementKind::AlterSink)?;
6214                    self.expect_token(&Token::RParen)
6215                        .map_parser_err(StatementKind::AlterSink)?;
6216
6217                    Statement::AlterSink(AlterSinkStatement {
6218                        sink_name: name,
6219                        if_exists,
6220                        action: AlterSinkAction::ResetOptions(reset_options),
6221                    })
6222                }
6223                SET => {
6224                    if let Some(result) =
6225                        self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6226                    {
6227                        return result;
6228                    }
6229
6230                    if self.parse_keyword(FROM) {
6231                        let from = self
6232                            .parse_raw_name()
6233                            .map_parser_err(StatementKind::AlterSink)?;
6234
6235                        Statement::AlterSink(AlterSinkStatement {
6236                            sink_name: name,
6237                            if_exists,
6238                            action: AlterSinkAction::ChangeRelation(from),
6239                        })
6240                    } else {
6241                        self.expect_token(&Token::LParen)
6242                            .map_parser_err(StatementKind::AlterSink)?;
6243                        let set_options = self
6244                            .parse_comma_separated(Parser::parse_create_sink_option)
6245                            .map_parser_err(StatementKind::AlterSink)?;
6246                        self.expect_token(&Token::RParen)
6247                            .map_parser_err(StatementKind::AlterSink)?;
6248                        Statement::AlterSink(AlterSinkStatement {
6249                            sink_name: name,
6250                            if_exists,
6251                            action: AlterSinkAction::SetOptions(set_options),
6252                        })
6253                    }
6254                }
6255                RENAME => {
6256                    self.expect_keyword(TO)
6257                        .map_parser_err(StatementKind::AlterObjectRename)?;
6258                    let to_item_name = self
6259                        .parse_identifier()
6260                        .map_parser_err(StatementKind::AlterObjectRename)?;
6261
6262                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6263                        object_type: ObjectType::Sink,
6264                        if_exists,
6265                        name: UnresolvedObjectName::Item(name),
6266                        to_item_name,
6267                    })
6268                }
6269                OWNER => {
6270                    self.expect_keyword(TO)
6271                        .map_parser_err(StatementKind::AlterOwner)?;
6272                    let new_owner = self
6273                        .parse_identifier()
6274                        .map_parser_err(StatementKind::AlterOwner)?;
6275
6276                    Statement::AlterOwner(AlterOwnerStatement {
6277                        object_type: ObjectType::Sink,
6278                        if_exists,
6279                        name: UnresolvedObjectName::Item(name),
6280                        new_owner,
6281                    })
6282                }
6283                _ => unreachable!(),
6284            },
6285        )
6286    }
6287
6288    /// Parse an ALTER SYSTEM statement.
6289    fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6290        match self
6291            .expect_one_of_keywords(&[SET, RESET])
6292            .map_no_statement_parser_err()?
6293        {
6294            SET => {
6295                let name = self
6296                    .parse_identifier()
6297                    .map_parser_err(StatementKind::AlterSystemSet)?;
6298                self.expect_keyword_or_token(TO, &Token::Eq)
6299                    .map_parser_err(StatementKind::AlterSystemSet)?;
6300                let to = self
6301                    .parse_set_variable_to()
6302                    .map_parser_err(StatementKind::AlterSystemSet)?;
6303                Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6304                    name,
6305                    to,
6306                }))
6307            }
6308            RESET => {
6309                if self.parse_keyword(ALL) {
6310                    Ok(Statement::AlterSystemResetAll(
6311                        AlterSystemResetAllStatement {},
6312                    ))
6313                } else {
6314                    let name = self
6315                        .parse_identifier()
6316                        .map_parser_err(StatementKind::AlterSystemReset)?;
6317                    Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6318                        name,
6319                    }))
6320                }
6321            }
6322            _ => unreachable!(),
6323        }
6324    }
6325
6326    fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6327        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6328        let name = self.parse_item_name().map_no_statement_parser_err()?;
6329
6330        Ok(
6331            match self
6332                .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6333                .map_no_statement_parser_err()?
6334            {
6335                RENAME => {
6336                    self.expect_keyword(TO)
6337                        .map_parser_err(StatementKind::AlterObjectRename)?;
6338                    let to_item_name = self
6339                        .parse_identifier()
6340                        .map_parser_err(StatementKind::AlterObjectRename)?;
6341
6342                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6343                        object_type: ObjectType::Connection,
6344                        if_exists,
6345                        name: UnresolvedObjectName::Item(name),
6346                        to_item_name,
6347                    })
6348                }
6349                OWNER => {
6350                    self.expect_keyword(TO)
6351                        .map_parser_err(StatementKind::AlterOwner)?;
6352                    let new_owner = self
6353                        .parse_identifier()
6354                        .map_parser_err(StatementKind::AlterOwner)?;
6355
6356                    Statement::AlterOwner(AlterOwnerStatement {
6357                        object_type: ObjectType::Connection,
6358                        if_exists,
6359                        name: UnresolvedObjectName::Item(name),
6360                        new_owner,
6361                    })
6362                }
6363                _ => {
6364                    self.prev_token();
6365                    let actions = self
6366                        .parse_comma_separated(Parser::parse_alter_connection_action)
6367                        .map_parser_err(StatementKind::AlterConnection)?;
6368
6369                    let with_options = if self.parse_keyword(WITH) {
6370                        self.expect_token(&Token::LParen)
6371                            .map_parser_err(StatementKind::AlterConnection)?;
6372                        let options = self
6373                            .parse_comma_separated(Parser::parse_alter_connection_option)
6374                            .map_parser_err(StatementKind::AlterConnection)?;
6375                        self.expect_token(&Token::RParen)
6376                            .map_parser_err(StatementKind::AlterConnection)?;
6377                        options
6378                    } else {
6379                        vec![]
6380                    };
6381
6382                    Statement::AlterConnection(AlterConnectionStatement {
6383                        name,
6384                        if_exists,
6385                        actions,
6386                        with_options,
6387                    })
6388                }
6389            },
6390        )
6391    }
6392
6393    fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6394        let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6395            ROTATE => {
6396                self.expect_keyword(KEYS)?;
6397                AlterConnectionAction::RotateKeys
6398            }
6399            SET => {
6400                self.expect_token(&Token::LParen)?;
6401                let option = self.parse_connection_option_unified()?;
6402                self.expect_token(&Token::RParen)?;
6403                AlterConnectionAction::SetOption(option)
6404            }
6405            DROP | RESET => {
6406                self.expect_token(&Token::LParen)?;
6407                let option = self.parse_connection_option_name()?;
6408                self.expect_token(&Token::RParen)?;
6409                AlterConnectionAction::DropOption(option)
6410            }
6411            _ => unreachable!(),
6412        };
6413
6414        Ok(r)
6415    }
6416
6417    /// Parses a single valid option in the WITH block of a create source
6418    fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6419        let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6420            VALIDATE => AlterConnectionOptionName::Validate,
6421            _ => unreachable!(),
6422        };
6423
6424        Ok(AlterConnectionOption {
6425            name,
6426            value: self.parse_optional_option_value()?,
6427        })
6428    }
6429
6430    fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6431        let name = self.parse_identifier()?;
6432
6433        let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6434            Some(SET) => {
6435                let name = self.parse_identifier()?;
6436                self.expect_keyword_or_token(TO, &Token::Eq)?;
6437                let value = self.parse_set_variable_to()?;
6438                let var = SetRoleVar::Set { name, value };
6439                AlterRoleOption::Variable(var)
6440            }
6441            Some(RESET) => {
6442                let name = self.parse_identifier()?;
6443                let var = SetRoleVar::Reset { name };
6444                AlterRoleOption::Variable(var)
6445            }
6446            Some(WITH) | None => {
6447                let _ = self.parse_keyword(WITH);
6448                let attrs = self.parse_role_attributes()?;
6449                AlterRoleOption::Attributes(attrs)
6450            }
6451            Some(k) => unreachable!("unmatched keyword: {k}"),
6452        };
6453
6454        Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6455    }
6456
6457    fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6458        self.expect_keyword(FOR)?;
6459        let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6460            ROLE | USER => TargetRoleSpecification::Roles(
6461                self.parse_comma_separated(Parser::parse_identifier)?,
6462            ),
6463            ALL => {
6464                self.expect_keyword(ROLES)?;
6465                TargetRoleSpecification::AllRoles
6466            }
6467            _ => unreachable!(),
6468        };
6469        let target_objects = if self.parse_keyword(IN) {
6470            match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6471                SCHEMA => GrantTargetAllSpecification::AllSchemas {
6472                    schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6473                },
6474                DATABASE => GrantTargetAllSpecification::AllDatabases {
6475                    databases: self.parse_comma_separated(Parser::parse_database_name)?,
6476                },
6477                _ => unreachable!(),
6478            }
6479        } else {
6480            GrantTargetAllSpecification::All
6481        };
6482        let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6483        let privileges = self.parse_privilege_specification().ok_or_else(|| {
6484            self.expected::<_, PrivilegeSpecification>(
6485                self.peek_pos(),
6486                "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6487                self.peek_token(),
6488            )
6489            .expect_err("only returns errors")
6490        })?;
6491        self.expect_keyword(ON)?;
6492        let object_type =
6493            self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6494        if is_grant {
6495            self.expect_keyword(TO)?;
6496        } else {
6497            self.expect_keyword(FROM)?;
6498        }
6499        let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6500
6501        let grant_or_revoke = if is_grant {
6502            AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6503                privileges,
6504                object_type,
6505                grantees,
6506            })
6507        } else {
6508            AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6509                privileges,
6510                object_type,
6511                revokees: grantees,
6512            })
6513        };
6514
6515        Ok(Statement::AlterDefaultPrivileges(
6516            AlterDefaultPrivilegesStatement {
6517                target_roles,
6518                target_objects,
6519                grant_or_revoke,
6520            },
6521        ))
6522    }
6523
6524    fn parse_alter_views(
6525        &mut self,
6526        object_type: ObjectType,
6527    ) -> Result<Statement<Raw>, ParserStatementError> {
6528        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6529        let name = self.parse_item_name().map_no_statement_parser_err()?;
6530        let keywords: &[_] = match object_type {
6531            ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6532            ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6533            ObjectType::View => &[SET, RENAME, OWNER, RESET],
6534            ObjectType::Source
6535            | ObjectType::Sink
6536            | ObjectType::Index
6537            | ObjectType::Type
6538            | ObjectType::Role
6539            | ObjectType::Cluster
6540            | ObjectType::ClusterReplica
6541            | ObjectType::Secret
6542            | ObjectType::Connection
6543            | ObjectType::Database
6544            | ObjectType::Schema
6545            | ObjectType::Func
6546            | ObjectType::Subsource
6547            | ObjectType::NetworkPolicy => {
6548                unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6549            }
6550        };
6551
6552        let action = self
6553            .expect_one_of_keywords(keywords)
6554            .map_no_statement_parser_err()?;
6555        match action {
6556            RENAME => {
6557                self.expect_keyword(TO).map_no_statement_parser_err()?;
6558                let to_item_name = self
6559                    .parse_identifier()
6560                    .map_parser_err(StatementKind::AlterObjectRename)?;
6561                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6562                    object_type,
6563                    if_exists,
6564                    name: UnresolvedObjectName::Item(name),
6565                    to_item_name,
6566                }))
6567            }
6568            SET => {
6569                if self.parse_keyword(CLUSTER) {
6570                    self.parse_alter_set_cluster(if_exists, name, object_type)
6571                } else {
6572                    self.expect_token(&Token::LParen)
6573                        .map_no_statement_parser_err()?;
6574                    self.expect_keywords(&[RETAIN, HISTORY])
6575                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6576                    let history = self
6577                        .parse_retain_history()
6578                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6579                    self.expect_token(&Token::RParen)
6580                        .map_parser_err(StatementKind::AlterCluster)?;
6581                    Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6582                        object_type,
6583                        if_exists,
6584                        name: UnresolvedObjectName::Item(name),
6585                        history: Some(history),
6586                    }))
6587                }
6588            }
6589            RESET => {
6590                self.expect_token(&Token::LParen)
6591                    .map_no_statement_parser_err()?;
6592                self.expect_keywords(&[RETAIN, HISTORY])
6593                    .map_parser_err(StatementKind::AlterRetainHistory)?;
6594                self.expect_token(&Token::RParen)
6595                    .map_no_statement_parser_err()?;
6596                Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6597                    object_type,
6598                    if_exists,
6599                    name: UnresolvedObjectName::Item(name),
6600                    history: None,
6601                }))
6602            }
6603            OWNER => {
6604                self.expect_keyword(TO).map_no_statement_parser_err()?;
6605                let new_owner = self
6606                    .parse_identifier()
6607                    .map_parser_err(StatementKind::AlterOwner)?;
6608                Ok(Statement::AlterOwner(AlterOwnerStatement {
6609                    object_type,
6610                    if_exists,
6611                    name: UnresolvedObjectName::Item(name),
6612                    new_owner,
6613                }))
6614            }
6615            ADD => {
6616                assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6617
6618                self.expect_keyword(COLUMN)
6619                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6620                let if_col_not_exist = self
6621                    .parse_if_not_exists()
6622                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6623                let column_name = self
6624                    .parse_identifier()
6625                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6626                let data_type = self
6627                    .parse_data_type()
6628                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6629
6630                Ok(Statement::AlterTableAddColumn(
6631                    AlterTableAddColumnStatement {
6632                        if_exists,
6633                        name,
6634                        if_col_not_exist,
6635                        column_name,
6636                        data_type,
6637                    },
6638                ))
6639            }
6640            APPLY => {
6641                assert_eq!(
6642                    object_type,
6643                    ObjectType::MaterializedView,
6644                    "checked object_type above",
6645                );
6646
6647                self.expect_keyword(REPLACEMENT)
6648                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6649
6650                let replacement_name = self
6651                    .parse_item_name()
6652                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6653
6654                Ok(Statement::AlterMaterializedViewApplyReplacement(
6655                    AlterMaterializedViewApplyReplacementStatement {
6656                        if_exists,
6657                        name,
6658                        replacement_name,
6659                    },
6660                ))
6661            }
6662            _ => unreachable!(),
6663        }
6664    }
6665
6666    fn parse_alter_schema(
6667        &mut self,
6668        object_type: ObjectType,
6669    ) -> Result<Statement<Raw>, ParserStatementError> {
6670        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6671        let name = self.parse_schema_name().map_no_statement_parser_err()?;
6672        let name = UnresolvedObjectName::Schema(name);
6673        let action = self
6674            .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6675            .map_no_statement_parser_err()?;
6676
6677        match action {
6678            OWNER => {
6679                self.expect_keyword(TO)
6680                    .map_parser_err(StatementKind::AlterOwner)?;
6681                let new_owner = self
6682                    .parse_identifier()
6683                    .map_parser_err(StatementKind::AlterOwner)?;
6684
6685                Ok(Statement::AlterOwner(AlterOwnerStatement {
6686                    object_type,
6687                    if_exists,
6688                    name,
6689                    new_owner,
6690                }))
6691            }
6692            RENAME => {
6693                self.expect_keyword(TO)
6694                    .map_parser_err(StatementKind::AlterObjectRename)?;
6695                let to_item_name = self
6696                    .parse_identifier()
6697                    .map_parser_err(StatementKind::AlterObjectRename)?;
6698
6699                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6700                    object_type,
6701                    if_exists,
6702                    name,
6703                    to_item_name,
6704                }))
6705            }
6706            SWAP => {
6707                self.expect_keyword(WITH)
6708                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6709                let name_b = self
6710                    .parse_identifier()
6711                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6712
6713                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6714                    object_type,
6715                    if_exists,
6716                    name_a: name,
6717                    name_b,
6718                }))
6719            }
6720            k => unreachable!("programming error, unmatched {k}"),
6721        }
6722    }
6723
6724    /// Parses `CLUSTER name` fragments into a [`AlterSetClusterStatement`] if `CLUSTER` is found.
6725    fn maybe_parse_alter_set_cluster(
6726        &mut self,
6727        if_exists: bool,
6728        name: &UnresolvedItemName,
6729        object_type: ObjectType,
6730    ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6731        if self.parse_keyword(CLUSTER) {
6732            Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6733        } else {
6734            None
6735        }
6736    }
6737
6738    /// Parses `IN CLUSTER name` fragments into a [`AlterSetClusterStatement`].
6739    fn parse_alter_set_cluster(
6740        &mut self,
6741        if_exists: bool,
6742        name: UnresolvedItemName,
6743        object_type: ObjectType,
6744    ) -> Result<Statement<Raw>, ParserStatementError> {
6745        let set_cluster = self
6746            .parse_raw_ident()
6747            .map_parser_err(StatementKind::AlterSetCluster)?;
6748        Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6749            name,
6750            if_exists,
6751            set_cluster,
6752            object_type,
6753        }))
6754    }
6755
6756    /// Parse a copy statement
6757    fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6758        // We support an optional "INTO" keyword for COPY INTO <table> FROM
6759        let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
6760            Some(self.peek_prev_pos())
6761        } else {
6762            None
6763        };
6764
6765        let relation = if self.consume_token(&Token::LParen) {
6766            let query = self.parse_statement()?.ast;
6767            self.expect_token(&Token::RParen)
6768                .map_parser_err(StatementKind::Copy)?;
6769            match query {
6770                Statement::Select(stmt) => CopyRelation::Select(stmt),
6771                Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
6772                _ => {
6773                    return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
6774                        .map_parser_err(StatementKind::Copy);
6775                }
6776            }
6777        } else {
6778            let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
6779            let columns = self
6780                .parse_parenthesized_column_list(Optional)
6781                .map_parser_err(StatementKind::Copy)?;
6782            CopyRelation::Named { name, columns }
6783        };
6784        let (direction, target) = match self
6785            .expect_one_of_keywords(&[FROM, TO])
6786            .map_parser_err(StatementKind::Copy)?
6787        {
6788            FROM => {
6789                if let CopyRelation::Named { .. } = relation {
6790                    // Ok.
6791                } else {
6792                    return parser_err!(
6793                        self,
6794                        self.peek_prev_pos(),
6795                        "queries not allowed in COPY FROM"
6796                    )
6797                    .map_no_statement_parser_err();
6798                }
6799                if self.parse_keyword(STDIN) {
6800                    (CopyDirection::From, CopyTarget::Stdin)
6801                } else {
6802                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6803                    (CopyDirection::From, CopyTarget::Expr(url_expr))
6804                }
6805            }
6806            TO => {
6807                // We only support the INTO keyword for 'COPY FROM'.
6808                if let Some(into_pos) = maybe_into_pos {
6809                    return self
6810                        .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
6811                        .map_parser_err(StatementKind::Copy);
6812                }
6813
6814                if self.parse_keyword(STDOUT) {
6815                    (CopyDirection::To, CopyTarget::Stdout)
6816                } else {
6817                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6818                    (CopyDirection::To, CopyTarget::Expr(url_expr))
6819                }
6820            }
6821            _ => unreachable!(),
6822        };
6823        // WITH must be followed by LParen. The WITH in COPY is optional for backward
6824        // compat with Postgres but is required elsewhere, which is why we don't use
6825        // parse_with_options here.
6826        let has_options = if self.parse_keyword(WITH) {
6827            self.expect_token(&Token::LParen)
6828                .map_parser_err(StatementKind::Copy)?;
6829            true
6830        } else {
6831            self.consume_token(&Token::LParen)
6832        };
6833        let options = if has_options {
6834            let o = self
6835                .parse_comma_separated(Parser::parse_copy_option)
6836                .map_parser_err(StatementKind::Copy)?;
6837            self.expect_token(&Token::RParen)
6838                .map_parser_err(StatementKind::Copy)?;
6839            o
6840        } else {
6841            vec![]
6842        };
6843        Ok(Statement::Copy(CopyStatement {
6844            relation,
6845            direction,
6846            target,
6847            options,
6848        }))
6849    }
6850
6851    fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
6852        let name = match self.expect_one_of_keywords(&[
6853            FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
6854        ])? {
6855            FORMAT => CopyOptionName::Format,
6856            DELIMITER => CopyOptionName::Delimiter,
6857            NULL => CopyOptionName::Null,
6858            ESCAPE => CopyOptionName::Escape,
6859            QUOTE => CopyOptionName::Quote,
6860            HEADER => CopyOptionName::Header,
6861            AWS => {
6862                self.expect_keyword(CONNECTION)?;
6863                return Ok(CopyOption {
6864                    name: CopyOptionName::AwsConnection,
6865                    value: Some(self.parse_object_option_value()?),
6866                });
6867            }
6868            MAX => {
6869                self.expect_keywords(&[FILE, SIZE])?;
6870                CopyOptionName::MaxFileSize
6871            }
6872            FILES => CopyOptionName::Files,
6873            PATTERN => CopyOptionName::Pattern,
6874            _ => unreachable!(),
6875        };
6876        Ok(CopyOption {
6877            name,
6878            value: self.parse_optional_option_value()?,
6879        })
6880    }
6881
6882    /// Parse a literal value (numbers, strings, date/time, booleans)
6883    fn parse_value(&mut self) -> Result<Value, ParserError> {
6884        match self.next_token() {
6885            Some(t) => match t {
6886                Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
6887                Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
6888                Token::Keyword(NULL) => Ok(Value::Null),
6889                Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
6890                Token::Keyword(kw) => {
6891                    parser_err!(
6892                        self,
6893                        self.peek_prev_pos(),
6894                        format!("No value parser for keyword {}", kw)
6895                    )
6896                }
6897                Token::Op(ref op) if op == "-" => match self.next_token() {
6898                    Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
6899                    other => self.expected(self.peek_prev_pos(), "literal int", other),
6900                },
6901                Token::Number(ref n) => Ok(Value::Number(n.to_string())),
6902                Token::String(ref s) => Ok(Value::String(s.to_string())),
6903                Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
6904                _ => parser_err!(
6905                    self,
6906                    self.peek_prev_pos(),
6907                    format!("Unsupported value: {:?}", t)
6908                ),
6909            },
6910            None => parser_err!(
6911                self,
6912                self.peek_prev_pos(),
6913                "Expecting a value, but found EOF"
6914            ),
6915        }
6916    }
6917
6918    fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
6919        if self.consume_token(&Token::LParen) {
6920            let subquery = self.parse_query()?;
6921            self.expect_token(&Token::RParen)?;
6922            Ok(Expr::ArraySubquery(Box::new(subquery)))
6923        } else {
6924            self.parse_sequence(Self::parse_array).map(Expr::Array)
6925        }
6926    }
6927
6928    fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
6929        if self.consume_token(&Token::LParen) {
6930            let subquery = self.parse_query()?;
6931            self.expect_token(&Token::RParen)?;
6932            Ok(Expr::ListSubquery(Box::new(subquery)))
6933        } else {
6934            self.parse_sequence(Self::parse_list).map(Expr::List)
6935        }
6936    }
6937
6938    fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
6939        if self.consume_token(&Token::LParen) {
6940            let subquery = self.parse_query()?;
6941            self.expect_token(&Token::RParen)?;
6942            return Ok(Expr::MapSubquery(Box::new(subquery)));
6943        }
6944
6945        self.expect_token(&Token::LBracket)?;
6946        let mut exprs = vec![];
6947        loop {
6948            if let Some(Token::RBracket) = self.peek_token() {
6949                break;
6950            }
6951            let key = self.parse_expr()?;
6952            self.expect_token(&Token::Arrow)?;
6953            let value = if let Some(Token::LBracket) = self.peek_token() {
6954                self.parse_map()?
6955            } else {
6956                self.parse_expr()?
6957            };
6958            exprs.push(MapEntry { key, value });
6959            if !self.consume_token(&Token::Comma) {
6960                break;
6961            }
6962        }
6963        self.expect_token(&Token::RBracket)?;
6964        Ok(Expr::Map(exprs))
6965    }
6966
6967    fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
6968    where
6969        F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
6970    {
6971        self.expect_token(&Token::LBracket)?;
6972        let mut exprs = vec![];
6973        loop {
6974            if let Some(Token::RBracket) = self.peek_token() {
6975                break;
6976            }
6977            let expr = if let Some(Token::LBracket) = self.peek_token() {
6978                f(self)?
6979            } else {
6980                self.parse_expr()?
6981            };
6982            exprs.push(expr);
6983            if !self.consume_token(&Token::Comma) {
6984                break;
6985            }
6986        }
6987        self.expect_token(&Token::RBracket)?;
6988        Ok(exprs)
6989    }
6990
6991    fn parse_number_value(&mut self) -> Result<Value, ParserError> {
6992        match self.parse_value()? {
6993            v @ Value::Number(_) => Ok(v),
6994            _ => {
6995                self.prev_token();
6996                self.expected(self.peek_pos(), "literal number", self.peek_token())
6997            }
6998        }
6999    }
7000
7001    fn parse_version(&mut self) -> Result<Version, ParserError> {
7002        let version = self.parse_literal_uint()?;
7003        Ok(Version(version))
7004    }
7005
7006    /// Parse a signed literal integer.
7007    fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
7008        let negative = self.consume_token(&Token::Op("-".into()));
7009        match self.next_token() {
7010            Some(Token::Number(s)) => {
7011                let n = s.parse::<i64>().map_err(|e| {
7012                    self.error(
7013                        self.peek_prev_pos(),
7014                        format!("Could not parse '{}' as i64: {}", s, e),
7015                    )
7016                })?;
7017                if negative {
7018                    n.checked_neg().ok_or_else(|| {
7019                        self.error(
7020                            self.peek_prev_pos(),
7021                            format!("Could not parse '{}' as i64: overflows i64", s),
7022                        )
7023                    })
7024                } else {
7025                    Ok(n)
7026                }
7027            }
7028            other => self.expected(self.peek_prev_pos(), "literal integer", other),
7029        }
7030    }
7031
7032    /// Parse an unsigned literal integer.
7033    fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7034        match self.next_token() {
7035            Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7036                self.error(
7037                    self.peek_prev_pos(),
7038                    format!("Could not parse '{}' as u64: {}", s, e),
7039                )
7040            }),
7041            other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7042        }
7043    }
7044
7045    /// Parse a literal string
7046    fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7047        match self.next_token() {
7048            Some(Token::String(ref s)) => Ok(s.clone()),
7049            other => self.expected(self.peek_prev_pos(), "literal string", other),
7050        }
7051    }
7052
7053    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
7054    fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7055        let other = |ident| RawDataType::Other {
7056            name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7057            typ_mod: vec![],
7058        };
7059
7060        let mut data_type = match self.next_token() {
7061            Some(Token::Keyword(kw)) => match kw {
7062                // Text-like types
7063                CHAR | CHARACTER => {
7064                    let name = if self.parse_keyword(VARYING) {
7065                        ident!("varchar")
7066                    } else {
7067                        ident!("bpchar")
7068                    };
7069                    RawDataType::Other {
7070                        name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7071                        typ_mod: self.parse_typ_mod()?,
7072                    }
7073                }
7074                BPCHAR => RawDataType::Other {
7075                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7076                    typ_mod: self.parse_typ_mod()?,
7077                },
7078                VARCHAR => RawDataType::Other {
7079                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7080                    typ_mod: self.parse_typ_mod()?,
7081                },
7082                STRING => other(ident!("text")),
7083
7084                // Number-like types
7085                BIGINT => other(ident!("int8")),
7086                SMALLINT => other(ident!("int2")),
7087                DEC | DECIMAL => RawDataType::Other {
7088                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7089                    typ_mod: self.parse_typ_mod()?,
7090                },
7091                DOUBLE => {
7092                    let _ = self.parse_keyword(PRECISION);
7093                    other(ident!("float8"))
7094                }
7095                FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7096                    v if v == 0 || v > 53 => {
7097                        return Err(self.error(
7098                            self.peek_prev_pos(),
7099                            "precision for type float must be within ([1-53])".into(),
7100                        ));
7101                    }
7102                    v if v < 25 => other(ident!("float4")),
7103                    _ => other(ident!("float8")),
7104                },
7105                INT | INTEGER => other(ident!("int4")),
7106                REAL => other(ident!("float4")),
7107
7108                // Time-like types
7109                TIME => {
7110                    if self.parse_keyword(WITH) {
7111                        self.expect_keywords(&[TIME, ZONE])?;
7112                        other(ident!("timetz"))
7113                    } else {
7114                        if self.parse_keyword(WITHOUT) {
7115                            self.expect_keywords(&[TIME, ZONE])?;
7116                        }
7117                        other(ident!("time"))
7118                    }
7119                }
7120                TIMESTAMP => {
7121                    let typ_mod = self.parse_timestamp_precision()?;
7122                    if self.parse_keyword(WITH) {
7123                        self.expect_keywords(&[TIME, ZONE])?;
7124                        RawDataType::Other {
7125                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7126                                "timestamptz"
7127                            ))),
7128                            typ_mod,
7129                        }
7130                    } else {
7131                        if self.parse_keyword(WITHOUT) {
7132                            self.expect_keywords(&[TIME, ZONE])?;
7133                        }
7134                        RawDataType::Other {
7135                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7136                                "timestamp"
7137                            ))),
7138                            typ_mod,
7139                        }
7140                    }
7141                }
7142                TIMESTAMPTZ => {
7143                    let typ_mod = self.parse_timestamp_precision()?;
7144                    RawDataType::Other {
7145                        name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7146                            "timestamptz"
7147                        ))),
7148                        typ_mod,
7149                    }
7150                }
7151
7152                // MZ "proprietary" types
7153                MAP => {
7154                    return self.parse_map_type();
7155                }
7156
7157                // Misc.
7158                BOOLEAN => other(ident!("bool")),
7159                BYTES => other(ident!("bytea")),
7160                JSON => other(ident!("jsonb")),
7161
7162                // We do not want any reserved keywords to be parsed as data type names,
7163                // eg "CASE 'foo' WHEN ... END" should not parse as "CAST 'foo' AS CASE"
7164                kw if kw.is_sometimes_reserved() => {
7165                    return self.expected(
7166                        self.peek_prev_pos(),
7167                        "a data type name",
7168                        Some(Token::Keyword(kw)),
7169                    );
7170                }
7171                _ => {
7172                    self.prev_token();
7173                    RawDataType::Other {
7174                        name: RawItemName::Name(self.parse_item_name()?),
7175                        typ_mod: self.parse_typ_mod()?,
7176                    }
7177                }
7178            },
7179            Some(Token::Ident(_) | Token::LBracket) => {
7180                self.prev_token();
7181                RawDataType::Other {
7182                    name: self.parse_raw_name()?,
7183                    typ_mod: self.parse_typ_mod()?,
7184                }
7185            }
7186            other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7187        };
7188
7189        loop {
7190            match self.peek_token() {
7191                Some(Token::Keyword(LIST)) => {
7192                    self.next_token();
7193                    data_type = RawDataType::List(Box::new(data_type));
7194                }
7195                Some(Token::LBracket) => {
7196                    // Handle array suffixes. Note that `int[]`, `int[][][]`,
7197                    // and `int[2][2]` all parse to the same "int array" type.
7198                    self.next_token();
7199                    let _ = self.maybe_parse(|parser| parser.parse_number_value());
7200                    self.expect_token(&Token::RBracket)?;
7201                    if !matches!(data_type, RawDataType::Array(_)) {
7202                        data_type = RawDataType::Array(Box::new(data_type));
7203                    }
7204                }
7205                _ => break,
7206            }
7207        }
7208        Ok(data_type)
7209    }
7210
7211    fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7212        if self.consume_token(&Token::LParen) {
7213            let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7214            self.expect_token(&Token::RParen)?;
7215            Ok(typ_mod)
7216        } else {
7217            Ok(vec![])
7218        }
7219    }
7220
7221    // parses the precision in timestamp(<precision>) and timestamptz(<precision>)
7222    fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7223        if self.consume_token(&Token::LParen) {
7224            let typ_mod = self.parse_literal_int()?;
7225            self.expect_token(&Token::RParen)?;
7226            Ok(vec![typ_mod])
7227        } else {
7228            Ok(vec![])
7229        }
7230    }
7231
7232    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
7233    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
7234    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
7235    fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7236    where
7237        F: FnOnce(Keyword) -> bool,
7238    {
7239        let after_as = self.parse_keyword(AS);
7240        match self.next_token() {
7241            // Do not accept `AS OF`, which is reserved for providing timestamp information
7242            // to queries.
7243            Some(Token::Keyword(OF)) => {
7244                self.prev_token();
7245                if after_as {
7246                    self.prev_token();
7247                }
7248                Ok(None)
7249            }
7250            // Accept any other identifier after `AS` (though many dialects have restrictions on
7251            // keywords that may appear here). If there's no `AS`: don't parse keywords,
7252            // which may start a construct allowed in this position, to be parsed as aliases.
7253            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
7254            // not an alias.)
7255            Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7256            Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7257            not_an_ident => {
7258                if after_as {
7259                    return self.expected(
7260                        self.peek_prev_pos(),
7261                        "an identifier after AS",
7262                        not_an_ident,
7263                    );
7264                }
7265                self.prev_token();
7266                Ok(None) // no alias found
7267            }
7268        }
7269    }
7270
7271    /// Parse `AS identifier` when the AS is describing a table-valued object,
7272    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
7273    /// the alias is allowed to optionally name the columns in the table, in
7274    /// addition to the table itself.
7275    fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7276        match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7277            Some(name) => {
7278                let columns = self.parse_parenthesized_column_list(Optional)?;
7279                Ok(Some(TableAlias {
7280                    name,
7281                    columns,
7282                    strict: false,
7283                }))
7284            }
7285            None => Ok(None),
7286        }
7287    }
7288
7289    fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7290        Ok(match self.parse_raw_name()? {
7291            named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7292            RawItemName::Name(name) => DeferredItemName::Deferred(name),
7293        })
7294    }
7295
7296    fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7297        if self.consume_token(&Token::LBracket) {
7298            let id = match self.next_token() {
7299                Some(Token::Ident(id)) => id.into_inner(),
7300                _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7301            };
7302            self.expect_keyword(AS)?;
7303            let name = self.parse_item_name()?;
7304            // TODO(justin): is there a more idiomatic way to detect a fully-qualified name?
7305            if name.0.len() < 2 {
7306                return parser_err!(
7307                    self,
7308                    self.peek_prev_pos(),
7309                    "table name in square brackets must be fully qualified"
7310                );
7311            }
7312
7313            let version = if self.parse_keywords(&[VERSION]) {
7314                let version = self.parse_version()?;
7315                Some(version)
7316            } else {
7317                None
7318            };
7319
7320            self.expect_token(&Token::RBracket)?;
7321            Ok(RawItemName::Id(id, name, version))
7322        } else {
7323            Ok(RawItemName::Name(self.parse_item_name()?))
7324        }
7325    }
7326
7327    fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7328        let start = self.peek_pos();
7329        let mut item_name = self.parse_raw_name()?;
7330        let column_name = match &mut item_name {
7331            RawItemName::Name(UnresolvedItemName(identifiers)) => {
7332                if identifiers.len() < 2 {
7333                    return Err(ParserError::new(
7334                        start,
7335                        "need to specify an object and a column",
7336                    ));
7337                }
7338                identifiers.pop().unwrap()
7339            }
7340            RawItemName::Id(_, _, _) => {
7341                self.expect_token(&Token::Dot)?;
7342                self.parse_identifier()?
7343            }
7344        };
7345
7346        Ok(ColumnName {
7347            relation: item_name,
7348            column: column_name,
7349        })
7350    }
7351
7352    /// Parse a possibly quoted database identifier, e.g.
7353    /// `foo` or `"mydatabase"`
7354    fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7355        Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7356    }
7357
7358    /// Parse a possibly qualified, possibly quoted schema identifier, e.g.
7359    /// `foo` or `mydatabase."schema"`
7360    fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7361        Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7362    }
7363
7364    /// Parse a possibly qualified, possibly quoted object identifier, e.g.
7365    /// `foo` or `myschema."table"`
7366    fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7367        Ok(UnresolvedItemName(self.parse_identifiers()?))
7368    }
7369
7370    /// Parse an object name.
7371    fn parse_object_name(
7372        &mut self,
7373        object_type: ObjectType,
7374    ) -> Result<UnresolvedObjectName, ParserError> {
7375        Ok(match object_type {
7376            ObjectType::Table
7377            | ObjectType::View
7378            | ObjectType::MaterializedView
7379            | ObjectType::Source
7380            | ObjectType::Subsource
7381            | ObjectType::Sink
7382            | ObjectType::Index
7383            | ObjectType::Type
7384            | ObjectType::Secret
7385            | ObjectType::Connection
7386            | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7387            ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7388            ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7389            ObjectType::ClusterReplica => {
7390                UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7391            }
7392            ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7393            ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7394            ObjectType::NetworkPolicy => {
7395                UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7396            }
7397        })
7398    }
7399
7400    ///Parse one or more simple one-word identifiers separated by a '.'
7401    fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7402        let mut idents = vec![];
7403        loop {
7404            idents.push(self.parse_identifier()?);
7405            if !self.consume_token(&Token::Dot) {
7406                break;
7407            }
7408        }
7409        Ok(idents)
7410    }
7411
7412    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
7413    fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7414        match self.consume_identifier()? {
7415            Some(id) => {
7416                if id.as_str().is_empty() {
7417                    return parser_err!(
7418                        self,
7419                        self.peek_prev_pos(),
7420                        "zero-length delimited identifier",
7421                    );
7422                }
7423                Ok(id)
7424            }
7425            None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7426        }
7427    }
7428
7429    fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7430        match self.peek_token() {
7431            Some(Token::Keyword(kw)) => {
7432                self.next_token();
7433                Ok(Some(kw.into()))
7434            }
7435            Some(Token::Ident(id)) => {
7436                self.next_token();
7437                Ok(Some(self.new_identifier(id)?))
7438            }
7439            _ => Ok(None),
7440        }
7441    }
7442
7443    fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7444        let mut id_parts = vec![id];
7445        match self.peek_token() {
7446            Some(Token::LParen) | Some(Token::Dot) => {
7447                let mut ends_with_wildcard = false;
7448                while self.consume_token(&Token::Dot) {
7449                    match self.next_token() {
7450                        Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7451                        Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7452                        Some(Token::Star) => {
7453                            ends_with_wildcard = true;
7454                            break;
7455                        }
7456                        unexpected => {
7457                            return self.expected(
7458                                self.peek_prev_pos(),
7459                                "an identifier or a '*' after '.'",
7460                                unexpected,
7461                            );
7462                        }
7463                    }
7464                }
7465                if ends_with_wildcard {
7466                    Ok(Expr::QualifiedWildcard(id_parts))
7467                } else if self.peek_token() == Some(Token::LParen) {
7468                    let function =
7469                        self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7470                    Ok(Expr::Function(function))
7471                } else {
7472                    Ok(Expr::Identifier(id_parts))
7473                }
7474            }
7475            _ => Ok(Expr::Identifier(id_parts)),
7476        }
7477    }
7478
7479    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
7480    fn parse_parenthesized_column_list(
7481        &mut self,
7482        optional: IsOptional,
7483    ) -> Result<Vec<Ident>, ParserError> {
7484        if self.consume_token(&Token::LParen) {
7485            let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7486            self.expect_token(&Token::RParen)?;
7487            Ok(cols)
7488        } else if optional == Optional {
7489            Ok(vec![])
7490        } else {
7491            self.expected(
7492                self.peek_pos(),
7493                "a list of columns in parentheses",
7494                self.peek_token(),
7495            )
7496        }
7497    }
7498
7499    fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7500        if self.consume_token(&Token::LParen) {
7501            let n = self.parse_literal_uint()?;
7502            self.expect_token(&Token::RParen)?;
7503            Ok(Some(n))
7504        } else {
7505            Ok(None)
7506        }
7507    }
7508
7509    fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7510        self.expect_token(&Token::LBracket)?;
7511        let key_type = Box::new(self.parse_data_type()?);
7512        self.expect_token(&Token::Arrow)?;
7513        let value_type = Box::new(self.parse_data_type()?);
7514        self.expect_token(&Token::RBracket)?;
7515        Ok(RawDataType::Map {
7516            key_type,
7517            value_type,
7518        })
7519    }
7520
7521    fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7522        self.expect_keyword(FROM)?;
7523        let table_name = RawItemName::Name(self.parse_item_name()?);
7524        let alias = self.parse_optional_table_alias()?;
7525        let using = if self.parse_keyword(USING) {
7526            self.parse_comma_separated(Parser::parse_table_and_joins)?
7527        } else {
7528            vec![]
7529        };
7530        let selection = if self.parse_keyword(WHERE) {
7531            Some(self.parse_expr()?)
7532        } else {
7533            None
7534        };
7535
7536        Ok(Statement::Delete(DeleteStatement {
7537            table_name,
7538            alias,
7539            using,
7540            selection,
7541        }))
7542    }
7543
7544    /// Parses a SELECT (or WITH, VALUES, TABLE) statement with optional AS OF.
7545    fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7546        Ok(SelectStatement {
7547            query: self.parse_query()?,
7548            as_of: self.parse_optional_as_of()?,
7549        })
7550    }
7551
7552    /// Parse a query expression, i.e. a `SELECT` statement optionally
7553    /// preceded with some `WITH` CTE declarations and optionally followed
7554    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
7555    /// expect the initial keyword to be already consumed
7556    fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7557        self.checked_recur_mut(|parser| {
7558            let cte_block = if parser.parse_keyword(WITH) {
7559                if parser.parse_keyword(MUTUALLY) {
7560                    parser.expect_keyword(RECURSIVE)?;
7561                    let options = if parser.consume_token(&Token::LParen) {
7562                        let options =
7563                            parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7564                        parser.expect_token(&Token::RParen)?;
7565                        options
7566                    } else {
7567                        vec![]
7568                    };
7569                    CteBlock::MutuallyRecursive(MutRecBlock {
7570                        options,
7571                        ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7572                    })
7573                } else {
7574                    // TODO: optional RECURSIVE
7575                    CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7576                }
7577            } else {
7578                CteBlock::empty()
7579            };
7580
7581            let body = parser.parse_query_body(SetPrecedence::Zero)?;
7582
7583            parser.parse_query_tail(cte_block, body)
7584        })
7585    }
7586
7587    fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7588        match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7589            RECURSION => {
7590                self.expect_keyword(LIMIT)?;
7591                Ok(MutRecBlockOption {
7592                    name: MutRecBlockOptionName::RecursionLimit,
7593                    value: self.parse_optional_option_value()?,
7594                })
7595            }
7596            RETURN => {
7597                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7598                Ok(MutRecBlockOption {
7599                    name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7600                    value: self.parse_optional_option_value()?,
7601                })
7602            }
7603            ERROR => {
7604                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7605                Ok(MutRecBlockOption {
7606                    name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7607                    value: self.parse_optional_option_value()?,
7608                })
7609            }
7610            _ => unreachable!(),
7611        }
7612    }
7613
7614    fn parse_query_tail(
7615        &mut self,
7616        ctes: CteBlock<Raw>,
7617        body: SetExpr<Raw>,
7618    ) -> Result<Query<Raw>, ParserError> {
7619        let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7620            SetExpr::Query(query) => {
7621                let Query {
7622                    ctes,
7623                    body,
7624                    order_by,
7625                    limit,
7626                    offset,
7627                } = *query;
7628                (ctes, order_by, limit, offset, body)
7629            }
7630            _ => (CteBlock::empty(), vec![], None, None, body),
7631        };
7632
7633        let ctes = if ctes.is_empty() {
7634            inner_ctes
7635        } else if !inner_ctes.is_empty() {
7636            return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7637        } else {
7638            ctes
7639        };
7640
7641        let order_by = if self.parse_keywords(&[ORDER, BY]) {
7642            if !inner_order_by.is_empty() {
7643                return parser_err!(
7644                    self,
7645                    self.peek_prev_pos(),
7646                    "multiple ORDER BY clauses not allowed"
7647                );
7648            }
7649            self.parse_comma_separated(Parser::parse_order_by_expr)?
7650        } else {
7651            inner_order_by
7652        };
7653
7654        // Parse LIMIT, FETCH, OFFSET in any order, but:
7655        // - Only at most one of LIMIT or FETCH is allowed.
7656        // - Only at most one occurrence is allowed from each of these.
7657        let mut limit = inner_limit;
7658        let mut offset = inner_offset;
7659        while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7660            match parsed_keyword {
7661                LIMIT => {
7662                    if limit.is_some() {
7663                        return parser_err!(
7664                            self,
7665                            self.peek_prev_pos(),
7666                            "multiple LIMIT/FETCH clauses not allowed"
7667                        );
7668                    }
7669                    limit = if self.parse_keyword(ALL) {
7670                        None
7671                    } else {
7672                        Some(Limit {
7673                            with_ties: false,
7674                            quantity: self.parse_expr()?,
7675                        })
7676                    };
7677                }
7678                OFFSET => {
7679                    if offset.is_some() {
7680                        return parser_err!(
7681                            self,
7682                            self.peek_prev_pos(),
7683                            "multiple OFFSET clauses not allowed"
7684                        );
7685                    }
7686                    let value = self.parse_expr()?;
7687                    let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7688                    offset = Some(value);
7689                }
7690                FETCH => {
7691                    if limit.is_some() {
7692                        return parser_err!(
7693                            self,
7694                            self.peek_prev_pos(),
7695                            "multiple LIMIT/FETCH clauses not allowed"
7696                        );
7697                    }
7698                    self.expect_one_of_keywords(&[FIRST, NEXT])?;
7699                    let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7700                        Expr::Value(Value::Number('1'.into()))
7701                    } else {
7702                        let quantity = self.parse_expr()?;
7703                        self.expect_one_of_keywords(&[ROW, ROWS])?;
7704                        quantity
7705                    };
7706                    let with_ties = if self.parse_keyword(ONLY) {
7707                        false
7708                    } else if self.parse_keywords(&[WITH, TIES]) {
7709                        true
7710                    } else {
7711                        return self.expected(
7712                            self.peek_pos(),
7713                            "one of ONLY or WITH TIES",
7714                            self.peek_token(),
7715                        );
7716                    };
7717                    limit = Some(Limit {
7718                        with_ties,
7719                        quantity,
7720                    });
7721                }
7722                _ => unreachable!(),
7723            }
7724        }
7725
7726        Ok(Query {
7727            ctes,
7728            body,
7729            order_by,
7730            limit,
7731            offset,
7732        })
7733    }
7734
7735    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
7736    fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7737        let alias = TableAlias {
7738            name: self.parse_identifier()?,
7739            columns: self.parse_parenthesized_column_list(Optional)?,
7740            strict: false,
7741        };
7742        self.expect_keyword(AS)?;
7743        self.expect_token(&Token::LParen)?;
7744        let query = self.parse_query()?;
7745        self.expect_token(&Token::RParen)?;
7746        Ok(Cte {
7747            alias,
7748            query,
7749            id: (),
7750        })
7751    }
7752
7753    /// Parse a mutually recursive CTE (`alias ( col1: typ1, col2: typ2, ... ) AS (subquery)`).
7754    ///
7755    /// The main distinction from `parse_cte` is that the column names and types are mandatory.
7756    /// This is not how SQL works for `WITH RECURSIVE`, but we are doing it for now to make the
7757    /// query interpretation that much easier.
7758    fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7759        let name = self.parse_identifier()?;
7760        self.expect_token(&Token::LParen)?;
7761        let columns = self.parse_comma_separated(|parser| {
7762            Ok(CteMutRecColumnDef {
7763                name: parser.parse_identifier()?,
7764                data_type: parser.parse_data_type()?,
7765            })
7766        })?;
7767        self.expect_token(&Token::RParen)?;
7768        self.expect_keyword(AS)?;
7769        self.expect_token(&Token::LParen)?;
7770        let query = self.parse_query()?;
7771        self.expect_token(&Token::RParen)?;
7772        Ok(CteMutRec {
7773            name,
7774            columns,
7775            query,
7776            id: (),
7777        })
7778    }
7779
7780    /// Parse a "query body", which is an expression with roughly the
7781    /// following grammar:
7782    /// ```text
7783    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
7784    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
7785    ///   subquery ::= query_body [ order_by_limit ]
7786    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
7787    /// ```
7788    fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
7789        // We parse the expression using a Pratt parser, as in `parse_expr()`.
7790        // Start by parsing a restricted SELECT or a `(subquery)`:
7791        let expr = if self.parse_keyword(SELECT) {
7792            SetExpr::Select(Box::new(self.parse_select()?))
7793        } else if self.consume_token(&Token::LParen) {
7794            // CTEs are not allowed here, but the parser currently accepts them
7795            let subquery = self.parse_query()?;
7796            self.expect_token(&Token::RParen)?;
7797            SetExpr::Query(Box::new(subquery))
7798        } else if self.parse_keyword(VALUES) {
7799            SetExpr::Values(self.parse_values()?)
7800        } else if self.parse_keyword(SHOW) {
7801            SetExpr::Show(self.parse_show()?)
7802        } else if self.parse_keyword(TABLE) {
7803            SetExpr::Table(self.parse_raw_name()?)
7804        } else {
7805            return self.expected(
7806                self.peek_pos(),
7807                "SELECT, VALUES, or a subquery in the query body",
7808                self.peek_token(),
7809            );
7810        };
7811
7812        self.parse_query_body_seeded(precedence, expr)
7813    }
7814
7815    fn parse_query_body_seeded(
7816        &mut self,
7817        precedence: SetPrecedence,
7818        mut expr: SetExpr<Raw>,
7819    ) -> Result<SetExpr<Raw>, ParserError> {
7820        loop {
7821            // The query can be optionally followed by a set operator:
7822            let next_token = self.peek_token();
7823            let op = self.parse_set_operator(&next_token);
7824            let next_precedence = match op {
7825                // UNION and EXCEPT have the same precedence and evaluate left-to-right
7826                Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7827                // INTERSECT has higher precedence than UNION/EXCEPT
7828                Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7829                // Unexpected token or EOF => stop parsing the query body
7830                None => break,
7831            };
7832            if precedence >= next_precedence {
7833                break;
7834            }
7835            self.next_token(); // skip past the set operator
7836
7837            let all = self.parse_keyword(ALL);
7838            let distinct = self.parse_keyword(DISTINCT);
7839            if all && distinct {
7840                return parser_err!(
7841                    self,
7842                    self.peek_prev_pos(),
7843                    "Cannot specify both ALL and DISTINCT in set operation"
7844                );
7845            }
7846            expr = SetExpr::SetOperation {
7847                left: Box::new(expr),
7848                op: op.unwrap(),
7849                all,
7850                right: Box::new(self.parse_query_body(next_precedence)?),
7851            };
7852        }
7853
7854        Ok(expr)
7855    }
7856
7857    fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
7858        match token {
7859            Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
7860            Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
7861            Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
7862            _ => None,
7863        }
7864    }
7865
7866    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
7867    /// assuming the initial `SELECT` was already consumed
7868    fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
7869        let all = self.parse_keyword(ALL);
7870        let distinct = self.parse_keyword(DISTINCT);
7871        if all && distinct {
7872            return parser_err!(
7873                self,
7874                self.peek_prev_pos(),
7875                "Cannot specify both ALL and DISTINCT in SELECT"
7876            );
7877        }
7878        let distinct = if distinct && self.parse_keyword(ON) {
7879            self.expect_token(&Token::LParen)?;
7880            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
7881            self.expect_token(&Token::RParen)?;
7882            Some(Distinct::On(exprs))
7883        } else if distinct {
7884            Some(Distinct::EntireRow)
7885        } else {
7886            None
7887        };
7888
7889        let projection = match self.peek_token() {
7890            // An empty target list is permissible to match PostgreSQL, which
7891            // permits these for symmetry with zero column tables. We need
7892            // to sniff out `AS` here specially to support `SELECT AS OF ...`.
7893            Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
7894            Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
7895            _ => {
7896                let mut projection = vec![];
7897                loop {
7898                    projection.push(self.parse_select_item()?);
7899                    if !self.consume_token(&Token::Comma) {
7900                        break;
7901                    }
7902                    if self.peek_keyword(FROM) {
7903                        return parser_err!(
7904                            self,
7905                            self.peek_prev_pos(),
7906                            "invalid trailing comma in SELECT list",
7907                        );
7908                    }
7909                }
7910                projection
7911            }
7912        };
7913
7914        // Note that for keywords to be properly handled here, they need to be
7915        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
7916        // otherwise they may be parsed as an alias as part of the `projection`
7917        // or `from`.
7918
7919        let from = if self.parse_keyword(FROM) {
7920            self.parse_comma_separated(Parser::parse_table_and_joins)?
7921        } else {
7922            vec![]
7923        };
7924
7925        let selection = if self.parse_keyword(WHERE) {
7926            Some(self.parse_expr()?)
7927        } else {
7928            None
7929        };
7930
7931        let group_by = if self.parse_keywords(&[GROUP, BY]) {
7932            self.parse_comma_separated(Parser::parse_expr)?
7933        } else {
7934            vec![]
7935        };
7936
7937        let having = if self.parse_keyword(HAVING) {
7938            Some(self.parse_expr()?)
7939        } else {
7940            None
7941        };
7942
7943        let qualify = if self.parse_keyword(QUALIFY) {
7944            Some(self.parse_expr()?)
7945        } else {
7946            None
7947        };
7948
7949        let options = if self.parse_keyword(OPTIONS) {
7950            self.expect_token(&Token::LParen)?;
7951            let options = self.parse_comma_separated(Self::parse_select_option)?;
7952            self.expect_token(&Token::RParen)?;
7953            options
7954        } else {
7955            vec![]
7956        };
7957
7958        Ok(Select {
7959            distinct,
7960            projection,
7961            from,
7962            selection,
7963            group_by,
7964            having,
7965            qualify,
7966            options,
7967        })
7968    }
7969
7970    fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
7971        let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
7972            EXPECTED => {
7973                self.expect_keywords(&[GROUP, SIZE])?;
7974                SelectOptionName::ExpectedGroupSize
7975            }
7976            AGGREGATE => {
7977                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7978                SelectOptionName::AggregateInputGroupSize
7979            }
7980            DISTINCT => {
7981                self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
7982                SelectOptionName::DistinctOnInputGroupSize
7983            }
7984            LIMIT => {
7985                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7986                SelectOptionName::LimitInputGroupSize
7987            }
7988            _ => unreachable!(),
7989        };
7990        Ok(SelectOption {
7991            name,
7992            value: self.parse_optional_option_value()?,
7993        })
7994    }
7995
7996    fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
7997        let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
7998        let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
7999        let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8000        if !normal {
8001            match variable.as_str().parse() {
8002                Ok(TIME) => {
8003                    self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8004                    variable = ident!("timezone");
8005                    normal = true;
8006                }
8007                Ok(NAMES) => {
8008                    variable = ident!("client_encoding");
8009                    normal = true;
8010                }
8011                _ => {}
8012            }
8013        }
8014        if variable.as_str().parse() == Ok(SCHEMA) {
8015            variable = ident!("search_path");
8016            let to = self
8017                .parse_set_schema_to()
8018                .map_parser_err(StatementKind::SetVariable)?;
8019            Ok(Statement::SetVariable(SetVariableStatement {
8020                local: modifier == Some(LOCAL),
8021                variable,
8022                to,
8023            }))
8024        } else if normal {
8025            let to = self
8026                .parse_set_variable_to()
8027                .map_parser_err(StatementKind::SetVariable)?;
8028            Ok(Statement::SetVariable(SetVariableStatement {
8029                local: modifier == Some(LOCAL),
8030                variable,
8031                to,
8032            }))
8033        } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8034            // SET TRANSACTION transaction_mode
8035            Ok(Statement::SetTransaction(SetTransactionStatement {
8036                local: true,
8037                modes: self
8038                    .parse_transaction_modes(true)
8039                    .map_parser_err(StatementKind::SetTransaction)?,
8040            }))
8041        } else if modifier == Some(SESSION)
8042            && variable.as_str().parse() == Ok(CHARACTERISTICS)
8043            && self.parse_keywords(&[AS, TRANSACTION])
8044        {
8045            // SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
8046            Ok(Statement::SetTransaction(SetTransactionStatement {
8047                local: false,
8048                modes: self
8049                    .parse_transaction_modes(true)
8050                    .map_parser_err(StatementKind::SetTransaction)?,
8051            }))
8052        } else {
8053            self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8054                .map_no_statement_parser_err()
8055        }
8056    }
8057
8058    fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8059        if self.parse_keyword(DEFAULT) {
8060            Ok(SetVariableTo::Default)
8061        } else {
8062            let to = self.parse_set_variable_value()?;
8063            Ok(SetVariableTo::Values(vec![to]))
8064        }
8065    }
8066
8067    fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8068        if self.parse_keyword(DEFAULT) {
8069            Ok(SetVariableTo::Default)
8070        } else {
8071            Ok(SetVariableTo::Values(
8072                self.parse_comma_separated(Parser::parse_set_variable_value)?,
8073            ))
8074        }
8075    }
8076
8077    fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8078        if let Some(value) = self.maybe_parse(Parser::parse_value) {
8079            Ok(SetVariableValue::Literal(value))
8080        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8081            Ok(SetVariableValue::Ident(ident))
8082        } else {
8083            self.expected(self.peek_pos(), "variable value", self.peek_token())
8084        }
8085    }
8086
8087    fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8088        let mut variable = self.parse_identifier()?;
8089        if variable.as_str().parse() == Ok(SCHEMA) {
8090            variable = ident!("search_path");
8091        }
8092        Ok(Statement::ResetVariable(ResetVariableStatement {
8093            variable,
8094        }))
8095    }
8096
8097    fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8098        let redacted = self.parse_keyword(REDACTED);
8099        if redacted && !self.peek_keyword(CREATE) {
8100            return parser_err!(
8101                self,
8102                self.peek_pos(),
8103                "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8104            );
8105        }
8106        if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8107            self.parse_show_columns()
8108        } else if self.parse_keyword(OBJECTS) {
8109            let from = if self.parse_keywords(&[FROM]) {
8110                Some(self.parse_schema_name()?)
8111            } else {
8112                None
8113            };
8114            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8115                object_type: ShowObjectType::Object,
8116                from,
8117                filter: self.parse_show_statement_filter()?,
8118            }))
8119        } else if let Some(object_type) = self.parse_plural_object_type() {
8120            let from = if object_type.lives_in_schema() {
8121                if self.parse_keywords(&[FROM]) {
8122                    Some(self.parse_schema_name()?)
8123                } else {
8124                    None
8125                }
8126            } else {
8127                None
8128            };
8129
8130            let show_object_type = match object_type {
8131                ObjectType::Database => ShowObjectType::Database,
8132                ObjectType::Schema => {
8133                    let from = if self.parse_keyword(FROM) {
8134                        Some(self.parse_database_name()?)
8135                    } else {
8136                        None
8137                    };
8138                    ShowObjectType::Schema { from }
8139                }
8140                ObjectType::Table => {
8141                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8142                        Some(self.parse_raw_name()?)
8143                    } else {
8144                        None
8145                    };
8146                    ShowObjectType::Table { on_source }
8147                }
8148                ObjectType::View => ShowObjectType::View,
8149                ObjectType::Source => {
8150                    let in_cluster = self.parse_optional_in_cluster()?;
8151                    ShowObjectType::Source { in_cluster }
8152                }
8153                ObjectType::Subsource => {
8154                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8155                        Some(self.parse_raw_name()?)
8156                    } else {
8157                        None
8158                    };
8159
8160                    if from.is_some() && on_source.is_some() {
8161                        return parser_err!(
8162                            self,
8163                            self.peek_prev_pos(),
8164                            "Cannot specify both FROM and ON"
8165                        );
8166                    }
8167
8168                    ShowObjectType::Subsource { on_source }
8169                }
8170                ObjectType::Sink => {
8171                    let in_cluster = self.parse_optional_in_cluster()?;
8172                    ShowObjectType::Sink { in_cluster }
8173                }
8174                ObjectType::Type => ShowObjectType::Type,
8175                ObjectType::Role => ShowObjectType::Role,
8176                ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8177                ObjectType::Secret => ShowObjectType::Secret,
8178                ObjectType::Connection => ShowObjectType::Connection,
8179                ObjectType::Cluster => ShowObjectType::Cluster,
8180                ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8181                ObjectType::MaterializedView => {
8182                    let in_cluster = self.parse_optional_in_cluster()?;
8183                    ShowObjectType::MaterializedView { in_cluster }
8184                }
8185                ObjectType::Index => {
8186                    let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8187                        Some(self.parse_raw_name()?)
8188                    } else {
8189                        None
8190                    };
8191
8192                    if from.is_some() && on_object.is_some() {
8193                        return parser_err!(
8194                            self,
8195                            self.peek_prev_pos(),
8196                            "Cannot specify both FROM and ON"
8197                        );
8198                    }
8199
8200                    let in_cluster = self.parse_optional_in_cluster()?;
8201                    ShowObjectType::Index {
8202                        in_cluster,
8203                        on_object,
8204                    }
8205                }
8206                ObjectType::Func => {
8207                    return parser_err!(
8208                        self,
8209                        self.peek_prev_pos(),
8210                        format!("Unsupported SHOW on {object_type}")
8211                    );
8212                }
8213            };
8214            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8215                object_type: show_object_type,
8216                from,
8217                filter: self.parse_show_statement_filter()?,
8218            }))
8219        } else if self.parse_keyword(CLUSTER) {
8220            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8221                variable: ident!("cluster"),
8222            }))
8223        } else if self.parse_keyword(PRIVILEGES) {
8224            self.parse_show_privileges()
8225        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8226            self.parse_show_default_privileges()
8227        } else if self.parse_keyword(ROLE) {
8228            self.expect_keyword(MEMBERSHIP)?;
8229            let role = if self.parse_keyword(FOR) {
8230                Some(self.parse_identifier()?)
8231            } else {
8232                None
8233            };
8234            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8235                object_type: ShowObjectType::RoleMembership { role },
8236                from: None,
8237                filter: self.parse_show_statement_filter()?,
8238            }))
8239        } else if self.parse_keywords(&[CREATE, VIEW]) {
8240            Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8241                view_name: self.parse_raw_name()?,
8242                redacted,
8243            }))
8244        } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8245            Ok(ShowStatement::ShowCreateMaterializedView(
8246                ShowCreateMaterializedViewStatement {
8247                    materialized_view_name: self.parse_raw_name()?,
8248                    redacted,
8249                },
8250            ))
8251        } else if self.parse_keywords(&[CREATE, SOURCE]) {
8252            Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8253                source_name: self.parse_raw_name()?,
8254                redacted,
8255            }))
8256        } else if self.parse_keywords(&[CREATE, TABLE]) {
8257            Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8258                table_name: self.parse_raw_name()?,
8259                redacted,
8260            }))
8261        } else if self.parse_keywords(&[CREATE, SINK]) {
8262            Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8263                sink_name: self.parse_raw_name()?,
8264                redacted,
8265            }))
8266        } else if self.parse_keywords(&[CREATE, INDEX]) {
8267            Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8268                index_name: self.parse_raw_name()?,
8269                redacted,
8270            }))
8271        } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8272            Ok(ShowStatement::ShowCreateConnection(
8273                ShowCreateConnectionStatement {
8274                    connection_name: self.parse_raw_name()?,
8275                    redacted,
8276                },
8277            ))
8278        } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8279            if redacted {
8280                return parser_err!(
8281                    self,
8282                    self.peek_prev_pos(),
8283                    "SHOW REDACTED CREATE CLUSTER is not supported"
8284                );
8285            }
8286            Ok(ShowStatement::ShowCreateCluster(
8287                ShowCreateClusterStatement {
8288                    cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8289                },
8290            ))
8291        } else if self.parse_keywords(&[CREATE, TYPE]) {
8292            Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8293                type_name: self.parse_data_type()?,
8294                redacted,
8295            }))
8296        } else {
8297            let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8298                ident!("transaction_isolation")
8299            } else if self.parse_keywords(&[TIME, ZONE]) {
8300                ident!("timezone")
8301            } else {
8302                self.parse_identifier()?
8303            };
8304            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8305                variable,
8306            }))
8307        }
8308    }
8309
8310    fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8311        self.expect_one_of_keywords(&[FROM, IN])?;
8312        let table_name = self.parse_raw_name()?;
8313        // MySQL also supports FROM <database> here. In other words, MySQL
8314        // allows both FROM <table> FROM <database> and FROM <database>.<table>,
8315        // while we only support the latter for now.
8316        let filter = self.parse_show_statement_filter()?;
8317        Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8318            table_name,
8319            filter,
8320        }))
8321    }
8322
8323    fn parse_show_statement_filter(
8324        &mut self,
8325    ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8326        if self.parse_keyword(LIKE) {
8327            Ok(Some(ShowStatementFilter::Like(
8328                self.parse_literal_string()?,
8329            )))
8330        } else if self.parse_keyword(WHERE) {
8331            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8332        } else {
8333            Ok(None)
8334        }
8335    }
8336
8337    fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8338        let object_type = if self.parse_keyword(ON) {
8339            Some(self.expect_plural_system_object_type_for_privileges()?)
8340        } else {
8341            None
8342        };
8343        let role = if self.parse_keyword(FOR) {
8344            Some(self.parse_identifier()?)
8345        } else {
8346            None
8347        };
8348        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8349            object_type: ShowObjectType::Privileges { object_type, role },
8350            from: None,
8351            filter: self.parse_show_statement_filter()?,
8352        }))
8353    }
8354
8355    fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8356        let object_type = if self.parse_keyword(ON) {
8357            Some(self.expect_plural_object_type_for_privileges()?)
8358        } else {
8359            None
8360        };
8361        let role = if self.parse_keyword(FOR) {
8362            Some(self.parse_identifier()?)
8363        } else {
8364            None
8365        };
8366        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8367            object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8368            from: None,
8369            filter: self.parse_show_statement_filter()?,
8370        }))
8371    }
8372
8373    fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8374        self.expect_keyword(SHARD)?;
8375        let id = self.parse_literal_string()?;
8376        Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8377    }
8378
8379    fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8380        let relation = self.parse_table_factor()?;
8381
8382        // Note that for keywords to be properly handled here, they need to be
8383        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
8384        // a table alias.
8385        let mut joins = vec![];
8386        loop {
8387            let join = if self.parse_keyword(CROSS) {
8388                self.expect_keyword(JOIN)?;
8389                Join {
8390                    relation: self.parse_table_factor()?,
8391                    join_operator: JoinOperator::CrossJoin,
8392                }
8393            } else {
8394                let natural = self.parse_keyword(NATURAL);
8395                let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8396                    Some(kw)
8397                } else {
8398                    None
8399                };
8400
8401                let join_operator_type = match peek_keyword {
8402                    Some(INNER) | Some(JOIN) => {
8403                        let _ = self.parse_keyword(INNER);
8404                        self.expect_keyword(JOIN)?;
8405                        JoinOperator::Inner
8406                    }
8407                    Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8408                        let _ = self.next_token();
8409                        let _ = self.parse_keyword(OUTER);
8410                        self.expect_keyword(JOIN)?;
8411                        match kw {
8412                            LEFT => JoinOperator::LeftOuter,
8413                            RIGHT => JoinOperator::RightOuter,
8414                            FULL => JoinOperator::FullOuter,
8415                            _ => unreachable!(),
8416                        }
8417                    }
8418                    Some(OUTER) => {
8419                        return self.expected(
8420                            self.peek_pos(),
8421                            "LEFT, RIGHT, or FULL",
8422                            self.peek_token(),
8423                        );
8424                    }
8425                    None if natural => {
8426                        return self.expected(
8427                            self.peek_pos(),
8428                            "a join type after NATURAL",
8429                            self.peek_token(),
8430                        );
8431                    }
8432                    _ => break,
8433                };
8434                let relation = self.parse_table_factor()?;
8435                let join_constraint = self.parse_join_constraint(natural)?;
8436                Join {
8437                    relation,
8438                    join_operator: join_operator_type(join_constraint),
8439                }
8440            };
8441            joins.push(join);
8442        }
8443        Ok(TableWithJoins { relation, joins })
8444    }
8445
8446    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
8447    fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8448        // Guard the nested table-factor recursion. `FROM ((((…` descends
8449        // parse_table_factor -> parse_table_and_joins -> parse_table_factor,
8450        // and the inner `parse_query` recursion guard doesn't stop it because
8451        // the derived-table `maybe_parse` below swallows its
8452        // `RecursionLimitError`. Without this, deeply nested parens overflow
8453        // the stack (and the try-both backtracking balloons memory).
8454        self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8455    }
8456
8457    fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8458        if self.parse_keyword(LATERAL) {
8459            // LATERAL must always be followed by a subquery or table function.
8460            if self.consume_token(&Token::LParen) {
8461                return self.parse_derived_table_factor(Lateral);
8462            } else if self.parse_keywords(&[ROWS, FROM]) {
8463                return self.parse_rows_from();
8464            } else {
8465                let name = self.parse_raw_name()?;
8466                self.expect_token(&Token::LParen)?;
8467                let args = self.parse_optional_args(false)?;
8468                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8469                return Ok(TableFactor::Function {
8470                    function: Function {
8471                        name,
8472                        args,
8473                        filter: None,
8474                        over: None,
8475                        distinct: false,
8476                    },
8477                    alias,
8478                    with_ordinality,
8479                });
8480            }
8481        }
8482
8483        if self.consume_token(&Token::LParen) {
8484            // A left paren introduces either a derived table (i.e., a subquery)
8485            // or a nested join. It's nearly impossible to determine ahead of
8486            // time which it is... so we just try to parse both.
8487            //
8488            // Here's an example that demonstrates the complexity:
8489            //                     /-------------------------------------------------------\
8490            //                     | /-----------------------------------\                 |
8491            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
8492            //                   ^ ^ ^ ^
8493            //                   | | | |
8494            //                   | | | |
8495            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
8496            //                   | | (3) starts a derived table (subquery)
8497            //                   | (2) starts a nested join
8498            //                   (1) an additional set of parens around a nested join
8499            //
8500
8501            // Check if the recently consumed '(' started a derived table, in
8502            // which case we've parsed the subquery, followed by the closing
8503            // ')', and the alias of the derived table. In the example above
8504            // this is case (3), and the next token would be `NATURAL`.
8505            maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8506
8507            // The '(' we've recently consumed does not start a derived table.
8508            // For valid input this can happen either when the token following
8509            // the paren can't start a query (e.g. `foo` in `FROM (foo NATURAL
8510            // JOIN bar)`, or when the '(' we've consumed is followed by another
8511            // '(' that starts a derived table, like (3), or another nested join
8512            // (2).
8513            //
8514            // Ignore the error and back up to where we were before. Either
8515            // we'll be able to parse a valid nested join, or we won't, and
8516            // we'll return that error instead.
8517            let table_and_joins = self.parse_table_and_joins()?;
8518            match table_and_joins.relation {
8519                TableFactor::NestedJoin { .. } => (),
8520                _ => {
8521                    if table_and_joins.joins.is_empty() {
8522                        // The SQL spec prohibits derived tables and bare
8523                        // tables from appearing alone in parentheses.
8524                        self.expected(self.peek_pos(), "joined table", self.peek_token())?
8525                    }
8526                }
8527            }
8528            self.expect_token(&Token::RParen)?;
8529            Ok(TableFactor::NestedJoin {
8530                join: Box::new(table_and_joins),
8531                alias: self.parse_optional_table_alias()?,
8532            })
8533        } else if self.parse_keywords(&[ROWS, FROM]) {
8534            Ok(self.parse_rows_from()?)
8535        } else {
8536            let name = self.parse_raw_name()?;
8537            if self.consume_token(&Token::LParen) {
8538                let args = self.parse_optional_args(false)?;
8539                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8540                Ok(TableFactor::Function {
8541                    function: Function {
8542                        name,
8543                        args,
8544                        filter: None,
8545                        over: None,
8546                        distinct: false,
8547                    },
8548                    alias,
8549                    with_ordinality,
8550                })
8551            } else {
8552                Ok(TableFactor::Table {
8553                    name,
8554                    alias: self.parse_optional_table_alias()?,
8555                })
8556            }
8557        }
8558    }
8559
8560    fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8561        self.expect_token(&Token::LParen)?;
8562        let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8563        self.expect_token(&Token::RParen)?;
8564        let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8565        Ok(TableFactor::RowsFrom {
8566            functions,
8567            alias,
8568            with_ordinality,
8569        })
8570    }
8571
8572    /// Parses the things that can come after the argument list of a table function call. These are
8573    /// - optional WITH ORDINALITY
8574    /// - optional table alias
8575    /// - optional WITH ORDINALITY again! This is allowed just to keep supporting our earlier buggy
8576    ///   order where we allowed WITH ORDINALITY only after the table alias. (Postgres and other
8577    ///   systems support it only before the table alias.)
8578    fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8579        let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8580        let alias = self.parse_optional_table_alias()?;
8581        let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8582        if with_ordinality_1 && with_ordinality_2 {
8583            return parser_err!(
8584                self,
8585                self.peek_prev_pos(),
8586                "WITH ORDINALITY specified twice"
8587            );
8588        }
8589        Ok((with_ordinality_1 || with_ordinality_2, alias))
8590    }
8591
8592    fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8593        let name = self.parse_raw_name()?;
8594        self.parse_function(name)
8595    }
8596
8597    /// Parses a function call in a position that only permits "windowless"
8598    /// function syntax (PostgreSQL's `func_expr_windowless`): DISTINCT,
8599    /// FILTER, and OVER are not part of the grammar here, which guarantees
8600    /// the planner's invariant that table functions never carry them.
8601    fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8602        let name = self.parse_raw_name()?;
8603        self.expect_token(&Token::LParen)?;
8604        let args = self.parse_optional_args(false)?;
8605        Ok(Function {
8606            name,
8607            args,
8608            filter: None,
8609            over: None,
8610            distinct: false,
8611        })
8612    }
8613
8614    fn parse_derived_table_factor(
8615        &mut self,
8616        lateral: IsLateral,
8617    ) -> Result<TableFactor<Raw>, ParserError> {
8618        let subquery = Box::new(self.parse_query()?);
8619        self.expect_token(&Token::RParen)?;
8620        let alias = self.parse_optional_table_alias()?;
8621        Ok(TableFactor::Derived {
8622            lateral: match lateral {
8623                Lateral => true,
8624                NotLateral => false,
8625            },
8626            subquery,
8627            alias,
8628        })
8629    }
8630
8631    fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8632        if natural {
8633            Ok(JoinConstraint::Natural)
8634        } else if self.parse_keyword(ON) {
8635            let constraint = self.parse_expr()?;
8636            Ok(JoinConstraint::On(constraint))
8637        } else if self.parse_keyword(USING) {
8638            let columns = self.parse_parenthesized_column_list(Mandatory)?;
8639            let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8640
8641            Ok(JoinConstraint::Using { columns, alias })
8642        } else {
8643            self.expected(
8644                self.peek_pos(),
8645                "ON, or USING after JOIN",
8646                self.peek_token(),
8647            )
8648        }
8649    }
8650
8651    /// Parse an INSERT statement
8652    fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8653        self.expect_keyword(INTO)?;
8654        let table_name = self.parse_raw_name()?;
8655        let columns = self.parse_parenthesized_column_list(Optional)?;
8656        let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8657            InsertSource::DefaultValues
8658        } else {
8659            InsertSource::Query(self.parse_query()?)
8660        };
8661        let returning = self.parse_returning()?;
8662        Ok(Statement::Insert(InsertStatement {
8663            table_name,
8664            columns,
8665            source,
8666            returning,
8667        }))
8668    }
8669
8670    fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8671        Ok(if self.parse_keyword(RETURNING) {
8672            self.parse_comma_separated(Parser::parse_select_item)?
8673        } else {
8674            Vec::new()
8675        })
8676    }
8677
8678    fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8679        let table_name = RawItemName::Name(self.parse_item_name()?);
8680        // The alias here doesn't support columns, so don't use parse_optional_table_alias.
8681        let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8682        let alias = alias.map(|name| TableAlias {
8683            name,
8684            columns: Vec::new(),
8685            strict: false,
8686        });
8687
8688        self.expect_keyword(SET)?;
8689        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8690        let selection = if self.parse_keyword(WHERE) {
8691            Some(self.parse_expr()?)
8692        } else {
8693            None
8694        };
8695
8696        Ok(Statement::Update(UpdateStatement {
8697            table_name,
8698            alias,
8699            assignments,
8700            selection,
8701        }))
8702    }
8703
8704    /// Parse a `var = expr` assignment, used in an UPDATE statement
8705    fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8706        let id = self.parse_identifier()?;
8707        self.expect_token(&Token::Eq)?;
8708        let value = self.parse_expr()?;
8709        Ok(Assignment { id, value })
8710    }
8711
8712    fn parse_optional_args(
8713        &mut self,
8714        allow_order_by: bool,
8715    ) -> Result<FunctionArgs<Raw>, ParserError> {
8716        if self.consume_token(&Token::Star) {
8717            self.expect_token(&Token::RParen)?;
8718            Ok(FunctionArgs::Star)
8719        } else if self.consume_token(&Token::RParen) {
8720            Ok(FunctionArgs::args(vec![]))
8721        } else {
8722            let args = self.parse_comma_separated(Parser::parse_expr)?;
8723            // ORDER BY can only appear after at least one argument, and not after a
8724            // star. We can ignore checking for it in the other branches. See:
8725            // https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES
8726            let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8727                self.parse_comma_separated(Parser::parse_order_by_expr)?
8728            } else {
8729                vec![]
8730            };
8731            self.expect_token(&Token::RParen)?;
8732            Ok(FunctionArgs::Args { args, order_by })
8733        }
8734    }
8735
8736    /// Parse `AS OF`, if present.
8737    fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8738        if self.parse_keyword(AS) {
8739            self.expect_keyword(OF)?;
8740            if self.parse_keywords(&[AT, LEAST]) {
8741                match self.parse_expr() {
8742                    Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8743                    Err(e) => self.expected(
8744                        e.pos,
8745                        "a timestamp value after 'AS OF AT LEAST'",
8746                        self.peek_token(),
8747                    ),
8748                }
8749            } else {
8750                match self.parse_expr() {
8751                    Ok(expr) => Ok(Some(AsOf::At(expr))),
8752                    Err(e) => {
8753                        self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8754                    }
8755                }
8756            }
8757        } else {
8758            Ok(None)
8759        }
8760    }
8761
8762    /// Parse `UP TO`, if present
8763    fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
8764        if self.parse_keyword(UP) {
8765            self.expect_keyword(TO)?;
8766            self.parse_expr().map(Some)
8767        } else {
8768            Ok(None)
8769        }
8770    }
8771
8772    /// Parse `AS OF`, if present.
8773    ///
8774    /// In contrast to `parse_optional_as_of`, this parser only supports `AS OF <time>` syntax and
8775    /// directly returns an `u64`. It is only meant to be used for internal SQL syntax.
8776    fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
8777        fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
8778            let value = parser.parse_value().ok()?;
8779            let Value::Number(s) = value else { return None };
8780            s.parse().ok()
8781        }
8782
8783        if self.parse_keywords(&[AS, OF]) {
8784            match try_parse_u64(self) {
8785                Some(time) => Ok(Some(time)),
8786                None => {
8787                    self.prev_token();
8788                    self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
8789                }
8790            }
8791        } else {
8792            Ok(None)
8793        }
8794    }
8795
8796    /// Parse a comma-delimited list of projections after SELECT
8797    fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
8798        if self.consume_token(&Token::Star) {
8799            return Ok(SelectItem::Wildcard);
8800        }
8801        Ok(SelectItem::Expr {
8802            expr: self.parse_expr()?,
8803            alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
8804        })
8805    }
8806
8807    /// Parse an expression, optionally followed by ASC or DESC,
8808    /// and then `[NULLS { FIRST | LAST }]` (used in ORDER BY)
8809    fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
8810        let expr = self.parse_expr()?;
8811
8812        let asc = if self.parse_keyword(ASC) {
8813            Some(true)
8814        } else if self.parse_keyword(DESC) {
8815            Some(false)
8816        } else {
8817            None
8818        };
8819
8820        let nulls_last = if self.parse_keyword(NULLS) {
8821            let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
8822            Some(last)
8823        } else {
8824            None
8825        };
8826
8827        Ok(OrderByExpr {
8828            expr,
8829            asc,
8830            nulls_last,
8831        })
8832    }
8833
8834    fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
8835        let values = self.parse_comma_separated(|parser| {
8836            parser.expect_token(&Token::LParen)?;
8837            let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8838            parser.expect_token(&Token::RParen)?;
8839            Ok(exprs)
8840        })?;
8841        Ok(Values(values))
8842    }
8843
8844    fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
8845        self.expect_keyword(TRANSACTION)?;
8846        Ok(Statement::StartTransaction(StartTransactionStatement {
8847            modes: self.parse_transaction_modes(false)?,
8848        }))
8849    }
8850
8851    fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
8852        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8853        Ok(Statement::StartTransaction(StartTransactionStatement {
8854            modes: self.parse_transaction_modes(false)?,
8855        }))
8856    }
8857
8858    fn parse_transaction_modes(
8859        &mut self,
8860        mut required: bool,
8861    ) -> Result<Vec<TransactionMode>, ParserError> {
8862        let mut modes = vec![];
8863        loop {
8864            let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
8865                let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
8866                    TransactionIsolationLevel::ReadUncommitted
8867                } else if self.parse_keywords(&[READ, COMMITTED]) {
8868                    TransactionIsolationLevel::ReadCommitted
8869                } else if self.parse_keywords(&[REPEATABLE, READ]) {
8870                    TransactionIsolationLevel::RepeatableRead
8871                } else if self.parse_keyword(SERIALIZABLE) {
8872                    TransactionIsolationLevel::Serializable
8873                } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
8874                    TransactionIsolationLevel::StrongSessionSerializable
8875                } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
8876                    TransactionIsolationLevel::StrictSerializable
8877                } else {
8878                    self.expected(self.peek_pos(), "isolation level", self.peek_token())?
8879                };
8880                TransactionMode::IsolationLevel(iso_level)
8881            } else if self.parse_keywords(&[READ, ONLY]) {
8882                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8883            } else if self.parse_keywords(&[READ, WRITE]) {
8884                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8885            } else if required {
8886                self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
8887            } else {
8888                break;
8889            };
8890            modes.push(mode);
8891            // ANSI requires a comma after each transaction mode, but
8892            // PostgreSQL, for historical reasons, does not. We follow
8893            // PostgreSQL in making the comma optional, since that is strictly
8894            // more general.
8895            required = self.consume_token(&Token::Comma);
8896        }
8897        Ok(modes)
8898    }
8899
8900    fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
8901        Ok(Statement::Commit(CommitStatement {
8902            chain: self.parse_commit_rollback_chain()?,
8903        }))
8904    }
8905
8906    fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
8907        Ok(Statement::Rollback(RollbackStatement {
8908            chain: self.parse_commit_rollback_chain()?,
8909        }))
8910    }
8911
8912    fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
8913        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8914        if self.parse_keyword(AND) {
8915            let chain = !self.parse_keyword(NO);
8916            self.expect_keyword(CHAIN)?;
8917            Ok(chain)
8918        } else {
8919            Ok(false)
8920        }
8921    }
8922
8923    fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
8924        parser_err!(
8925            self,
8926            self.peek_prev_pos(),
8927            "TAIL has been renamed to SUBSCRIBE"
8928        )
8929    }
8930
8931    fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
8932        let _ = self.parse_keyword(TO);
8933        let relation = if self.consume_token(&Token::LParen) {
8934            let query = self.parse_query()?;
8935            self.expect_token(&Token::RParen)?;
8936            SubscribeRelation::Query(query)
8937        } else {
8938            SubscribeRelation::Name(self.parse_raw_name()?)
8939        };
8940        let mut output = self.parse_subscribe_output()?;
8941        let options = if self.parse_keyword(WITH) {
8942            self.expect_token(&Token::LParen)?;
8943            let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
8944            self.expect_token(&Token::RParen)?;
8945            options
8946        } else {
8947            vec![]
8948        };
8949        let as_of = self.parse_optional_as_of()?;
8950        let up_to = self.parse_optional_up_to()?;
8951        // For backwards compatibility, we allow parsing output options
8952        // (`ENVELOPE`, `WITHIN TIMESTAMP ORDER BY`) at the end of the
8953        // statement, if they haven't already been specified where we prefer
8954        // them, before the `WITH` options and before the `AS OF`/`UP TO`
8955        // options. Our preferred syntax better aligns with the option ordering
8956        // for `CREATE SINK` and `SELECT`.
8957        if output == SubscribeOutput::Diffs {
8958            output = self.parse_subscribe_output()?;
8959        }
8960        Ok(Statement::Subscribe(SubscribeStatement {
8961            relation,
8962            options,
8963            as_of,
8964            up_to,
8965            output,
8966        }))
8967    }
8968
8969    fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
8970        let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
8971            PROGRESS => SubscribeOptionName::Progress,
8972            SNAPSHOT => SubscribeOptionName::Snapshot,
8973            _ => unreachable!(),
8974        };
8975        Ok(SubscribeOption {
8976            name,
8977            value: self.parse_optional_option_value()?,
8978        })
8979    }
8980
8981    fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
8982        if self.parse_keywords(&[ENVELOPE]) {
8983            let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
8984            self.expect_token(&Token::LParen)?;
8985            self.expect_keyword(KEY)?;
8986            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
8987            let output = match keyword {
8988                UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
8989                DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
8990                _ => unreachable!("no other keyword allowed"),
8991            };
8992            self.expect_token(&Token::RParen)?;
8993            Ok(output)
8994        } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
8995            Ok(SubscribeOutput::WithinTimestampOrderBy {
8996                order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
8997            })
8998        } else {
8999            Ok(SubscribeOutput::Diffs)
9000        }
9001    }
9002
9003    /// Parse an `EXPLAIN` statement, assuming that the `EXPLAIN` token
9004    /// has already been consumed.
9005    fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9006        if self.parse_keyword(TIMESTAMP) {
9007            self.parse_explain_timestamp()
9008                .map_parser_err(StatementKind::ExplainTimestamp)
9009        } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9010            self.parse_explain_pushdown()
9011                .map_parser_err(StatementKind::ExplainPushdown)
9012        } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9013            self.parse_explain_analyze()
9014                .map_parser_err(StatementKind::ExplainAnalyzeObject)
9015        } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9016            self.parse_explain_schema()
9017                .map_parser_err(StatementKind::ExplainSinkSchema)
9018        } else {
9019            self.parse_explain_plan()
9020                .map_parser_err(StatementKind::ExplainPlan)
9021        }
9022    }
9023
9024    fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9025        let explainee = if self.parse_keyword(VIEW) {
9026            // Parse: `VIEW name`
9027            Explainee::View(self.parse_raw_name()?)
9028        } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9029            // Parse: `MATERIALIZED VIEW name`
9030            Explainee::MaterializedView(self.parse_raw_name()?)
9031        } else if self.parse_keyword(INDEX) {
9032            // Parse: `INDEX name`
9033            Explainee::Index(self.parse_raw_name()?)
9034        } else if self.parse_keywords(&[REPLAN, VIEW]) {
9035            // Parse: `REPLAN VIEW name`
9036            Explainee::ReplanView(self.parse_raw_name()?)
9037        } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9038            // Parse: `REPLAN MATERIALIZED VIEW name`
9039            Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9040        } else if self.parse_keywords(&[REPLAN, INDEX]) {
9041            // Parse: `REPLAN INDEX name`
9042            Explainee::ReplanIndex(self.parse_raw_name()?)
9043        } else {
9044            let broken = self.parse_keyword(BROKEN);
9045
9046            if self.peek_keywords(&[CREATE, VIEW])
9047                || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9048            {
9049                // Parse: `BROKEN? CREATE [OR REPLACE] VIEW ...`
9050                let _ = self.parse_keyword(CREATE); // consume CREATE token
9051                let stmt = match self.parse_create_view()? {
9052                    Statement::CreateView(stmt) => stmt,
9053                    _ => panic!("Unexpected statement type return after parsing"),
9054                };
9055
9056                Explainee::CreateView(Box::new(stmt), broken)
9057            } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9058                || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9059            {
9060                // Parse: `BROKEN? CREATE [OR REPLACE] MATERIALIZED VIEW ...`
9061                let _ = self.parse_keyword(CREATE); // consume CREATE token
9062                let stmt = match self.parse_create_materialized_view()? {
9063                    Statement::CreateMaterializedView(stmt) => stmt,
9064                    _ => panic!("Unexpected statement type return after parsing"),
9065                };
9066
9067                Explainee::CreateMaterializedView(Box::new(stmt), broken)
9068            } else if self.peek_keywords(&[CREATE, INDEX])
9069                || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9070            {
9071                // Parse: `BROKEN? CREATE INDEX ...`
9072                let _ = self.parse_keyword(CREATE); // consume CREATE token
9073                let stmt = match self.parse_create_index()? {
9074                    Statement::CreateIndex(stmt) => stmt,
9075                    _ => panic!("Unexpected statement type return after parsing"),
9076                };
9077
9078                Explainee::CreateIndex(Box::new(stmt), broken)
9079            } else if self.peek_keyword(SUBSCRIBE) {
9080                // Parse: `BROKEN? SUBSCRIBE ...`
9081                let _ = self.parse_keyword(SUBSCRIBE); // consume SUBSCRIBE token
9082                let stmt = match self.parse_subscribe()? {
9083                    Statement::Subscribe(stmt) => stmt,
9084                    _ => panic!("Unexpected statement type return after parsing"),
9085                };
9086                Explainee::Subscribe(Box::new(stmt), broken)
9087            } else {
9088                // Parse: `BROKEN? query`
9089                let query = self.parse_select_statement()?;
9090                Explainee::Select(Box::new(query), broken)
9091            }
9092        };
9093        Ok(explainee)
9094    }
9095
9096    /// Parse an `EXPLAIN ... PLAN` statement, assuming that the `EXPLAIN` token
9097    /// has already been consumed.
9098    fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9099        let start = self.peek_pos();
9100        let (has_stage, stage) = match self.parse_one_of_keywords(&[
9101            RAW,
9102            DECORRELATED,
9103            LOCALLY,
9104            OPTIMIZED,
9105            PHYSICAL,
9106            OPTIMIZER,
9107            PLAN,
9108        ]) {
9109            Some(RAW) => {
9110                self.expect_keyword(PLAN)?;
9111                (true, Some(ExplainStage::RawPlan))
9112            }
9113            Some(DECORRELATED) => {
9114                self.expect_keyword(PLAN)?;
9115                (true, Some(ExplainStage::DecorrelatedPlan))
9116            }
9117            Some(LOCALLY) => {
9118                self.expect_keywords(&[OPTIMIZED, PLAN])?;
9119                (true, Some(ExplainStage::LocalPlan))
9120            }
9121            Some(OPTIMIZED) => {
9122                self.expect_keyword(PLAN)?;
9123                (true, Some(ExplainStage::GlobalPlan))
9124            }
9125            Some(PHYSICAL) => {
9126                self.expect_keyword(PLAN)?;
9127                (true, Some(ExplainStage::PhysicalPlan))
9128            }
9129            Some(OPTIMIZER) => {
9130                self.expect_keyword(TRACE)?;
9131                (true, Some(ExplainStage::Trace))
9132            }
9133            Some(PLAN) => {
9134                if self.parse_keyword(INSIGHTS) {
9135                    (true, Some(ExplainStage::PlanInsights))
9136                } else {
9137                    // Use the default plan for the explainee.
9138                    (true, None)
9139                }
9140            }
9141            None => {
9142                // Use the default plan for the explainee.
9143                (false, None)
9144            }
9145            _ => unreachable!(),
9146        };
9147
9148        let with_options = if self.parse_keyword(WITH) {
9149            if self.consume_token(&Token::LParen) {
9150                let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9151                self.expect_token(&Token::RParen)?;
9152                options
9153            } else {
9154                self.prev_token(); // push back WITH in case it's actually a CTE
9155                vec![]
9156            }
9157        } else {
9158            vec![]
9159        };
9160
9161        let format = if self.parse_keyword(AS) {
9162            match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9163                Some(TEXT) => Some(ExplainFormat::Text),
9164                Some(JSON) => Some(ExplainFormat::Json),
9165                Some(DOT) => Some(ExplainFormat::Dot),
9166                Some(VERBOSE) => {
9167                    self.expect_keyword(TEXT)?;
9168                    Some(ExplainFormat::VerboseText)
9169                }
9170                None => return Err(ParserError::new(self.index, "expected a format")),
9171                _ => unreachable!(),
9172            }
9173        } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9174            // if EXPLAIN PHYSICAL PLAN is explicitly specified without AS, default to VERBOSE TEXT
9175            Some(ExplainFormat::VerboseText)
9176        } else {
9177            None
9178        };
9179
9180        if has_stage {
9181            self.expect_keyword(FOR)?;
9182        }
9183
9184        let explainee = self.parse_explainee()?;
9185
9186        // Explainees that represent a view only work in association with an
9187        // explicitly defined stage.
9188        if matches!((explainee.is_view(), &stage), (true, None)) {
9189            let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9190            return Err(self.error(start, msg));
9191        }
9192
9193        Ok(Statement::ExplainPlan(ExplainPlanStatement {
9194            stage,
9195            with_options,
9196            format,
9197            explainee,
9198        }))
9199    }
9200
9201    fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9202        Ok(ExplainPlanOption {
9203            name: self.parse_explain_plan_option_name()?,
9204            value: self.parse_optional_option_value()?,
9205        })
9206    }
9207
9208    /// Parse an `EXPLAIN FILTER PUSHDOWN` statement, assuming that the `EXPLAIN
9209    /// PUSHDOWN` tokens have already been consumed.
9210    fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9211        self.expect_keyword(FOR)?;
9212
9213        let explainee = self.parse_explainee()?;
9214
9215        Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9216            explainee,
9217        }))
9218    }
9219
9220    fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9221        // EXPLAIN ANALYZE CLUSTER (MEMORY | CPU) [WITH SKEW] [AS SQL]
9222        if self.parse_keyword(CLUSTER) {
9223            let properties = self.parse_explain_analyze_computation_properties()?;
9224            let as_sql = self.parse_keywords(&[AS, SQL]);
9225            return Ok(Statement::ExplainAnalyzeCluster(
9226                ExplainAnalyzeClusterStatement { properties, as_sql },
9227            ));
9228        }
9229
9230        // EXPLAIN ANALYZE ((MEMORY | CPU) [WITH SKEW] | HINTS) FOR (INDEX ... | MATERIALIZED VIEW ...) [AS SQL]
9231
9232        let properties = if self.parse_keyword(HINTS) {
9233            ExplainAnalyzeProperty::Hints
9234        } else {
9235            ExplainAnalyzeProperty::Computation(
9236                self.parse_explain_analyze_computation_properties()?,
9237            )
9238        };
9239
9240        self.expect_keyword(FOR)?;
9241
9242        let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9243            INDEX => Explainee::Index(self.parse_raw_name()?),
9244            MATERIALIZED => {
9245                self.expect_keyword(VIEW)?;
9246                Explainee::MaterializedView(self.parse_raw_name()?)
9247            }
9248            _ => unreachable!(),
9249        };
9250
9251        let as_sql = self.parse_keywords(&[AS, SQL]);
9252
9253        Ok(Statement::ExplainAnalyzeObject(
9254            ExplainAnalyzeObjectStatement {
9255                properties,
9256                explainee,
9257                as_sql,
9258            },
9259        ))
9260    }
9261
9262    fn parse_explain_analyze_computation_properties(
9263        &mut self,
9264    ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9265        let mut computation_properties = vec![CPU, MEMORY];
9266        let (kw, property) =
9267            self.parse_explain_analyze_computation_property(&computation_properties)?;
9268        let mut properties = vec![property];
9269        computation_properties.retain(|p| p != &kw);
9270
9271        while self.consume_token(&Token::Comma) {
9272            let (kw, property) =
9273                self.parse_explain_analyze_computation_property(&computation_properties)?;
9274            computation_properties.retain(|p| p != &kw);
9275            properties.push(property);
9276        }
9277
9278        let skew = self.parse_keywords(&[WITH, SKEW]);
9279
9280        Ok(ExplainAnalyzeComputationProperties { properties, skew })
9281    }
9282
9283    fn parse_explain_analyze_computation_property(
9284        &mut self,
9285        properties: &[Keyword],
9286    ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9287        if properties.is_empty() {
9288            return Err(ParserError::new(
9289                self.peek_pos(),
9290                "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9291            ));
9292        }
9293
9294        match self.expect_one_of_keywords(properties)? {
9295            CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9296            MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9297            _ => unreachable!(),
9298        }
9299    }
9300
9301    /// Parse an `EXPLAIN TIMESTAMP` statement, assuming that the `EXPLAIN
9302    /// TIMESTAMP` tokens have already been consumed.
9303    fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9304        let format = if self.parse_keyword(AS) {
9305            match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9306                Some(TEXT) => Some(ExplainFormat::Text),
9307                Some(JSON) => Some(ExplainFormat::Json),
9308                None => return Err(ParserError::new(self.index, "expected a format")),
9309                _ => unreachable!(),
9310            }
9311        } else {
9312            None
9313        };
9314
9315        self.expect_keyword(FOR)?;
9316
9317        let query = self.parse_select_statement()?;
9318
9319        Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9320            format,
9321            select: query,
9322        }))
9323    }
9324    /// Parse an `EXPLAIN [KEY|VALUE] SCHEMA` statement assuming that the `EXPLAIN` token
9325    /// have already been consumed
9326    fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9327        let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9328            KEY => ExplainSinkSchemaFor::Key,
9329            VALUE => ExplainSinkSchemaFor::Value,
9330            _ => unreachable!(),
9331        };
9332
9333        self.expect_keyword(SCHEMA)?;
9334
9335        let format = if self.parse_keyword(AS) {
9336            // only json format is supported
9337            self.expect_keyword(JSON)?;
9338            Some(ExplainFormat::Json)
9339        } else {
9340            None
9341        };
9342
9343        self.expect_keywords(&[FOR, CREATE])?;
9344
9345        if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9346            Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9347                schema_for,
9348                format,
9349                statement,
9350            }))
9351        } else {
9352            unreachable!("only create sink can be returned here");
9353        }
9354    }
9355
9356    /// Parse a `DECLARE` statement, assuming that the `DECLARE` token
9357    /// has already been consumed.
9358    fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9359        let name = self
9360            .parse_identifier()
9361            .map_parser_err(StatementKind::Declare)?;
9362        self.expect_keyword(CURSOR)
9363            .map_parser_err(StatementKind::Declare)?;
9364        if self.parse_keyword(WITH) {
9365            let err = parser_err!(
9366                self,
9367                self.peek_prev_pos(),
9368                format!("WITH HOLD is unsupported for cursors")
9369            )
9370            .map_parser_err(StatementKind::Declare);
9371            self.expect_keyword(HOLD)
9372                .map_parser_err(StatementKind::Declare)?;
9373            return err;
9374        }
9375        // WITHOUT HOLD is optional and the default behavior so we can ignore it.
9376        let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9377        self.expect_keyword(FOR)
9378            .map_parser_err(StatementKind::Declare)?;
9379        let StatementParseResult { ast, sql } = self.parse_statement()?;
9380        Ok(Statement::Declare(DeclareStatement {
9381            name,
9382            stmt: Box::new(ast),
9383            sql: sql.to_string(),
9384        }))
9385    }
9386
9387    /// Parse a `CLOSE` statement, assuming that the `CLOSE` token
9388    /// has already been consumed.
9389    fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9390        let name = self.parse_identifier()?;
9391        Ok(Statement::Close(CloseStatement { name }))
9392    }
9393
9394    /// Parse a `PREPARE` statement, assuming that the `PREPARE` token
9395    /// has already been consumed.
9396    fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9397        let name = self
9398            .parse_identifier()
9399            .map_parser_err(StatementKind::Prepare)?;
9400        self.expect_keyword(AS)
9401            .map_parser_err(StatementKind::Prepare)?;
9402        let pos = self.peek_pos();
9403        //
9404        let StatementParseResult { ast, sql } = self.parse_statement()?;
9405        if !matches!(
9406            ast,
9407            Statement::Select(_)
9408                | Statement::Insert(_)
9409                | Statement::Delete(_)
9410                | Statement::Update(_)
9411                | Statement::Fetch(_),
9412        ) {
9413            return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9414        }
9415        Ok(Statement::Prepare(PrepareStatement {
9416            name,
9417            stmt: Box::new(ast),
9418            sql: sql.to_string(),
9419        }))
9420    }
9421
9422    /// Parse a `EXECUTE` statement, assuming that the `EXECUTE` token
9423    /// has already been consumed.
9424    fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9425        // Check if this is EXECUTE UNIT TEST
9426        if self.parse_keywords(&[UNIT, TEST]) {
9427            return self.parse_execute_unit_test();
9428        }
9429
9430        // Otherwise parse as regular EXECUTE (prepared statement)
9431        let name = self.parse_identifier()?;
9432        let params = if self.consume_token(&Token::LParen) {
9433            let params = self.parse_comma_separated(Parser::parse_expr)?;
9434            self.expect_token(&Token::RParen)?;
9435            params
9436        } else {
9437            Vec::new()
9438        };
9439        Ok(Statement::Execute(ExecuteStatement { name, params }))
9440    }
9441
9442    /// Parse an `EXECUTE UNIT TEST` statement, assuming that the
9443    /// `EXECUTE UNIT TEST` tokens have already been consumed.
9444    fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9445        // Parse test name
9446        let name = self.parse_identifier()?;
9447
9448        // Expect FOR keyword
9449        self.expect_keyword(FOR)?;
9450
9451        // Parse target view name
9452        let target = self.parse_raw_name()?;
9453
9454        // Parse optional AT TIME clause
9455        let at_time = if self.parse_keywords(&[AT, TIME]) {
9456            Some(self.parse_expr()?)
9457        } else {
9458            None
9459        };
9460
9461        // Parse MOCK definitions (0 or more). Like CTEs, MOCK clauses are
9462        // comma-separated; no comma appears before the trailing `EXPECTED`
9463        // clause.
9464        let mut mocks = Vec::new();
9465        if self.parse_keyword(MOCK) {
9466            mocks.push(self.parse_mock_view_def()?);
9467            while self.consume_token(&Token::Comma) {
9468                self.expect_keyword(MOCK)?;
9469                mocks.push(self.parse_mock_view_def()?);
9470            }
9471        }
9472
9473        self.expect_keyword(EXPECTED)?;
9474
9475        self.expect_token(&Token::LParen)?;
9476        let expected_columns = self.parse_comma_separated(|parser| {
9477            Ok(ColumnDef {
9478                name: parser.parse_identifier()?,
9479                data_type: parser.parse_data_type()?,
9480                collation: None,
9481                options: vec![],
9482            })
9483        })?;
9484        self.expect_token(&Token::RParen)?;
9485
9486        self.expect_keyword(AS)?;
9487        self.expect_token(&Token::LParen)?;
9488        let expected_query = self.parse_query()?;
9489        self.expect_token(&Token::RParen)?;
9490
9491        let expected = ExpectedResultDef {
9492            columns: expected_columns,
9493            query: expected_query,
9494        };
9495
9496        Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9497            name,
9498            target,
9499            at_time,
9500            mocks,
9501            expected,
9502        }))
9503    }
9504
9505    /// Parse a single `MOCK <name> (<cols>) AS (<query>)` definition,
9506    /// assuming the leading `MOCK` keyword has already been consumed.
9507    fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9508        let name = self.parse_raw_name()?;
9509
9510        self.expect_token(&Token::LParen)?;
9511        let columns = self.parse_comma_separated(|parser| {
9512            Ok(ColumnDef {
9513                name: parser.parse_identifier()?,
9514                data_type: parser.parse_data_type()?,
9515                collation: None,
9516                options: vec![],
9517            })
9518        })?;
9519        self.expect_token(&Token::RParen)?;
9520
9521        self.expect_keyword(AS)?;
9522        self.expect_token(&Token::LParen)?;
9523        let query = self.parse_query()?;
9524        self.expect_token(&Token::RParen)?;
9525
9526        Ok(MockViewDef {
9527            name,
9528            columns,
9529            query,
9530        })
9531    }
9532
9533    /// Parse a `DEALLOCATE` statement, assuming that the `DEALLOCATE` token
9534    /// has already been consumed.
9535    fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9536        let _ = self.parse_keyword(PREPARE);
9537        let name = if self.parse_keyword(ALL) {
9538            None
9539        } else {
9540            Some(self.parse_identifier()?)
9541        };
9542        Ok(Statement::Deallocate(DeallocateStatement { name }))
9543    }
9544
9545    /// Parse a `FETCH` statement, assuming that the `FETCH` token
9546    /// has already been consumed.
9547    fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9548        let _ = self.parse_keyword(FORWARD);
9549        let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9550            Some(FetchDirection::ForwardCount(count))
9551        } else if self.parse_keyword(ALL) {
9552            Some(FetchDirection::ForwardAll)
9553        } else {
9554            None
9555        };
9556        let _ = self.parse_keyword(FROM);
9557        let name = self.parse_identifier()?;
9558        let options = if self.parse_keyword(WITH) {
9559            self.expect_token(&Token::LParen)?;
9560            let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9561            self.expect_token(&Token::RParen)?;
9562            options
9563        } else {
9564            vec![]
9565        };
9566        Ok(Statement::Fetch(FetchStatement {
9567            name,
9568            count,
9569            options,
9570        }))
9571    }
9572
9573    fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9574        self.expect_keyword(TIMEOUT)?;
9575        Ok(FetchOption {
9576            name: FetchOptionName::Timeout,
9577            value: self.parse_optional_option_value()?,
9578        })
9579    }
9580
9581    /// Parse a `RAISE` statement, assuming that the `RAISE` token
9582    /// has already been consumed.
9583    fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9584        let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9585            Some(DEBUG) => NoticeSeverity::Debug,
9586            Some(INFO) => NoticeSeverity::Info,
9587            Some(LOG) => NoticeSeverity::Log,
9588            Some(NOTICE) => NoticeSeverity::Notice,
9589            Some(WARNING) => NoticeSeverity::Warning,
9590            Some(_) => unreachable!(),
9591            None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9592        };
9593
9594        Ok(Statement::Raise(RaiseStatement { severity }))
9595    }
9596
9597    /// Parse a `GRANT` statement, assuming that the `GRANT` token
9598    /// has already been consumed.
9599    fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9600        match self.parse_privilege_specification() {
9601            Some(privileges) => self
9602                .parse_grant_privilege(privileges)
9603                .map_parser_err(StatementKind::GrantPrivileges),
9604            None => self
9605                .parse_grant_role()
9606                .map_parser_err(StatementKind::GrantRole),
9607        }
9608    }
9609
9610    /// Parse a `GRANT PRIVILEGE` statement, assuming that the `GRANT` token
9611    /// and all privileges have already been consumed.
9612    fn parse_grant_privilege(
9613        &mut self,
9614        privileges: PrivilegeSpecification,
9615    ) -> Result<Statement<Raw>, ParserError> {
9616        self.expect_keyword(ON)?;
9617        let target = self.expect_grant_target_specification("GRANT")?;
9618        self.expect_keyword(TO)?;
9619        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9620        Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9621            privileges,
9622            target,
9623            roles,
9624        }))
9625    }
9626
9627    /// Parse a `GRANT ROLE` statement, assuming that the `GRANT` token
9628    /// has already been consumed.
9629    fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9630        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9631        self.expect_keyword(TO)?;
9632        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9633        Ok(Statement::GrantRole(GrantRoleStatement {
9634            role_names,
9635            member_names,
9636        }))
9637    }
9638
9639    /// Parse a `REVOKE` statement, assuming that the `REVOKE` token
9640    /// has already been consumed.
9641    fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9642        match self.parse_privilege_specification() {
9643            Some(privileges) => self
9644                .parse_revoke_privilege(privileges)
9645                .map_parser_err(StatementKind::RevokePrivileges),
9646            None => self
9647                .parse_revoke_role()
9648                .map_parser_err(StatementKind::RevokeRole),
9649        }
9650    }
9651
9652    /// Parse a `REVOKE PRIVILEGE` statement, assuming that the `REVOKE` token
9653    /// and all privileges have already been consumed.
9654    fn parse_revoke_privilege(
9655        &mut self,
9656        privileges: PrivilegeSpecification,
9657    ) -> Result<Statement<Raw>, ParserError> {
9658        self.expect_keyword(ON)?;
9659        let target = self.expect_grant_target_specification("REVOKE")?;
9660        self.expect_keyword(FROM)?;
9661        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9662        Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9663            privileges,
9664            target,
9665            roles,
9666        }))
9667    }
9668
9669    /// Parse a `REVOKE ROLE` statement, assuming that the `REVOKE` token
9670    /// has already been consumed.
9671    fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9672        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9673        self.expect_keyword(FROM)?;
9674        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9675        Ok(Statement::RevokeRole(RevokeRoleStatement {
9676            role_names,
9677            member_names,
9678        }))
9679    }
9680
9681    fn expect_grant_target_specification(
9682        &mut self,
9683        statement_type: &str,
9684    ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9685        if self.parse_keyword(SYSTEM) {
9686            return Ok(GrantTargetSpecification::System);
9687        }
9688
9689        let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9690            let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9691            let object_spec_inner = if self.parse_keyword(IN) {
9692                if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9693                    return parser_err!(
9694                        self,
9695                        self.peek_prev_pos(),
9696                        format!("IN invalid for {object_type}S")
9697                    );
9698                }
9699                match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9700                    DATABASE => GrantTargetSpecificationInner::All(
9701                        GrantTargetAllSpecification::AllDatabases {
9702                            databases: self.parse_comma_separated(Parser::parse_database_name)?,
9703                        },
9704                    ),
9705                    SCHEMA => {
9706                        if object_type == ObjectType::Schema {
9707                            self.prev_token();
9708                            self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9709                        }
9710                        GrantTargetSpecificationInner::All(
9711                            GrantTargetAllSpecification::AllSchemas {
9712                                schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9713                            },
9714                        )
9715                    }
9716                    _ => unreachable!(),
9717                }
9718            } else {
9719                GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9720            };
9721            (object_type, object_spec_inner)
9722        } else {
9723            let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9724            let object_spec_inner = GrantTargetSpecificationInner::Objects {
9725                names: self
9726                    .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9727            };
9728            (object_type, object_spec_inner)
9729        };
9730
9731        Ok(GrantTargetSpecification::Object {
9732            object_type,
9733            object_spec_inner,
9734        })
9735    }
9736
9737    /// Bail out if the current token is not an object type suitable for a GRANT/REVOKE, or consume
9738    /// and return it if it is.
9739    fn expect_grant_revoke_object_type(
9740        &mut self,
9741        statement_type: &str,
9742    ) -> Result<ObjectType, ParserError> {
9743        // If the object type is omitted, then it is assumed to be a table.
9744        let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9745        self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9746    }
9747
9748    /// Bail out if the current token is not a plural object type suitable for a GRANT/REVOKE, or consume
9749    /// and return it if it is.
9750    fn expect_grant_revoke_plural_object_type(
9751        &mut self,
9752        statement_type: &str,
9753    ) -> Result<ObjectType, ParserError> {
9754        let object_type = self.expect_plural_object_type().map_err(|_| {
9755            // Limit the error message to allowed object types.
9756            self.expected::<_, ObjectType>(
9757                self.peek_pos(),
9758                "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9759                self.peek_token(),
9760            )
9761                .unwrap_err()
9762        })?;
9763        self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
9764        Ok(object_type)
9765    }
9766
9767    fn expect_grant_revoke_object_type_inner(
9768        &self,
9769        statement_type: &str,
9770        object_type: ObjectType,
9771    ) -> Result<ObjectType, ParserError> {
9772        match object_type {
9773            ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
9774                parser_err!(
9775                    self,
9776                    self.peek_prev_pos(),
9777                    format!(
9778                        "For object type {object_type}, you must specify 'TABLE' or omit the object type"
9779                    )
9780                )
9781            }
9782            ObjectType::Sink
9783            | ObjectType::Index
9784            | ObjectType::ClusterReplica
9785            | ObjectType::Role
9786            | ObjectType::Func
9787            | ObjectType::Subsource => {
9788                parser_err!(
9789                    self,
9790                    self.peek_prev_pos(),
9791                    format!("Unsupported {statement_type} on {object_type}")
9792                )
9793            }
9794            ObjectType::Table
9795            | ObjectType::Type
9796            | ObjectType::Cluster
9797            | ObjectType::Secret
9798            | ObjectType::Connection
9799            | ObjectType::Database
9800            | ObjectType::Schema
9801            | ObjectType::NetworkPolicy => Ok(object_type),
9802        }
9803    }
9804
9805    /// Bail out if the current token is not an object type, or consume and return it if it is.
9806    fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
9807        Ok(
9808            match self.expect_one_of_keywords(&[
9809                TABLE,
9810                VIEW,
9811                MATERIALIZED,
9812                SOURCE,
9813                SINK,
9814                INDEX,
9815                TYPE,
9816                ROLE,
9817                USER,
9818                CLUSTER,
9819                SECRET,
9820                CONNECTION,
9821                DATABASE,
9822                SCHEMA,
9823                FUNCTION,
9824                NETWORK,
9825            ])? {
9826                TABLE => ObjectType::Table,
9827                VIEW => ObjectType::View,
9828                MATERIALIZED => {
9829                    if let Err(e) = self.expect_keyword(VIEW) {
9830                        self.prev_token();
9831                        return Err(e);
9832                    }
9833                    ObjectType::MaterializedView
9834                }
9835                SOURCE => ObjectType::Source,
9836                SINK => ObjectType::Sink,
9837                INDEX => ObjectType::Index,
9838                TYPE => ObjectType::Type,
9839                ROLE | USER => ObjectType::Role,
9840                CLUSTER => {
9841                    if self.parse_keyword(REPLICA) {
9842                        ObjectType::ClusterReplica
9843                    } else {
9844                        ObjectType::Cluster
9845                    }
9846                }
9847                SECRET => ObjectType::Secret,
9848                CONNECTION => ObjectType::Connection,
9849                DATABASE => ObjectType::Database,
9850                SCHEMA => ObjectType::Schema,
9851                FUNCTION => ObjectType::Func,
9852                NETWORK => {
9853                    if let Err(e) = self.expect_keyword(POLICY) {
9854                        self.prev_token();
9855                        return Err(e);
9856                    }
9857                    ObjectType::NetworkPolicy
9858                }
9859                _ => unreachable!(),
9860            },
9861        )
9862    }
9863
9864    /// Look for an object type and return it if it matches.
9865    fn parse_object_type(&mut self) -> Option<ObjectType> {
9866        Some(
9867            match self.parse_one_of_keywords(&[
9868                TABLE,
9869                VIEW,
9870                MATERIALIZED,
9871                SOURCE,
9872                SINK,
9873                INDEX,
9874                TYPE,
9875                ROLE,
9876                USER,
9877                CLUSTER,
9878                SECRET,
9879                CONNECTION,
9880                DATABASE,
9881                SCHEMA,
9882                FUNCTION,
9883                NETWORK,
9884            ])? {
9885                TABLE => ObjectType::Table,
9886                VIEW => ObjectType::View,
9887                MATERIALIZED => {
9888                    if self.parse_keyword(VIEW) {
9889                        ObjectType::MaterializedView
9890                    } else {
9891                        self.prev_token();
9892                        return None;
9893                    }
9894                }
9895                SOURCE => ObjectType::Source,
9896                SINK => ObjectType::Sink,
9897                INDEX => ObjectType::Index,
9898                TYPE => ObjectType::Type,
9899                ROLE | USER => ObjectType::Role,
9900                CLUSTER => {
9901                    if self.parse_keyword(REPLICA) {
9902                        ObjectType::ClusterReplica
9903                    } else {
9904                        ObjectType::Cluster
9905                    }
9906                }
9907                SECRET => ObjectType::Secret,
9908                CONNECTION => ObjectType::Connection,
9909                DATABASE => ObjectType::Database,
9910                SCHEMA => ObjectType::Schema,
9911                FUNCTION => ObjectType::Func,
9912                NETWORK => {
9913                    if self.parse_keyword(POLICY) {
9914                        ObjectType::NetworkPolicy
9915                    } else {
9916                        self.prev_token();
9917                        return None;
9918                    }
9919                }
9920                _ => unreachable!(),
9921            },
9922        )
9923    }
9924
9925    /// Bail out if the current token is not an object type in the plural form, or consume and return it if it is.
9926    fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
9927        Ok(
9928            match self.expect_one_of_keywords(&[
9929                TABLES,
9930                VIEWS,
9931                MATERIALIZED,
9932                SOURCES,
9933                SINKS,
9934                INDEXES,
9935                TYPES,
9936                ROLES,
9937                USERS,
9938                CLUSTER,
9939                CLUSTERS,
9940                SECRETS,
9941                CONNECTIONS,
9942                DATABASES,
9943                SCHEMAS,
9944                POLICIES,
9945            ])? {
9946                TABLES => ObjectType::Table,
9947                VIEWS => ObjectType::View,
9948                MATERIALIZED => {
9949                    if let Err(e) = self.expect_keyword(VIEWS) {
9950                        self.prev_token();
9951                        return Err(e);
9952                    }
9953                    ObjectType::MaterializedView
9954                }
9955                SOURCES => ObjectType::Source,
9956                SINKS => ObjectType::Sink,
9957                INDEXES => ObjectType::Index,
9958                TYPES => ObjectType::Type,
9959                ROLES | USERS => ObjectType::Role,
9960                CLUSTER => {
9961                    if let Err(e) = self.expect_keyword(REPLICAS) {
9962                        self.prev_token();
9963                        return Err(e);
9964                    }
9965                    ObjectType::ClusterReplica
9966                }
9967                CLUSTERS => ObjectType::Cluster,
9968                SECRETS => ObjectType::Secret,
9969                CONNECTIONS => ObjectType::Connection,
9970                DATABASES => ObjectType::Database,
9971                SCHEMAS => ObjectType::Schema,
9972                POLICIES => ObjectType::NetworkPolicy,
9973                _ => unreachable!(),
9974            },
9975        )
9976    }
9977
9978    /// Look for an object type in the plural form and return it if it matches.
9979    fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
9980        Some(
9981            match self.parse_one_of_keywords(&[
9982                TABLES,
9983                VIEWS,
9984                MATERIALIZED,
9985                SOURCES,
9986                SINKS,
9987                INDEXES,
9988                TYPES,
9989                ROLES,
9990                USERS,
9991                CLUSTER,
9992                CLUSTERS,
9993                SECRETS,
9994                CONNECTIONS,
9995                DATABASES,
9996                SCHEMAS,
9997                SUBSOURCES,
9998                NETWORK,
9999            ])? {
10000                TABLES => ObjectType::Table,
10001                VIEWS => ObjectType::View,
10002                MATERIALIZED => {
10003                    if self.parse_keyword(VIEWS) {
10004                        ObjectType::MaterializedView
10005                    } else {
10006                        self.prev_token();
10007                        return None;
10008                    }
10009                }
10010                SOURCES => ObjectType::Source,
10011                SINKS => ObjectType::Sink,
10012                INDEXES => ObjectType::Index,
10013                TYPES => ObjectType::Type,
10014                ROLES | USERS => ObjectType::Role,
10015                CLUSTER => {
10016                    if self.parse_keyword(REPLICAS) {
10017                        ObjectType::ClusterReplica
10018                    } else {
10019                        self.prev_token();
10020                        return None;
10021                    }
10022                }
10023                CLUSTERS => ObjectType::Cluster,
10024                SECRETS => ObjectType::Secret,
10025                CONNECTIONS => ObjectType::Connection,
10026                DATABASES => ObjectType::Database,
10027                SCHEMAS => ObjectType::Schema,
10028                SUBSOURCES => ObjectType::Subsource,
10029                NETWORK => {
10030                    if self.parse_keyword(POLICIES) {
10031                        ObjectType::NetworkPolicy
10032                    } else {
10033                        self.prev_token();
10034                        return None;
10035                    }
10036                }
10037                _ => unreachable!(),
10038            },
10039        )
10040    }
10041
10042    /// Bail out if the current token is not a privilege object type, or consume and
10043    /// return it if it is.
10044    fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10045        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10046            return parser_err!(
10047                self,
10048                self.peek_prev_pos(),
10049                format!("For object type {object_type}, you must specify 'TABLES'")
10050            );
10051        }
10052        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10053            self.prev_token();
10054            return parser_err!(
10055                self,
10056                self.peek_prev_pos(),
10057                format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
10058            );
10059        }
10060
10061        Ok(
10062            match self.expect_one_of_keywords(&[
10063                TABLES,
10064                TYPES,
10065                CLUSTERS,
10066                SECRETS,
10067                CONNECTIONS,
10068                DATABASES,
10069                SCHEMAS,
10070            ])? {
10071                TABLES => ObjectType::Table,
10072                TYPES => ObjectType::Type,
10073                CLUSTERS => ObjectType::Cluster,
10074                SECRETS => ObjectType::Secret,
10075                CONNECTIONS => ObjectType::Connection,
10076                DATABASES => ObjectType::Database,
10077                SCHEMAS => ObjectType::Schema,
10078                _ => unreachable!(),
10079            },
10080        )
10081    }
10082
10083    /// Bail out if the current token is not a privilege object type in the plural form, or consume and
10084    /// return it if it is.
10085    fn expect_plural_system_object_type_for_privileges(
10086        &mut self,
10087    ) -> Result<SystemObjectType, ParserError> {
10088        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10089            return parser_err!(
10090                self,
10091                self.peek_prev_pos(),
10092                format!("For object type {object_type}, you must specify 'TABLES'")
10093            );
10094        }
10095        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10096            self.prev_token();
10097            return parser_err!(
10098                self,
10099                self.peek_prev_pos(),
10100                format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
10101            );
10102        }
10103
10104        Ok(
10105            match self.expect_one_of_keywords(&[
10106                SYSTEM,
10107                TABLES,
10108                TYPES,
10109                CLUSTERS,
10110                SECRETS,
10111                CONNECTIONS,
10112                DATABASES,
10113                SCHEMAS,
10114            ])? {
10115                SYSTEM => SystemObjectType::System,
10116                TABLES => SystemObjectType::Object(ObjectType::Table),
10117                TYPES => SystemObjectType::Object(ObjectType::Type),
10118                CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10119                SECRETS => SystemObjectType::Object(ObjectType::Secret),
10120                CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10121                DATABASES => SystemObjectType::Object(ObjectType::Database),
10122                SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10123                _ => unreachable!(),
10124            },
10125        )
10126    }
10127
10128    /// Look for a privilege and return it if it matches.
10129    fn parse_privilege(&mut self) -> Option<Privilege> {
10130        Some(
10131            match self.parse_one_of_keywords(&[
10132                INSERT,
10133                SELECT,
10134                UPDATE,
10135                DELETE,
10136                USAGE,
10137                CREATE,
10138                CREATEROLE,
10139                CREATEDB,
10140                CREATECLUSTER,
10141                CREATENETWORKPOLICY,
10142            ])? {
10143                INSERT => Privilege::INSERT,
10144                SELECT => Privilege::SELECT,
10145                UPDATE => Privilege::UPDATE,
10146                DELETE => Privilege::DELETE,
10147                USAGE => Privilege::USAGE,
10148                CREATE => Privilege::CREATE,
10149                CREATEROLE => Privilege::CREATEROLE,
10150                CREATEDB => Privilege::CREATEDB,
10151                CREATECLUSTER => Privilege::CREATECLUSTER,
10152                CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10153                _ => unreachable!(),
10154            },
10155        )
10156    }
10157
10158    /// Parse one or more privileges separated by a ','.
10159    fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10160        if self.parse_keyword(ALL) {
10161            let _ = self.parse_keyword(PRIVILEGES);
10162            return Some(PrivilegeSpecification::All);
10163        }
10164
10165        let mut privileges = Vec::new();
10166        while let Some(privilege) = self.parse_privilege() {
10167            privileges.push(privilege);
10168            if !self.consume_token(&Token::Comma) {
10169                break;
10170            }
10171        }
10172
10173        if privileges.is_empty() {
10174            None
10175        } else {
10176            Some(PrivilegeSpecification::Privileges(privileges))
10177        }
10178    }
10179
10180    /// Bail out if the current token is not a role specification, or consume and return it if it is.
10181    fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10182        let _ = self.parse_keyword(GROUP);
10183        self.parse_identifier()
10184    }
10185
10186    /// Parse a `REASSIGN OWNED` statement, assuming that the `REASSIGN` token
10187    /// has already been consumed.
10188    fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10189        self.expect_keywords(&[OWNED, BY])?;
10190        let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10191        self.expect_keyword(TO)?;
10192        let new_role = self.parse_identifier()?;
10193        Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10194            old_roles,
10195            new_role,
10196        }))
10197    }
10198
10199    fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10200        self.expect_keyword(ON)?;
10201
10202        let object = match self.expect_one_of_keywords(&[
10203            TABLE,
10204            VIEW,
10205            COLUMN,
10206            MATERIALIZED,
10207            SOURCE,
10208            SINK,
10209            INDEX,
10210            FUNCTION,
10211            CONNECTION,
10212            TYPE,
10213            SECRET,
10214            ROLE,
10215            DATABASE,
10216            SCHEMA,
10217            CLUSTER,
10218            NETWORK,
10219        ])? {
10220            TABLE => {
10221                let name = self.parse_raw_name()?;
10222                CommentObjectType::Table { name }
10223            }
10224            VIEW => {
10225                let name = self.parse_raw_name()?;
10226                CommentObjectType::View { name }
10227            }
10228            MATERIALIZED => {
10229                self.expect_keyword(VIEW)?;
10230                let name = self.parse_raw_name()?;
10231                CommentObjectType::MaterializedView { name }
10232            }
10233            SOURCE => {
10234                let name = self.parse_raw_name()?;
10235                CommentObjectType::Source { name }
10236            }
10237            SINK => {
10238                let name = self.parse_raw_name()?;
10239                CommentObjectType::Sink { name }
10240            }
10241            INDEX => {
10242                let name = self.parse_raw_name()?;
10243                CommentObjectType::Index { name }
10244            }
10245            FUNCTION => {
10246                let name = self.parse_raw_name()?;
10247                CommentObjectType::Func { name }
10248            }
10249            CONNECTION => {
10250                let name = self.parse_raw_name()?;
10251                CommentObjectType::Connection { name }
10252            }
10253            TYPE => {
10254                let ty = self.parse_data_type()?;
10255                CommentObjectType::Type { ty }
10256            }
10257            SECRET => {
10258                let name = self.parse_raw_name()?;
10259                CommentObjectType::Secret { name }
10260            }
10261            ROLE => {
10262                let name = self.parse_identifier()?;
10263                CommentObjectType::Role { name }
10264            }
10265            DATABASE => {
10266                let name = self.parse_database_name()?;
10267                CommentObjectType::Database { name }
10268            }
10269            SCHEMA => {
10270                let name = self.parse_schema_name()?;
10271                CommentObjectType::Schema { name }
10272            }
10273            CLUSTER => {
10274                if self.parse_keyword(REPLICA) {
10275                    let name = self.parse_cluster_replica_name()?;
10276                    CommentObjectType::ClusterReplica { name }
10277                } else {
10278                    let name = self.parse_raw_ident()?;
10279                    CommentObjectType::Cluster { name }
10280                }
10281            }
10282            COLUMN => {
10283                let name = self.parse_column_name()?;
10284                CommentObjectType::Column { name }
10285            }
10286            NETWORK => {
10287                self.expect_keyword(POLICY)?;
10288                let name = self.parse_raw_network_policy_name()?;
10289                CommentObjectType::NetworkPolicy { name }
10290            }
10291            _ => unreachable!(),
10292        };
10293
10294        self.expect_keyword(IS)?;
10295        let comment = match self.next_token() {
10296            Some(Token::Keyword(NULL)) => None,
10297            Some(Token::String(s)) => Some(s),
10298            other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10299        };
10300
10301        Ok(Statement::Comment(CommentStatement { object, comment }))
10302    }
10303
10304    pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10305    where
10306        S: TryInto<IdentString>,
10307        <S as TryInto<IdentString>>::Error: fmt::Display,
10308    {
10309        Ident::new(s).map_err(|e| ParserError {
10310            pos: self.peek_prev_pos(),
10311            message: e.to_string(),
10312        })
10313    }
10314}
10315
10316impl CheckedRecursion for Parser<'_> {
10317    fn recursion_guard(&self) -> &RecursionGuard {
10318        &self.recursion_guard
10319    }
10320}
10321
10322/// Represents an expression or query (a "fragment") with parentheses around it,
10323/// when it is unknown whether the fragment belongs to a larger expression or
10324/// query.
10325enum ParenthesizedFragment {
10326    Query(Query<Raw>),
10327    Exprs(Vec<Expr<Raw>>),
10328}
10329
10330impl ParenthesizedFragment {
10331    /// Force the fragment into an expression.
10332    fn into_expr(self) -> Expr<Raw> {
10333        match self {
10334            ParenthesizedFragment::Exprs(exprs) => {
10335                // The `ParenthesizedFragment` represents that there were
10336                // parentheses surrounding `exprs`, so...
10337                if exprs.len() == 1 {
10338                    // ...if there was only one expression, the parentheses
10339                    // were simple nesting...
10340                    Expr::Nested(Box::new(exprs.into_element()))
10341                } else {
10342                    // ...and if there were multiple expressions, the
10343                    // parentheses formed an implicit row constructor.
10344                    Expr::Row { exprs }
10345                }
10346            }
10347            // Queries become subquery expressions.
10348            ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10349        }
10350    }
10351}
10352
10353// Include the `Parser::parse_~` implementations for simple options derived by
10354// the crate's build.rs script.
10355include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));