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        // The singular `SCHEMA NAME` is used by sources; the `KEY`/`VALUE`-prefixed
2289        // options mirror the CSR clause and are used by sinks. Which options are
2290        // valid in which context is enforced in the planner and purifier, not
2291        // here. Values are parsed as optional so a missing value surfaces a clear
2292        // planner error rather than a parse error.
2293        let name = match self.expect_one_of_keywords(&[SCHEMA, KEY, VALUE])? {
2294            SCHEMA => {
2295                self.expect_keyword(NAME)?;
2296                GlueAvroOptionName::SchemaName
2297            }
2298            KEY => match self.expect_one_of_keywords(&[SCHEMA, COMPATIBILITY])? {
2299                SCHEMA => {
2300                    self.expect_keyword(NAME)?;
2301                    GlueAvroOptionName::KeySchemaName
2302                }
2303                COMPATIBILITY => {
2304                    self.expect_keyword(LEVEL)?;
2305                    GlueAvroOptionName::KeyCompatibilityLevel
2306                }
2307                _ => unreachable!(),
2308            },
2309            VALUE => match self.expect_one_of_keywords(&[SCHEMA, COMPATIBILITY])? {
2310                SCHEMA => {
2311                    self.expect_keyword(NAME)?;
2312                    GlueAvroOptionName::ValueSchemaName
2313                }
2314                COMPATIBILITY => {
2315                    self.expect_keyword(LEVEL)?;
2316                    GlueAvroOptionName::ValueCompatibilityLevel
2317                }
2318                _ => unreachable!(),
2319            },
2320            _ => unreachable!(),
2321        };
2322        Ok(GlueAvroOption {
2323            name,
2324            value: self.parse_optional_option_value()?,
2325        })
2326    }
2327
2328    fn parse_protobuf_schema(&mut self) -> Result<ProtobufSchema<Raw>, ParserError> {
2329        if self.parse_keywords(&[USING, CONFLUENT, SCHEMA, REGISTRY]) {
2330            let csr_connection = self.parse_csr_connection_proto()?;
2331            Ok(ProtobufSchema::Csr { csr_connection })
2332        } else if self.parse_keyword(MESSAGE) {
2333            let message_name = self.parse_literal_string()?;
2334            self.expect_keyword(USING)?;
2335            self.expect_keyword(SCHEMA)?;
2336            let schema = Schema {
2337                schema: self.parse_literal_string()?,
2338            };
2339            Ok(ProtobufSchema::InlineSchema {
2340                message_name,
2341                schema,
2342            })
2343        } else {
2344            self.expected(
2345                self.peek_pos(),
2346                "CONFLUENT SCHEMA REGISTRY or MESSAGE",
2347                self.peek_token(),
2348            )
2349        }
2350    }
2351
2352    fn parse_csr_connection_reference(&mut self) -> Result<CsrConnection<Raw>, ParserError> {
2353        self.expect_keyword(CONNECTION)?;
2354        let connection = self.parse_raw_name()?;
2355
2356        let options = if self.consume_token(&Token::LParen) {
2357            let options = self.parse_comma_separated(Parser::parse_csr_config_option)?;
2358            self.expect_token(&Token::RParen)?;
2359            options
2360        } else {
2361            vec![]
2362        };
2363
2364        Ok(CsrConnection {
2365            connection,
2366            options,
2367        })
2368    }
2369
2370    fn parse_csr_config_option(&mut self) -> Result<CsrConfigOption<Raw>, ParserError> {
2371        let name = match self.expect_one_of_keywords(&[AVRO, NULL, KEY, VALUE, DOC])? {
2372            AVRO => {
2373                let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
2374                    KEY => CsrConfigOptionName::AvroKeyFullname,
2375                    VALUE => CsrConfigOptionName::AvroValueFullname,
2376                    _ => unreachable!(),
2377                };
2378                self.expect_keyword(FULLNAME)?;
2379                name
2380            }
2381            NULL => {
2382                self.expect_keyword(DEFAULTS)?;
2383                CsrConfigOptionName::NullDefaults
2384            }
2385            KEY => match self.expect_one_of_keywords(&[DOC, COMPATIBILITY])? {
2386                DOC => {
2387                    self.expect_keyword(ON)?;
2388                    let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2389                    CsrConfigOptionName::AvroDocOn(AvroDocOn {
2390                        identifier: doc_on_identifier,
2391                        for_schema: DocOnSchema::KeyOnly,
2392                    })
2393                }
2394                COMPATIBILITY => {
2395                    self.expect_keyword(LEVEL)?;
2396                    CsrConfigOptionName::KeyCompatibilityLevel
2397                }
2398                _ => unreachable!(),
2399            },
2400            VALUE => match self.expect_one_of_keywords(&[DOC, COMPATIBILITY])? {
2401                DOC => {
2402                    self.expect_keyword(ON)?;
2403                    let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2404                    CsrConfigOptionName::AvroDocOn(AvroDocOn {
2405                        identifier: doc_on_identifier,
2406                        for_schema: DocOnSchema::ValueOnly,
2407                    })
2408                }
2409                COMPATIBILITY => {
2410                    self.expect_keyword(LEVEL)?;
2411                    CsrConfigOptionName::ValueCompatibilityLevel
2412                }
2413                _ => unreachable!(),
2414            },
2415            DOC => {
2416                self.expect_keyword(ON)?;
2417                let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2418                CsrConfigOptionName::AvroDocOn(AvroDocOn {
2419                    identifier: doc_on_identifier,
2420                    for_schema: DocOnSchema::All,
2421                })
2422            }
2423            _ => unreachable!(),
2424        };
2425        Ok(CsrConfigOption {
2426            name,
2427            value: self.parse_optional_option_value()?,
2428        })
2429    }
2430
2431    fn parse_avro_doc_on_option_name(&mut self) -> Result<DocOnIdentifier<Raw>, ParserError> {
2432        match self.expect_one_of_keywords(&[TYPE, COLUMN])? {
2433            TYPE => Ok(DocOnIdentifier::Type(self.parse_raw_name()?)),
2434            COLUMN => Ok(DocOnIdentifier::Column(self.parse_column_name()?)),
2435            _ => unreachable!(),
2436        }
2437    }
2438
2439    fn parse_csr_connection_avro(&mut self) -> Result<CsrConnectionAvro<Raw>, ParserError> {
2440        let connection = self.parse_csr_connection_reference()?;
2441        let seed = if self.parse_keyword(SEED) {
2442            let key_schema = if self.parse_keyword(KEY) {
2443                self.expect_keyword(SCHEMA)?;
2444                Some(self.parse_literal_string()?)
2445            } else {
2446                None
2447            };
2448
2449            // Parse KEY REFERENCES if present (only valid if we have a key schema)
2450            let key_reference_schemas =
2451                if key_schema.is_some() && self.parse_keywords(&[KEY, REFERENCES]) {
2452                    self.expect_token(&Token::LParen)?;
2453                    let refs = self.parse_comma_separated(|p| p.parse_literal_string())?;
2454                    self.expect_token(&Token::RParen)?;
2455                    refs
2456                } else {
2457                    vec![]
2458                };
2459
2460            self.expect_keywords(&[VALUE, SCHEMA])?;
2461            let value_schema = self.parse_literal_string()?;
2462
2463            // Parse VALUE REFERENCES if present
2464            let value_reference_schemas = if self.parse_keywords(&[VALUE, REFERENCES]) {
2465                self.expect_token(&Token::LParen)?;
2466                let refs = self.parse_comma_separated(|p| p.parse_literal_string())?;
2467                self.expect_token(&Token::RParen)?;
2468                refs
2469            } else {
2470                vec![]
2471            };
2472
2473            Some(CsrSeedAvro {
2474                key_schema,
2475                value_schema,
2476                key_reference_schemas,
2477                value_reference_schemas,
2478            })
2479        } else {
2480            None
2481        };
2482
2483        let mut parse_schema_strategy =
2484            |kws| -> Result<Option<ReaderSchemaSelectionStrategy>, ParserError> {
2485                if self.parse_keywords(kws) {
2486                    Ok(Some(
2487                        match self.expect_one_of_keywords(&[ID, LATEST, INLINE])? {
2488                            ID => {
2489                                let pos = self.index;
2490                                ReaderSchemaSelectionStrategy::ById(
2491                                    self.parse_literal_int()?.try_into().map_err(|_| {
2492                                        ParserError::new(pos, "Expected a 32-bit integer")
2493                                    })?,
2494                                )
2495                            }
2496                            LATEST => ReaderSchemaSelectionStrategy::Latest,
2497                            INLINE => {
2498                                ReaderSchemaSelectionStrategy::Inline(self.parse_literal_string()?)
2499                            }
2500                            _ => unreachable!(),
2501                        },
2502                    ))
2503                } else {
2504                    Ok(None)
2505                }
2506            };
2507
2508        let key_strategy = parse_schema_strategy(&[KEY, STRATEGY])?;
2509        let value_strategy = parse_schema_strategy(&[VALUE, STRATEGY])?;
2510
2511        Ok(CsrConnectionAvro {
2512            connection,
2513            seed,
2514            key_strategy,
2515            value_strategy,
2516        })
2517    }
2518
2519    fn parse_csr_connection_proto(&mut self) -> Result<CsrConnectionProtobuf<Raw>, ParserError> {
2520        let connection = self.parse_csr_connection_reference()?;
2521
2522        let seed = if self.parse_keyword(SEED) {
2523            let key = if self.parse_keyword(KEY) {
2524                self.expect_keyword(SCHEMA)?;
2525                let schema = self.parse_literal_string()?;
2526                self.expect_keyword(MESSAGE)?;
2527                let message_name = self.parse_literal_string()?;
2528                Some(CsrSeedProtobufSchema {
2529                    schema,
2530                    message_name,
2531                })
2532            } else {
2533                None
2534            };
2535            self.expect_keywords(&[VALUE, SCHEMA])?;
2536            let value_schema = self.parse_literal_string()?;
2537            self.expect_keyword(MESSAGE)?;
2538            let value_message_name = self.parse_literal_string()?;
2539            Some(CsrSeedProtobuf {
2540                value: CsrSeedProtobufSchema {
2541                    schema: value_schema,
2542                    message_name: value_message_name,
2543                },
2544                key,
2545            })
2546        } else {
2547            None
2548        };
2549
2550        Ok(CsrConnectionProtobuf { connection, seed })
2551    }
2552
2553    fn parse_source_error_policy_option(&mut self) -> Result<SourceErrorPolicy, ParserError> {
2554        match self.expect_one_of_keywords(&[INLINE])? {
2555            INLINE => Ok(SourceErrorPolicy::Inline {
2556                alias: self.parse_alias()?,
2557            }),
2558            _ => unreachable!(),
2559        }
2560    }
2561
2562    fn parse_source_envelope(&mut self) -> Result<SourceEnvelope, ParserError> {
2563        let envelope = if self.parse_keyword(NONE) {
2564            SourceEnvelope::None
2565        } else if self.parse_keyword(DEBEZIUM) {
2566            SourceEnvelope::Debezium
2567        } else if self.parse_keyword(UPSERT) {
2568            let value_decode_err_policy = if self.consume_token(&Token::LParen) {
2569                // We only support the `VALUE DECODING ERRORS` option for now, but if we add another
2570                // we should extract this into a helper function.
2571                self.expect_keywords(&[VALUE, DECODING, ERRORS])?;
2572                let _ = self.consume_token(&Token::Eq);
2573                let open_inner = self.consume_token(&Token::LParen);
2574                let value_decode_err_policy =
2575                    self.parse_comma_separated(Parser::parse_source_error_policy_option)?;
2576                if open_inner {
2577                    self.expect_token(&Token::RParen)?;
2578                }
2579                self.expect_token(&Token::RParen)?;
2580                value_decode_err_policy
2581            } else {
2582                vec![]
2583            };
2584
2585            SourceEnvelope::Upsert {
2586                value_decode_err_policy,
2587            }
2588        } else if self.parse_keyword(MATERIALIZE) {
2589            SourceEnvelope::CdcV2
2590        } else {
2591            return self.expected(
2592                self.peek_pos(),
2593                "NONE, UPSERT, or MATERIALIZE",
2594                self.peek_token(),
2595            );
2596        };
2597        Ok(envelope)
2598    }
2599
2600    fn parse_sink_envelope(&mut self) -> Result<SinkEnvelope, ParserError> {
2601        if self.parse_keyword(UPSERT) {
2602            Ok(SinkEnvelope::Upsert)
2603        } else if self.parse_keyword(DEBEZIUM) {
2604            Ok(SinkEnvelope::Debezium)
2605        } else {
2606            self.expected(self.peek_pos(), "UPSERT, DEBEZIUM", self.peek_token())
2607        }
2608    }
2609
2610    fn parse_iceberg_sink_mode(&mut self) -> Result<IcebergSinkMode, ParserError> {
2611        if self.parse_keyword(UPSERT) {
2612            Ok(IcebergSinkMode::Upsert)
2613        } else if self.parse_keyword(APPEND) {
2614            Ok(IcebergSinkMode::Append)
2615        } else {
2616            self.expected(self.peek_pos(), "UPSERT, APPEND", self.peek_token())
2617        }
2618    }
2619
2620    /// Parse a `VALIDATE` statement
2621    fn parse_validate(&mut self) -> Result<Statement<Raw>, ParserError> {
2622        self.expect_keyword(CONNECTION)?;
2623        let name = self.parse_raw_name()?;
2624        Ok(Statement::ValidateConnection(ValidateConnectionStatement {
2625            name,
2626        }))
2627    }
2628
2629    fn parse_create_connection(&mut self) -> Result<Statement<Raw>, ParserError> {
2630        self.expect_keyword(CONNECTION)?;
2631        let if_not_exists = self.parse_if_not_exists()?;
2632        let name = self.parse_item_name()?;
2633        let expect_paren = match self.expect_one_of_keywords(&[FOR, TO])? {
2634            FOR => false,
2635            TO => true,
2636            _ => unreachable!(),
2637        };
2638        let connection_type = match self.expect_one_of_keywords(&[
2639            AWS, GCP, KAFKA, CONFLUENT, POSTGRES, SSH, SQL, MYSQL, ICEBERG,
2640        ])? {
2641            AWS => {
2642                if self.parse_keyword(PRIVATELINK) {
2643                    CreateConnectionType::AwsPrivatelink
2644                } else if self.parse_keyword(GLUE) {
2645                    self.expect_keywords(&[SCHEMA, REGISTRY])?;
2646                    CreateConnectionType::GlueSchemaRegistry
2647                } else {
2648                    CreateConnectionType::Aws
2649                }
2650            }
2651            GCP => CreateConnectionType::Gcp,
2652            KAFKA => CreateConnectionType::Kafka,
2653            CONFLUENT => {
2654                self.expect_keywords(&[SCHEMA, REGISTRY])?;
2655                CreateConnectionType::Csr
2656            }
2657            POSTGRES => CreateConnectionType::Postgres,
2658            SSH => {
2659                self.expect_keyword(TUNNEL)?;
2660                CreateConnectionType::Ssh
2661            }
2662            SQL => {
2663                self.expect_keyword(SERVER)?;
2664                CreateConnectionType::SqlServer
2665            }
2666            MYSQL => CreateConnectionType::MySql,
2667            ICEBERG => {
2668                self.expect_keyword(CATALOG)?;
2669                CreateConnectionType::IcebergCatalog
2670            }
2671            _ => unreachable!(),
2672        };
2673        if expect_paren {
2674            self.expect_token(&Token::LParen)?;
2675        }
2676        let values = self.parse_comma_separated(Parser::parse_connection_option_unified)?;
2677        if expect_paren {
2678            self.expect_token(&Token::RParen)?;
2679        }
2680
2681        let with_options = if self.parse_keyword(WITH) {
2682            self.expect_token(&Token::LParen)?;
2683            let options = self.parse_comma_separated(Parser::parse_create_connection_option)?;
2684            self.expect_token(&Token::RParen)?;
2685            options
2686        } else {
2687            vec![]
2688        };
2689
2690        Ok(Statement::CreateConnection(CreateConnectionStatement {
2691            name,
2692            connection_type,
2693            values,
2694            if_not_exists,
2695            with_options,
2696        }))
2697    }
2698
2699    fn parse_create_connection_option_name(
2700        &mut self,
2701    ) -> Result<CreateConnectionOptionName, ParserError> {
2702        let name = match self.expect_one_of_keywords(&[VALIDATE])? {
2703            VALIDATE => CreateConnectionOptionName::Validate,
2704            _ => unreachable!(),
2705        };
2706        Ok(name)
2707    }
2708
2709    /// Parses a single valid option in the WITH block of a create source
2710    fn parse_create_connection_option(
2711        &mut self,
2712    ) -> Result<CreateConnectionOption<Raw>, ParserError> {
2713        let name = self.parse_create_connection_option_name()?;
2714        Ok(CreateConnectionOption {
2715            name,
2716            value: self.parse_optional_option_value()?,
2717        })
2718    }
2719
2720    fn parse_default_aws_privatelink(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2721        let _ = self.consume_token(&Token::Eq);
2722        Ok(WithOptionValue::ConnectionAwsPrivatelink(
2723            self.parse_default_aws_privatelink_()?,
2724        ))
2725    }
2726
2727    fn parse_default_aws_privatelink_(
2728        &mut self,
2729    ) -> Result<ConnectionDefaultAwsPrivatelink<Raw>, ParserError> {
2730        let connection = self.parse_raw_name()?;
2731        let port = if self.consume_token(&Token::LParen) {
2732            self.expect_keyword(PORT)?;
2733            let pos = self.peek_pos();
2734            let Ok(port) = u16::try_from(self.parse_literal_int()?) else {
2735                return parser_err!(self, pos, "Could not parse value into port");
2736            };
2737            self.expect_token(&Token::RParen)?;
2738            Some(port)
2739        } else {
2740            None
2741        };
2742        Ok(ConnectionDefaultAwsPrivatelink { connection, port })
2743    }
2744
2745    /// This is just like 'parse_default_aws_privatelink_' except it supports more PrivateLink options.
2746    fn parse_aws_privatelink(&mut self) -> Result<KafkaBrokerAwsPrivatelink<Raw>, ParserError> {
2747        let connection = self.parse_raw_name()?;
2748        let options = if self.consume_token(&Token::LParen) {
2749            let options =
2750                self.parse_comma_separated(Parser::parse_kafka_broker_aws_privatelink_option)?;
2751            self.expect_token(&Token::RParen)?;
2752            options
2753        } else {
2754            vec![]
2755        };
2756        Ok(KafkaBrokerAwsPrivatelink {
2757            connection,
2758            options,
2759        })
2760    }
2761
2762    fn parse_connection_rule_pattern(&mut self) -> Result<ConnectionRulePattern, ParserError> {
2763        let s = self.parse_literal_string()?;
2764        let pos = self.peek_prev_pos();
2765        let mut prefix_wildcard = false;
2766        let mut suffix_wildcard = false;
2767        let mut remainder = &s[..];
2768
2769        if let Some(stripped) = remainder.strip_prefix('*') {
2770            prefix_wildcard = true;
2771            remainder = stripped;
2772        }
2773        if let Some(stripped) = remainder.strip_suffix('*') {
2774            suffix_wildcard = true;
2775            remainder = stripped;
2776        }
2777
2778        if remainder.contains('*') {
2779            return parser_err!(
2780                self,
2781                pos,
2782                "pattern may only contain `*` as a leading and/or trailing wildcard"
2783            );
2784        }
2785
2786        Ok(ConnectionRulePattern {
2787            prefix_wildcard,
2788            literal_match: remainder.to_owned(),
2789            suffix_wildcard,
2790        })
2791    }
2792
2793    fn parse_kafka_broker_or_matching_rule(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2794        if self.parse_keyword(MATCHING) {
2795            let pattern = self.parse_connection_rule_pattern()?;
2796            self.expect_keyword(USING)?;
2797            self.expect_keywords(&[AWS, PRIVATELINK])?;
2798            let tunnel = self.parse_aws_privatelink()?;
2799            Ok(WithOptionValue::KafkaMatchingBrokerRule(
2800                KafkaMatchingBrokerRule { pattern, tunnel },
2801            ))
2802        } else {
2803            self.parse_kafka_broker()
2804        }
2805    }
2806
2807    fn parse_kafka_broker(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2808        let _ = self.consume_token(&Token::Eq);
2809        let address = self.parse_literal_string()?;
2810        let tunnel = if self.parse_keyword(USING) {
2811            match self.expect_one_of_keywords(&[AWS, SSH])? {
2812                AWS => {
2813                    self.expect_keywords(&[PRIVATELINK])?;
2814                    KafkaBrokerTunnel::AwsPrivatelink(self.parse_aws_privatelink()?)
2815                }
2816                SSH => {
2817                    self.expect_keywords(&[TUNNEL])?;
2818                    KafkaBrokerTunnel::SshTunnel(self.parse_raw_name()?)
2819                }
2820                _ => unreachable!(),
2821            }
2822        } else {
2823            KafkaBrokerTunnel::Direct
2824        };
2825
2826        Ok(WithOptionValue::ConnectionKafkaBroker(KafkaBroker {
2827            address,
2828            tunnel,
2829        }))
2830    }
2831
2832    fn parse_kafka_broker_aws_privatelink_option(
2833        &mut self,
2834    ) -> Result<KafkaBrokerAwsPrivatelinkOption<Raw>, ParserError> {
2835        let name = match self.expect_one_of_keywords(&[AVAILABILITY, PORT])? {
2836            AVAILABILITY => {
2837                self.expect_keywords(&[ZONE])?;
2838                KafkaBrokerAwsPrivatelinkOptionName::AvailabilityZone
2839            }
2840            PORT => KafkaBrokerAwsPrivatelinkOptionName::Port,
2841            _ => unreachable!(),
2842        };
2843        let value = self.parse_optional_option_value()?;
2844        Ok(KafkaBrokerAwsPrivatelinkOption { name, value })
2845    }
2846
2847    fn parse_kafka_source_config_option(
2848        &mut self,
2849    ) -> Result<KafkaSourceConfigOption<Raw>, ParserError> {
2850        let name = match self.expect_one_of_keywords(&[GROUP, START, TOPIC])? {
2851            GROUP => {
2852                self.expect_keywords(&[ID, PREFIX])?;
2853                KafkaSourceConfigOptionName::GroupIdPrefix
2854            }
2855            START => match self.expect_one_of_keywords(&[OFFSET, TIMESTAMP])? {
2856                OFFSET => KafkaSourceConfigOptionName::StartOffset,
2857                TIMESTAMP => KafkaSourceConfigOptionName::StartTimestamp,
2858                _ => unreachable!(),
2859            },
2860            TOPIC => {
2861                if self.parse_keyword(METADATA) {
2862                    self.expect_keywords(&[REFRESH, INTERVAL])?;
2863                    KafkaSourceConfigOptionName::TopicMetadataRefreshInterval
2864                } else {
2865                    KafkaSourceConfigOptionName::Topic
2866                }
2867            }
2868            _ => unreachable!(),
2869        };
2870        Ok(KafkaSourceConfigOption {
2871            name,
2872            value: self.parse_optional_option_value()?,
2873        })
2874    }
2875
2876    fn parse_iceberg_sink_config_option(
2877        &mut self,
2878    ) -> Result<IcebergSinkConfigOption<Raw>, ParserError> {
2879        let name = match self.expect_one_of_keywords(&[NAMESPACE, TABLE])? {
2880            NAMESPACE => IcebergSinkConfigOptionName::Namespace,
2881            TABLE => IcebergSinkConfigOptionName::Table,
2882            _ => unreachable!(),
2883        };
2884        Ok(IcebergSinkConfigOption {
2885            name,
2886            value: self.parse_optional_option_value()?,
2887        })
2888    }
2889
2890    fn parse_kafka_sink_config_option(
2891        &mut self,
2892    ) -> Result<KafkaSinkConfigOption<Raw>, ParserError> {
2893        let name = match self.expect_one_of_keywords(&[
2894            COMPRESSION,
2895            PARTITION,
2896            PROGRESS,
2897            TOPIC,
2898            LEGACY,
2899            TRANSACTIONAL,
2900        ])? {
2901            COMPRESSION => {
2902                self.expect_keyword(TYPE)?;
2903                KafkaSinkConfigOptionName::CompressionType
2904            }
2905            PARTITION => {
2906                self.expect_keyword(BY)?;
2907                let _ = self.consume_token(&Token::Eq);
2908                return Ok(KafkaSinkConfigOption {
2909                    name: KafkaSinkConfigOptionName::PartitionBy,
2910                    value: Some(WithOptionValue::Expr(self.parse_expr()?)),
2911                });
2912            }
2913            PROGRESS => {
2914                self.expect_keywords(&[GROUP, ID, PREFIX])?;
2915                KafkaSinkConfigOptionName::ProgressGroupIdPrefix
2916            }
2917            TOPIC => {
2918                match self.parse_one_of_keywords(&[METADATA, PARTITION, REPLICATION, CONFIG]) {
2919                    None => KafkaSinkConfigOptionName::Topic,
2920                    Some(METADATA) => {
2921                        self.expect_keywords(&[REFRESH, INTERVAL])?;
2922                        KafkaSinkConfigOptionName::TopicMetadataRefreshInterval
2923                    }
2924                    Some(PARTITION) => {
2925                        self.expect_keyword(COUNT)?;
2926                        KafkaSinkConfigOptionName::TopicPartitionCount
2927                    }
2928                    Some(REPLICATION) => {
2929                        self.expect_keyword(FACTOR)?;
2930                        KafkaSinkConfigOptionName::TopicReplicationFactor
2931                    }
2932                    Some(CONFIG) => KafkaSinkConfigOptionName::TopicConfig,
2933                    Some(other) => {
2934                        return parser_err!(
2935                            self,
2936                            self.peek_prev_pos(),
2937                            "unexpected keyword {}",
2938                            other
2939                        );
2940                    }
2941                }
2942            }
2943            TRANSACTIONAL => {
2944                self.expect_keywords(&[ID, PREFIX])?;
2945                KafkaSinkConfigOptionName::TransactionalIdPrefix
2946            }
2947            LEGACY => {
2948                self.expect_keywords(&[IDS])?;
2949                KafkaSinkConfigOptionName::LegacyIds
2950            }
2951            _ => unreachable!(),
2952        };
2953        Ok(KafkaSinkConfigOption {
2954            name,
2955            value: self.parse_optional_option_value()?,
2956        })
2957    }
2958
2959    fn parse_connection_option_name(&mut self) -> Result<ConnectionOptionName, ParserError> {
2960        Ok(
2961            match self.expect_one_of_keywords(&[
2962                ACCESS,
2963                ASSUME,
2964                AVAILABILITY,
2965                AWS,
2966                BROKER,
2967                BROKERS,
2968                CATALOG,
2969                CREDENTIAL,
2970                DATABASE,
2971                ENDPOINT,
2972                GCP,
2973                HOST,
2974                PASSWORD,
2975                PORT,
2976                PUBLIC,
2977                PROGRESS,
2978                REGION,
2979                REGISTRY,
2980                SASL,
2981                SCOPE,
2982                SECRET,
2983                SECURITY,
2984                SERVICE,
2985                SESSION,
2986                SSH,
2987                SSL,
2988                URL,
2989                USER,
2990                USERNAME,
2991                WAREHOUSE,
2992            ])? {
2993                ACCESS => {
2994                    self.expect_keywords(&[KEY, ID])?;
2995                    ConnectionOptionName::AccessKeyId
2996                }
2997                ASSUME => {
2998                    self.expect_keyword(ROLE)?;
2999                    match self.expect_one_of_keywords(&[ARN, SESSION])? {
3000                        ARN => ConnectionOptionName::AssumeRoleArn,
3001                        SESSION => {
3002                            self.expect_keyword(NAME)?;
3003                            ConnectionOptionName::AssumeRoleSessionName
3004                        }
3005                        _ => unreachable!(),
3006                    }
3007                }
3008                AVAILABILITY => {
3009                    self.expect_keyword(ZONES)?;
3010                    ConnectionOptionName::AvailabilityZones
3011                }
3012                AWS => match self.expect_one_of_keywords(&[CONNECTION, PRIVATELINK])? {
3013                    CONNECTION => ConnectionOptionName::AwsConnection,
3014                    PRIVATELINK => ConnectionOptionName::AwsPrivatelink,
3015                    _ => unreachable!(),
3016                },
3017                BROKER => ConnectionOptionName::Broker,
3018                BROKERS => ConnectionOptionName::Brokers,
3019                CATALOG => {
3020                    self.expect_keyword(TYPE)?;
3021                    ConnectionOptionName::CatalogType
3022                }
3023                CREDENTIAL => ConnectionOptionName::Credential,
3024                DATABASE => ConnectionOptionName::Database,
3025                ENDPOINT => ConnectionOptionName::Endpoint,
3026                GCP => {
3027                    self.expect_keyword(CONNECTION)?;
3028                    ConnectionOptionName::GcpConnection
3029                }
3030                HOST => ConnectionOptionName::Host,
3031                PASSWORD => ConnectionOptionName::Password,
3032                PORT => ConnectionOptionName::Port,
3033                PUBLIC => {
3034                    self.expect_keyword(KEY)?;
3035                    match self.next_token() {
3036                        Some(Token::Number(n)) if n == "1" => ConnectionOptionName::PublicKey1,
3037                        Some(Token::Number(n)) if n == "2" => ConnectionOptionName::PublicKey2,
3038                        t => self.expected(self.peek_prev_pos(), "1 or 2 after PUBLIC KEY", t)?,
3039                    }
3040                }
3041                PROGRESS => {
3042                    self.expect_keyword(TOPIC)?;
3043                    match self.parse_keywords(&[REPLICATION, FACTOR]) {
3044                        true => ConnectionOptionName::ProgressTopicReplicationFactor,
3045                        false => ConnectionOptionName::ProgressTopic,
3046                    }
3047                }
3048                SECURITY => {
3049                    self.expect_keyword(PROTOCOL)?;
3050                    ConnectionOptionName::SecurityProtocol
3051                }
3052                REGION => ConnectionOptionName::Region,
3053                REGISTRY => ConnectionOptionName::Registry,
3054                SASL => match self.expect_one_of_keywords(&[MECHANISMS, PASSWORD, USERNAME])? {
3055                    MECHANISMS => ConnectionOptionName::SaslMechanisms,
3056                    PASSWORD => ConnectionOptionName::SaslPassword,
3057                    USERNAME => ConnectionOptionName::SaslUsername,
3058                    _ => unreachable!(),
3059                },
3060                SCOPE => ConnectionOptionName::Scope,
3061                SECRET => {
3062                    self.expect_keywords(&[ACCESS, KEY])?;
3063                    ConnectionOptionName::SecretAccessKey
3064                }
3065                SERVICE => match self.expect_one_of_keywords(&[ACCOUNT, NAME])? {
3066                    ACCOUNT => {
3067                        self.expect_keyword(KEY)?;
3068                        ConnectionOptionName::ServiceAccountKey
3069                    }
3070                    NAME => ConnectionOptionName::ServiceName,
3071                    _ => unreachable!(),
3072                },
3073                SESSION => {
3074                    self.expect_keyword(TOKEN)?;
3075                    ConnectionOptionName::SessionToken
3076                }
3077                SSH => {
3078                    self.expect_keyword(TUNNEL)?;
3079                    ConnectionOptionName::SshTunnel
3080                }
3081                SSL => match self.expect_one_of_keywords(&[CERTIFICATE, MODE, KEY])? {
3082                    CERTIFICATE => {
3083                        if self.parse_keyword(AUTHORITY) {
3084                            ConnectionOptionName::SslCertificateAuthority
3085                        } else {
3086                            ConnectionOptionName::SslCertificate
3087                        }
3088                    }
3089                    KEY => ConnectionOptionName::SslKey,
3090                    MODE => ConnectionOptionName::SslMode,
3091                    _ => unreachable!(),
3092                },
3093                URL => ConnectionOptionName::Url,
3094                // TYPE => ConnectionOptionName::CatalogType,
3095                WAREHOUSE => ConnectionOptionName::Warehouse,
3096                USER | USERNAME => ConnectionOptionName::User,
3097                _ => unreachable!(),
3098            },
3099        )
3100    }
3101
3102    fn parse_connection_option_unified(&mut self) -> Result<ConnectionOption<Raw>, ParserError> {
3103        let name = self.parse_connection_option_name()?;
3104        let value = match name {
3105            ConnectionOptionName::AwsConnection => Some(self.parse_object_option_value()?),
3106            ConnectionOptionName::AwsPrivatelink => Some(self.parse_default_aws_privatelink()?),
3107            ConnectionOptionName::Broker => Some(self.parse_kafka_broker()?),
3108            ConnectionOptionName::Brokers => Some(WithOptionValue::Sequence(
3109                self.parse_list_value(Parser::parse_kafka_broker_or_matching_rule)?,
3110            )),
3111            ConnectionOptionName::GcpConnection => Some(self.parse_object_option_value()?),
3112            ConnectionOptionName::SshTunnel => Some(self.parse_object_option_value()?),
3113            _ if name.value_contains_sensitive_data() => {
3114                self.parse_optional_connection_credential_option_value()?
3115            }
3116            _ => self.parse_optional_option_value()?,
3117        };
3118        Ok(ConnectionOption { name, value })
3119    }
3120
3121    fn parse_create_subsource(&mut self) -> Result<Statement<Raw>, ParserError> {
3122        self.expect_keyword(SUBSOURCE)?;
3123        let if_not_exists = self.parse_if_not_exists()?;
3124        let name = self.parse_item_name()?;
3125
3126        let (columns, constraints) = self.parse_columns(Mandatory)?;
3127
3128        let of_source = if self.parse_keyword(OF) {
3129            self.expect_keyword(SOURCE)?;
3130            Some(self.parse_raw_name()?)
3131        } else {
3132            None
3133        };
3134
3135        let with_options = if self.parse_keyword(WITH) {
3136            self.expect_token(&Token::LParen)?;
3137            let options = self.parse_comma_separated(Parser::parse_create_subsource_option)?;
3138            self.expect_token(&Token::RParen)?;
3139            options
3140        } else {
3141            vec![]
3142        };
3143
3144        Ok(Statement::CreateSubsource(CreateSubsourceStatement {
3145            name,
3146            if_not_exists,
3147            columns,
3148            of_source,
3149            constraints,
3150            with_options,
3151        }))
3152    }
3153
3154    fn parse_create_subsource_option(&mut self) -> Result<CreateSubsourceOption<Raw>, ParserError> {
3155        let option = match self
3156            .expect_one_of_keywords(&[EXTERNAL, PROGRESS, TEXT, EXCLUDE, IGNORE, DETAILS, RETAIN])?
3157        {
3158            EXTERNAL => {
3159                self.expect_keyword(REFERENCE)?;
3160                CreateSubsourceOption {
3161                    name: CreateSubsourceOptionName::ExternalReference,
3162                    value: self.parse_optional_option_value()?,
3163                }
3164            }
3165            PROGRESS => CreateSubsourceOption {
3166                name: CreateSubsourceOptionName::Progress,
3167                value: self.parse_optional_option_value()?,
3168            },
3169            ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
3170                self.expect_keyword(COLUMNS)?;
3171
3172                let _ = self.consume_token(&Token::Eq);
3173
3174                let value = self
3175                    .parse_option_sequence(Parser::parse_identifier)?
3176                    .map(|inner| {
3177                        WithOptionValue::Sequence(
3178                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
3179                        )
3180                    });
3181
3182                CreateSubsourceOption {
3183                    name: match *keyword {
3184                        TEXT => CreateSubsourceOptionName::TextColumns,
3185                        // IGNORE is historical syntax for this option.
3186                        EXCLUDE | IGNORE => CreateSubsourceOptionName::ExcludeColumns,
3187                        _ => unreachable!(),
3188                    },
3189                    value,
3190                }
3191            }
3192            DETAILS => CreateSubsourceOption {
3193                name: CreateSubsourceOptionName::Details,
3194                value: self.parse_optional_option_value()?,
3195            },
3196            RETAIN => {
3197                self.expect_keyword(HISTORY)?;
3198                CreateSubsourceOption {
3199                    name: CreateSubsourceOptionName::RetainHistory,
3200                    value: self.parse_option_retain_history()?,
3201                }
3202            }
3203            _ => unreachable!(),
3204        };
3205        Ok(option)
3206    }
3207
3208    fn parse_create_source(&mut self) -> Result<Statement<Raw>, ParserError> {
3209        self.expect_keyword(SOURCE)?;
3210        let if_not_exists = self.parse_if_not_exists()?;
3211        let name = self.parse_item_name()?;
3212
3213        let (col_names, key_constraint) = self.parse_source_columns()?;
3214
3215        let in_cluster = self.parse_optional_in_cluster()?;
3216        self.expect_keyword(FROM)?;
3217
3218        // Webhook Source, which works differently than all other sources.
3219        if self.parse_keyword(WEBHOOK) {
3220            return self.parse_create_webhook_source(name, if_not_exists, in_cluster, false);
3221        }
3222
3223        let connection = self.parse_create_source_connection()?;
3224        let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
3225            Some(KEY) => {
3226                self.expect_keyword(FORMAT)?;
3227                let key = self.parse_format()?;
3228                self.expect_keywords(&[VALUE, FORMAT])?;
3229                let value = self.parse_format()?;
3230                Some(FormatSpecifier::KeyValue { key, value })
3231            }
3232            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3233            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3234            None => None,
3235        };
3236        let include_metadata = self.parse_source_include_metadata()?;
3237
3238        let envelope = if self.parse_keyword(ENVELOPE) {
3239            Some(self.parse_source_envelope()?)
3240        } else {
3241            None
3242        };
3243
3244        let referenced_subsources = if self.parse_keywords(&[FOR, TABLES]) {
3245            self.expect_token(&Token::LParen)?;
3246            let subsources = self.parse_comma_separated(Parser::parse_subsource_references)?;
3247            self.expect_token(&Token::RParen)?;
3248            Some(ExternalReferences::SubsetTables(subsources))
3249        } else if self.parse_keywords(&[FOR, SCHEMAS]) {
3250            self.expect_token(&Token::LParen)?;
3251            let schemas = self.parse_comma_separated(Parser::parse_identifier)?;
3252            self.expect_token(&Token::RParen)?;
3253            Some(ExternalReferences::SubsetSchemas(schemas))
3254        } else if self.parse_keywords(&[FOR, ALL, TABLES]) {
3255            Some(ExternalReferences::All)
3256        } else {
3257            None
3258        };
3259
3260        let progress_subsource = if self.parse_keywords(&[EXPOSE, PROGRESS, AS]) {
3261            Some(self.parse_deferred_item_name()?)
3262        } else {
3263            None
3264        };
3265
3266        // New WITH block
3267        let with_options = if self.parse_keyword(WITH) {
3268            self.expect_token(&Token::LParen)?;
3269            let options = self.parse_comma_separated(Parser::parse_source_option)?;
3270            self.expect_token(&Token::RParen)?;
3271            options
3272        } else {
3273            vec![]
3274        };
3275
3276        Ok(Statement::CreateSource(CreateSourceStatement {
3277            name,
3278            in_cluster,
3279            col_names,
3280            connection,
3281            format,
3282            include_metadata,
3283            envelope,
3284            if_not_exists,
3285            key_constraint,
3286            external_references: referenced_subsources,
3287            progress_subsource,
3288            with_options,
3289        }))
3290    }
3291
3292    fn parse_subsource_references(&mut self) -> Result<ExternalReferenceExport, ParserError> {
3293        let reference = self.parse_item_name()?;
3294        let subsource = if self.parse_one_of_keywords(&[AS, INTO]).is_some() {
3295            Some(self.parse_item_name()?)
3296        } else {
3297            None
3298        };
3299
3300        Ok(ExternalReferenceExport {
3301            reference,
3302            alias: subsource,
3303        })
3304    }
3305
3306    /// Parses the column section of a CREATE SOURCE statement which can be
3307    /// empty or a comma-separated list of column identifiers and a single key
3308    /// constraint, e.g.
3309    ///
3310    /// (col_0, col_i, ..., col_n, key_constraint)
3311    fn parse_source_columns(&mut self) -> Result<(Vec<Ident>, Option<KeyConstraint>), ParserError> {
3312        if self.consume_token(&Token::LParen) {
3313            let mut columns = vec![];
3314            let mut key_constraints = vec![];
3315            loop {
3316                let pos = self.peek_pos();
3317                if let Some(key_constraint) = self.parse_key_constraint()? {
3318                    if !key_constraints.is_empty() {
3319                        return parser_err!(self, pos, "Multiple key constraints not allowed");
3320                    }
3321                    key_constraints.push(key_constraint);
3322                } else {
3323                    columns.push(self.parse_identifier()?);
3324                }
3325                if !self.consume_token(&Token::Comma) {
3326                    break;
3327                }
3328            }
3329            self.expect_token(&Token::RParen)?;
3330            Ok((columns, key_constraints.into_iter().next()))
3331        } else {
3332            Ok((vec![], None))
3333        }
3334    }
3335
3336    /// Parses a key constraint.
3337    fn parse_key_constraint(&mut self) -> Result<Option<KeyConstraint>, ParserError> {
3338        // PRIMARY KEY (col_1, ..., col_n) NOT ENFORCED
3339        if self.parse_keywords(&[PRIMARY, KEY]) {
3340            let columns = self.parse_parenthesized_column_list(Mandatory)?;
3341            self.expect_keywords(&[NOT, ENFORCED])?;
3342            Ok(Some(KeyConstraint::PrimaryKeyNotEnforced { columns }))
3343        } else {
3344            Ok(None)
3345        }
3346    }
3347
3348    fn parse_source_option_name(&mut self) -> Result<CreateSourceOptionName, ParserError> {
3349        let name = match self.expect_one_of_keywords(&[TIMESTAMP, RETAIN])? {
3350            TIMESTAMP => {
3351                self.expect_keyword(INTERVAL)?;
3352                CreateSourceOptionName::TimestampInterval
3353            }
3354            RETAIN => {
3355                self.expect_keyword(HISTORY)?;
3356                CreateSourceOptionName::RetainHistory
3357            }
3358            _ => unreachable!(),
3359        };
3360        Ok(name)
3361    }
3362
3363    /// Parses a single valid option in the WITH block of a create source
3364    fn parse_source_option(&mut self) -> Result<CreateSourceOption<Raw>, ParserError> {
3365        let name = self.parse_source_option_name()?;
3366        if name == CreateSourceOptionName::RetainHistory {
3367            let _ = self.consume_token(&Token::Eq);
3368            return Ok(CreateSourceOption {
3369                name,
3370                value: self.parse_option_retain_history()?,
3371            });
3372        }
3373        Ok(CreateSourceOption {
3374            name,
3375            value: self.parse_optional_option_value()?,
3376        })
3377    }
3378
3379    fn parse_create_webhook_source(
3380        &mut self,
3381        name: UnresolvedItemName,
3382        if_not_exists: bool,
3383        in_cluster: Option<RawClusterName>,
3384        is_table: bool,
3385    ) -> Result<Statement<Raw>, ParserError> {
3386        self.expect_keywords(&[BODY, FORMAT])?;
3387
3388        // Note: we don't use `parse_format()` here because we support fewer formats than other
3389        // sources, and the user gets better errors if we reject the formats here.
3390        let body_format = match self.expect_one_of_keywords(&[JSON, TEXT, BYTES])? {
3391            JSON => {
3392                let array = self.parse_keyword(ARRAY);
3393                Format::Json { array }
3394            }
3395            TEXT => Format::Text,
3396            BYTES => Format::Bytes,
3397            _ => unreachable!(),
3398        };
3399
3400        let mut include_headers = CreateWebhookSourceIncludeHeaders::default();
3401        while self.parse_keyword(INCLUDE) {
3402            match self.expect_one_of_keywords(&[HEADER, HEADERS])? {
3403                HEADER => {
3404                    let header_name = self.parse_literal_string()?;
3405                    self.expect_keyword(AS)?;
3406                    let column_name = self.parse_identifier()?;
3407                    let use_bytes = self.parse_keyword(BYTES);
3408
3409                    include_headers.mappings.push(CreateWebhookSourceMapHeader {
3410                        header_name,
3411                        column_name,
3412                        use_bytes,
3413                    });
3414                }
3415                HEADERS => {
3416                    let header_filters = include_headers.column.get_or_insert_with(Vec::default);
3417                    if self.consume_token(&Token::LParen) {
3418                        let filters = self.parse_comma_separated(|f| {
3419                            let block = f.parse_keyword(NOT);
3420                            let header_name = f.parse_literal_string()?;
3421                            Ok(CreateWebhookSourceFilterHeader { block, header_name })
3422                        })?;
3423                        header_filters.extend(filters);
3424
3425                        self.expect_token(&Token::RParen)?;
3426                    }
3427                }
3428                k => unreachable!("programming error, didn't expect {k}"),
3429            }
3430        }
3431
3432        let validate_using = if self.parse_keyword(CHECK) {
3433            self.expect_token(&Token::LParen)?;
3434
3435            let options = if self.parse_keyword(WITH) {
3436                self.expect_token(&Token::LParen)?;
3437                let options = self.parse_create_webhook_check_options()?;
3438                self.expect_token(&Token::RParen)?;
3439
3440                Some(options)
3441            } else {
3442                None
3443            };
3444
3445            let using = self.parse_expr()?;
3446            self.expect_token(&Token::RParen)?;
3447
3448            Some(CreateWebhookSourceCheck { options, using })
3449        } else {
3450            None
3451        };
3452
3453        Ok(Statement::CreateWebhookSource(
3454            CreateWebhookSourceStatement {
3455                name,
3456                is_table,
3457                if_not_exists,
3458                body_format,
3459                include_headers,
3460                validate_using,
3461                in_cluster,
3462            },
3463        ))
3464    }
3465
3466    fn parse_create_webhook_check_options(
3467        &mut self,
3468    ) -> Result<CreateWebhookSourceCheckOptions<Raw>, ParserError> {
3469        let mut secrets = vec![];
3470        let mut headers = vec![];
3471        let mut bodies = vec![];
3472
3473        fn parse_alias(parser: &mut Parser<'_>) -> Result<Option<Ident>, ParserError> {
3474            parser
3475                .parse_keyword(AS)
3476                .then(|| parser.parse_identifier())
3477                .transpose()
3478        }
3479
3480        self.parse_comma_separated(|f| {
3481            match f.expect_one_of_keywords(&[SECRET, HEADERS, BODY])? {
3482                SECRET => {
3483                    let secret = f.parse_raw_name()?;
3484                    let alias = parse_alias(f)?;
3485                    let use_bytes = f.parse_keyword(Keyword::Bytes);
3486
3487                    secrets.push(CreateWebhookSourceSecret {
3488                        secret,
3489                        alias,
3490                        use_bytes,
3491                    });
3492
3493                    Ok(())
3494                }
3495                HEADERS => {
3496                    // TODO(parkmycar): Support filtering down to specific headers.
3497                    let alias = parse_alias(f)?;
3498                    let use_bytes = f.parse_keyword(Keyword::Bytes);
3499                    headers.push(CreateWebhookSourceHeader { alias, use_bytes });
3500
3501                    Ok(())
3502                }
3503                BODY => {
3504                    let alias = parse_alias(f)?;
3505                    let use_bytes = f.parse_keyword(Keyword::Bytes);
3506                    bodies.push(CreateWebhookSourceBody { alias, use_bytes });
3507
3508                    Ok(())
3509                }
3510                k => unreachable!("Unexpected keyword! {k}"),
3511            }
3512        })?;
3513
3514        Ok(CreateWebhookSourceCheckOptions {
3515            secrets,
3516            headers,
3517            bodies,
3518        })
3519    }
3520
3521    fn parse_create_iceberg_sink(
3522        &mut self,
3523        name: Option<UnresolvedItemName>,
3524        in_cluster: Option<RawClusterName>,
3525        from: RawItemName,
3526        if_not_exists: bool,
3527        connection: CreateSinkConnection<Raw>,
3528    ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3529        let mode = if self.parse_keyword(MODE) {
3530            Some(self.parse_iceberg_sink_mode()?)
3531        } else {
3532            None
3533        };
3534
3535        let with_options = if self.parse_keyword(WITH) {
3536            self.expect_token(&Token::LParen)?;
3537            let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3538            self.expect_token(&Token::RParen)?;
3539            options
3540        } else {
3541            vec![]
3542        };
3543
3544        Ok(CreateSinkStatement {
3545            name,
3546            in_cluster,
3547            from,
3548            connection,
3549            format: None,
3550            envelope: None,
3551            mode,
3552            if_not_exists,
3553            with_options,
3554        })
3555    }
3556
3557    fn parse_create_kafka_sink(
3558        &mut self,
3559        name: Option<UnresolvedItemName>,
3560        in_cluster: Option<RawClusterName>,
3561        from: RawItemName,
3562        if_not_exists: bool,
3563        connection: CreateSinkConnection<Raw>,
3564    ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3565        let format = match &self.parse_one_of_keywords(&[KEY, FORMAT]) {
3566            Some(KEY) => {
3567                self.expect_keyword(FORMAT)?;
3568                let key = self.parse_format()?;
3569                self.expect_keywords(&[VALUE, FORMAT])?;
3570                let value = self.parse_format()?;
3571                Some(FormatSpecifier::KeyValue { key, value })
3572            }
3573            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3574            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3575            None => None,
3576        };
3577        let envelope = if self.parse_keyword(ENVELOPE) {
3578            Some(self.parse_sink_envelope()?)
3579        } else {
3580            None
3581        };
3582
3583        let with_options = if self.parse_keyword(WITH) {
3584            self.expect_token(&Token::LParen)?;
3585            let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3586            self.expect_token(&Token::RParen)?;
3587            options
3588        } else {
3589            vec![]
3590        };
3591
3592        Ok(CreateSinkStatement {
3593            name,
3594            in_cluster,
3595            from,
3596            connection,
3597            format,
3598            envelope,
3599            mode: None,
3600            if_not_exists,
3601            with_options,
3602        })
3603    }
3604
3605    fn parse_create_sink(&mut self) -> Result<Statement<Raw>, ParserError> {
3606        self.expect_keyword(SINK)?;
3607        let if_not_exists = self.parse_if_not_exists()?;
3608
3609        let mut name = Some(self.parse_item_name()?);
3610
3611        // Sniff out `CREATE SINK IN CLUSTER <c> ...` and `CREATE SINK FROM
3612        // <view>...`  and ensure they are parsed as nameless `CREATE SINK`
3613        // commands.
3614        //
3615        // This is a bit gross, but we didn't have the foresight to make
3616        // `IN` and `FROM` reserved keywords for sink names.
3617        if (name == Some(UnresolvedItemName::unqualified(ident!("in")))
3618            && self.peek_keyword(CLUSTER))
3619            || (name == Some(UnresolvedItemName::unqualified(ident!("from")))
3620                && !self.peek_keyword(FROM))
3621        {
3622            name = None;
3623            self.prev_token();
3624        }
3625
3626        let in_cluster = self.parse_optional_in_cluster()?;
3627        self.expect_keyword(FROM)?;
3628        let from = self.parse_raw_name()?;
3629        self.expect_keyword(INTO)?;
3630        let connection = self.parse_create_sink_connection()?;
3631
3632        let statement = match connection {
3633            conn @ CreateSinkConnection::Kafka { .. } => {
3634                self.parse_create_kafka_sink(name, in_cluster, from, if_not_exists, conn)
3635            }
3636            conn @ CreateSinkConnection::Iceberg { .. } => {
3637                self.parse_create_iceberg_sink(name, in_cluster, from, if_not_exists, conn)
3638            }
3639        }?;
3640
3641        Ok(Statement::CreateSink(statement))
3642    }
3643
3644    /// Parse the name of a CREATE SINK optional parameter
3645    fn parse_create_sink_option_name(&mut self) -> Result<CreateSinkOptionName, ParserError> {
3646        let name = match self.expect_one_of_keywords(&[PARTITION, SNAPSHOT, VERSION, COMMIT])? {
3647            SNAPSHOT => CreateSinkOptionName::Snapshot,
3648            VERSION => CreateSinkOptionName::Version,
3649            PARTITION => {
3650                self.expect_keyword(STRATEGY)?;
3651                CreateSinkOptionName::PartitionStrategy
3652            }
3653            COMMIT => {
3654                self.expect_keyword(INTERVAL)?;
3655                CreateSinkOptionName::CommitInterval
3656            }
3657            _ => unreachable!(),
3658        };
3659        Ok(name)
3660    }
3661
3662    /// Parse a NAME = VALUE parameter for CREATE SINK
3663    fn parse_create_sink_option(&mut self) -> Result<CreateSinkOption<Raw>, ParserError> {
3664        Ok(CreateSinkOption {
3665            name: self.parse_create_sink_option_name()?,
3666            value: self.parse_optional_option_value()?,
3667        })
3668    }
3669
3670    fn parse_create_source_connection(
3671        &mut self,
3672    ) -> Result<CreateSourceConnection<Raw>, ParserError> {
3673        match self.expect_one_of_keywords(&[KAFKA, POSTGRES, SQL, MYSQL, LOAD])? {
3674            POSTGRES => {
3675                self.expect_keyword(CONNECTION)?;
3676                let connection = self.parse_raw_name()?;
3677
3678                let options = if self.consume_token(&Token::LParen) {
3679                    let options = self.parse_comma_separated(Parser::parse_pg_connection_option)?;
3680                    self.expect_token(&Token::RParen)?;
3681                    options
3682                } else {
3683                    vec![]
3684                };
3685
3686                Ok(CreateSourceConnection::Postgres {
3687                    connection,
3688                    options,
3689                })
3690            }
3691            SQL => {
3692                self.expect_keywords(&[SERVER, CONNECTION])?;
3693                let connection = self.parse_raw_name()?;
3694
3695                let options = if self.consume_token(&Token::LParen) {
3696                    let options =
3697                        self.parse_comma_separated(Parser::parse_sql_server_connection_option)?;
3698                    self.expect_token(&Token::RParen)?;
3699                    options
3700                } else {
3701                    vec![]
3702                };
3703
3704                Ok(CreateSourceConnection::SqlServer {
3705                    connection,
3706                    options,
3707                })
3708            }
3709            MYSQL => {
3710                self.expect_keyword(CONNECTION)?;
3711                let connection = self.parse_raw_name()?;
3712
3713                let options = if self.consume_token(&Token::LParen) {
3714                    let options =
3715                        self.parse_comma_separated(Parser::parse_mysql_connection_option)?;
3716                    self.expect_token(&Token::RParen)?;
3717                    options
3718                } else {
3719                    vec![]
3720                };
3721
3722                Ok(CreateSourceConnection::MySql {
3723                    connection,
3724                    options,
3725                })
3726            }
3727            KAFKA => {
3728                self.expect_keyword(CONNECTION)?;
3729                let connection = self.parse_raw_name()?;
3730
3731                let options = if self.consume_token(&Token::LParen) {
3732                    let options =
3733                        self.parse_comma_separated(Parser::parse_kafka_source_config_option)?;
3734                    self.expect_token(&Token::RParen)?;
3735                    options
3736                } else {
3737                    vec![]
3738                };
3739
3740                Ok(CreateSourceConnection::Kafka {
3741                    connection,
3742                    options,
3743                })
3744            }
3745            LOAD => {
3746                self.expect_keyword(GENERATOR)?;
3747                let generator = match self.expect_one_of_keywords(&[
3748                    CLOCK, COUNTER, MARKETING, AUCTION, TPCH, DATUMS, KEY,
3749                ])? {
3750                    CLOCK => LoadGenerator::Clock,
3751                    COUNTER => LoadGenerator::Counter,
3752                    AUCTION => LoadGenerator::Auction,
3753                    TPCH => LoadGenerator::Tpch,
3754                    DATUMS => LoadGenerator::Datums,
3755                    MARKETING => LoadGenerator::Marketing,
3756                    KEY => {
3757                        self.expect_keyword(VALUE)?;
3758                        LoadGenerator::KeyValue
3759                    }
3760                    _ => unreachable!(),
3761                };
3762                let options = if self.consume_token(&Token::LParen) {
3763                    let options =
3764                        self.parse_comma_separated(Parser::parse_load_generator_option)?;
3765                    self.expect_token(&Token::RParen)?;
3766                    options
3767                } else {
3768                    vec![]
3769                };
3770                Ok(CreateSourceConnection::LoadGenerator { generator, options })
3771            }
3772            _ => unreachable!(),
3773        }
3774    }
3775
3776    fn parse_pg_connection_option(&mut self) -> Result<PgConfigOption<Raw>, ParserError> {
3777        let name = match self.expect_one_of_keywords(&[DETAILS, PUBLICATION, TEXT, EXCLUDE])? {
3778            DETAILS => PgConfigOptionName::Details,
3779            PUBLICATION => PgConfigOptionName::Publication,
3780            TEXT => {
3781                self.expect_keyword(COLUMNS)?;
3782
3783                let _ = self.consume_token(&Token::Eq);
3784
3785                let value = self
3786                    .parse_option_sequence(Parser::parse_item_name)?
3787                    .map(|inner| {
3788                        WithOptionValue::Sequence(
3789                            inner
3790                                .into_iter()
3791                                .map(WithOptionValue::UnresolvedItemName)
3792                                .collect_vec(),
3793                        )
3794                    });
3795
3796                return Ok(PgConfigOption {
3797                    name: PgConfigOptionName::TextColumns,
3798                    value,
3799                });
3800            }
3801            EXCLUDE => {
3802                self.expect_keyword(COLUMNS)?;
3803
3804                let _ = self.consume_token(&Token::Eq);
3805
3806                let value = self
3807                    .parse_option_sequence(Parser::parse_item_name)?
3808                    .map(|inner| {
3809                        WithOptionValue::Sequence(
3810                            inner
3811                                .into_iter()
3812                                .map(WithOptionValue::UnresolvedItemName)
3813                                .collect_vec(),
3814                        )
3815                    });
3816
3817                return Ok(PgConfigOption {
3818                    name: PgConfigOptionName::ExcludeColumns,
3819                    value,
3820                });
3821            }
3822            _ => unreachable!(),
3823        };
3824        Ok(PgConfigOption {
3825            name,
3826            value: self.parse_optional_option_value()?,
3827        })
3828    }
3829
3830    fn parse_mysql_connection_option(&mut self) -> Result<MySqlConfigOption<Raw>, ParserError> {
3831        match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE, IGNORE])? {
3832            DETAILS => Ok(MySqlConfigOption {
3833                name: MySqlConfigOptionName::Details,
3834                value: self.parse_optional_option_value()?,
3835            }),
3836            TEXT => {
3837                self.expect_keyword(COLUMNS)?;
3838
3839                let _ = self.consume_token(&Token::Eq);
3840
3841                let value = self
3842                    .parse_option_sequence(Parser::parse_item_name)?
3843                    .map(|inner| {
3844                        WithOptionValue::Sequence(
3845                            inner
3846                                .into_iter()
3847                                .map(WithOptionValue::UnresolvedItemName)
3848                                .collect_vec(),
3849                        )
3850                    });
3851
3852                Ok(MySqlConfigOption {
3853                    name: MySqlConfigOptionName::TextColumns,
3854                    value,
3855                })
3856            }
3857            // IGNORE is historical syntax for the option.
3858            EXCLUDE | IGNORE => {
3859                self.expect_keyword(COLUMNS)?;
3860
3861                let _ = self.consume_token(&Token::Eq);
3862
3863                let value = self
3864                    .parse_option_sequence(Parser::parse_item_name)?
3865                    .map(|inner| {
3866                        WithOptionValue::Sequence(
3867                            inner
3868                                .into_iter()
3869                                .map(WithOptionValue::UnresolvedItemName)
3870                                .collect_vec(),
3871                        )
3872                    });
3873
3874                Ok(MySqlConfigOption {
3875                    name: MySqlConfigOptionName::ExcludeColumns,
3876                    value,
3877                })
3878            }
3879            _ => unreachable!(),
3880        }
3881    }
3882
3883    fn parse_sql_server_connection_option(
3884        &mut self,
3885    ) -> Result<SqlServerConfigOption<Raw>, ParserError> {
3886        match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE])? {
3887            DETAILS => Ok(SqlServerConfigOption {
3888                name: SqlServerConfigOptionName::Details,
3889                value: self.parse_optional_option_value()?,
3890            }),
3891            TEXT => {
3892                self.expect_keyword(COLUMNS)?;
3893
3894                let _ = self.consume_token(&Token::Eq);
3895
3896                let value = self
3897                    .parse_option_sequence(Parser::parse_item_name)?
3898                    .map(|inner| {
3899                        WithOptionValue::Sequence(
3900                            inner
3901                                .into_iter()
3902                                .map(WithOptionValue::UnresolvedItemName)
3903                                .collect_vec(),
3904                        )
3905                    });
3906
3907                Ok(SqlServerConfigOption {
3908                    name: SqlServerConfigOptionName::TextColumns,
3909                    value,
3910                })
3911            }
3912            EXCLUDE => {
3913                self.expect_keyword(COLUMNS)?;
3914
3915                let _ = self.consume_token(&Token::Eq);
3916
3917                let value = self
3918                    .parse_option_sequence(Parser::parse_item_name)?
3919                    .map(|inner| {
3920                        WithOptionValue::Sequence(
3921                            inner
3922                                .into_iter()
3923                                .map(WithOptionValue::UnresolvedItemName)
3924                                .collect_vec(),
3925                        )
3926                    });
3927
3928                Ok(SqlServerConfigOption {
3929                    name: SqlServerConfigOptionName::ExcludeColumns,
3930                    value,
3931                })
3932            }
3933            _ => unreachable!(),
3934        }
3935    }
3936
3937    fn parse_load_generator_option(&mut self) -> Result<LoadGeneratorOption<Raw>, ParserError> {
3938        let name = match self.expect_one_of_keywords(&[
3939            AS,
3940            UP,
3941            SCALE,
3942            TICK,
3943            MAX,
3944            KEYS,
3945            SNAPSHOT,
3946            TRANSACTIONAL,
3947            VALUE,
3948            SEED,
3949            PARTITIONS,
3950            BATCH,
3951        ])? {
3952            AS => {
3953                self.expect_keyword(OF)?;
3954                LoadGeneratorOptionName::AsOf
3955            }
3956            UP => {
3957                self.expect_keyword(TO)?;
3958                LoadGeneratorOptionName::UpTo
3959            }
3960            SCALE => {
3961                self.expect_keyword(FACTOR)?;
3962                LoadGeneratorOptionName::ScaleFactor
3963            }
3964            TICK => {
3965                self.expect_keyword(INTERVAL)?;
3966                LoadGeneratorOptionName::TickInterval
3967            }
3968            MAX => {
3969                self.expect_keyword(CARDINALITY)?;
3970                LoadGeneratorOptionName::MaxCardinality
3971            }
3972            KEYS => LoadGeneratorOptionName::Keys,
3973            SNAPSHOT => {
3974                self.expect_keyword(ROUNDS)?;
3975                LoadGeneratorOptionName::SnapshotRounds
3976            }
3977            TRANSACTIONAL => {
3978                self.expect_keyword(SNAPSHOT)?;
3979                LoadGeneratorOptionName::TransactionalSnapshot
3980            }
3981            VALUE => {
3982                self.expect_keyword(SIZE)?;
3983                LoadGeneratorOptionName::ValueSize
3984            }
3985            SEED => LoadGeneratorOptionName::Seed,
3986            PARTITIONS => LoadGeneratorOptionName::Partitions,
3987            BATCH => {
3988                self.expect_keyword(SIZE)?;
3989                LoadGeneratorOptionName::BatchSize
3990            }
3991            _ => unreachable!(),
3992        };
3993
3994        let _ = self.consume_token(&Token::Eq);
3995        Ok(LoadGeneratorOption {
3996            name,
3997            value: self.parse_optional_option_value()?,
3998        })
3999    }
4000
4001    fn parse_create_kafka_sink_connection(
4002        &mut self,
4003    ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4004        self.expect_keyword(CONNECTION)?;
4005
4006        let connection = self.parse_raw_name()?;
4007
4008        let options = if self.consume_token(&Token::LParen) {
4009            let options = self.parse_comma_separated(Parser::parse_kafka_sink_config_option)?;
4010            self.expect_token(&Token::RParen)?;
4011            options
4012        } else {
4013            vec![]
4014        };
4015
4016        // one token of lookahead:
4017        // * `KEY (` means we're parsing a list of columns for the key
4018        // * `KEY FORMAT` means there is no key, we'll parse a KeyValueFormat later
4019        let key =
4020            if self.peek_keyword(KEY) && self.peek_nth_token(1) != Some(Token::Keyword(FORMAT)) {
4021                let _ = self.expect_keyword(KEY);
4022                let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4023
4024                let not_enforced = if self.peek_keywords(&[NOT, ENFORCED]) {
4025                    self.expect_keywords(&[NOT, ENFORCED])?;
4026                    true
4027                } else {
4028                    false
4029                };
4030                Some(SinkKey {
4031                    key_columns,
4032                    not_enforced,
4033                })
4034            } else {
4035                None
4036            };
4037
4038        let headers = if self.parse_keyword(HEADERS) {
4039            Some(self.parse_identifier()?)
4040        } else {
4041            None
4042        };
4043
4044        Ok(CreateSinkConnection::Kafka {
4045            connection,
4046            options,
4047            key,
4048            headers,
4049        })
4050    }
4051
4052    fn parse_create_iceberg_sink_connection(
4053        &mut self,
4054    ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4055        self.expect_keyword(CONNECTION)?;
4056        let catalog_connection = self.parse_raw_name()?;
4057
4058        let options = if self.consume_token(&Token::LParen) {
4059            let options = self.parse_comma_separated(Parser::parse_iceberg_sink_config_option)?;
4060            self.expect_token(&Token::RParen)?;
4061            options
4062        } else {
4063            vec![]
4064        };
4065
4066        let aws_connection = if self.parse_keywords(&[USING, AWS, CONNECTION]) {
4067            Some(self.parse_raw_name()?)
4068        } else {
4069            None
4070        };
4071
4072        let key = if self.parse_keyword(KEY) {
4073            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4074
4075            let not_enforced = self.parse_keywords(&[NOT, ENFORCED]);
4076            Some(SinkKey {
4077                key_columns,
4078                not_enforced,
4079            })
4080        } else {
4081            None
4082        };
4083
4084        Ok(CreateSinkConnection::Iceberg {
4085            catalog_connection,
4086            aws_connection,
4087            key,
4088            options,
4089        })
4090    }
4091
4092    fn parse_create_sink_connection(&mut self) -> Result<CreateSinkConnection<Raw>, ParserError> {
4093        match self.expect_one_of_keywords(&[KAFKA, ICEBERG])? {
4094            KAFKA => self.parse_create_kafka_sink_connection(),
4095            ICEBERG => {
4096                self.expect_keyword(CATALOG)?;
4097                self.parse_create_iceberg_sink_connection()
4098            }
4099            _ => unreachable!(),
4100        }
4101    }
4102
4103    fn parse_create_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4104        let mut if_exists = if self.parse_keyword(OR) {
4105            self.expect_keyword(REPLACE)?;
4106            IfExistsBehavior::Replace
4107        } else {
4108            IfExistsBehavior::Error
4109        };
4110        let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
4111        self.expect_keyword(VIEW)?;
4112        if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4113            if_exists = IfExistsBehavior::Skip;
4114        }
4115
4116        let definition = self.parse_view_definition()?;
4117        Ok(Statement::CreateView(CreateViewStatement {
4118            temporary,
4119            if_exists,
4120            definition,
4121        }))
4122    }
4123
4124    fn parse_view_definition(&mut self) -> Result<ViewDefinition<Raw>, ParserError> {
4125        // ANSI SQL and Postgres support RECURSIVE here, but we don't.
4126        let name = self.parse_item_name()?;
4127        let columns = self.parse_parenthesized_column_list(Optional)?;
4128        // Postgres supports WITH options here, but we don't.
4129        self.expect_keyword(AS)?;
4130        let query = self.parse_query()?;
4131        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
4132        Ok(ViewDefinition {
4133            name,
4134            columns,
4135            query,
4136        })
4137    }
4138
4139    fn parse_create_materialized_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4140        let mut if_exists = if self.parse_keyword(OR) {
4141            self.expect_keyword(REPLACE)?;
4142            IfExistsBehavior::Replace
4143        } else {
4144            IfExistsBehavior::Error
4145        };
4146        let replacement = self.parse_keyword(REPLACEMENT);
4147        self.expect_keywords(&[MATERIALIZED, VIEW])?;
4148        if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4149            if_exists = IfExistsBehavior::Skip;
4150        }
4151
4152        let name = self.parse_item_name()?;
4153        let columns = self.parse_parenthesized_column_list(Optional)?;
4154        let replacement_for = if replacement {
4155            self.expect_keyword(FOR)?;
4156            Some(self.parse_raw_name()?)
4157        } else {
4158            None
4159        };
4160        let (in_cluster, in_cluster_replica) = if self.parse_keywords(&[IN, CLUSTER]) {
4161            let cluster = self.parse_raw_ident()?;
4162            let replica = if self.parse_keyword(REPLICA) {
4163                Some(self.parse_identifier()?)
4164            } else {
4165                None
4166            };
4167            (Some(cluster), replica)
4168        } else if self.parse_keywords(&[IN, REPLICA]) {
4169            let replica = self.parse_identifier()?;
4170            (None, Some(replica))
4171        } else {
4172            (None, None)
4173        };
4174
4175        let with_options = if self.parse_keyword(WITH) {
4176            self.expect_token(&Token::LParen)?;
4177            let options = self.parse_comma_separated(Parser::parse_materialized_view_option)?;
4178            self.expect_token(&Token::RParen)?;
4179            options
4180        } else {
4181            vec![]
4182        };
4183
4184        self.expect_keyword(AS)?;
4185        let query = self.parse_query()?;
4186        let as_of = self.parse_optional_internal_as_of()?;
4187
4188        Ok(Statement::CreateMaterializedView(
4189            CreateMaterializedViewStatement {
4190                if_exists,
4191                name,
4192                columns,
4193                replacement_for,
4194                in_cluster,
4195                in_cluster_replica,
4196                query,
4197                as_of,
4198                with_options,
4199            },
4200        ))
4201    }
4202
4203    fn parse_materialized_view_option_name(
4204        &mut self,
4205    ) -> Result<MaterializedViewOptionName, ParserError> {
4206        let option = self.expect_one_of_keywords(&[ASSERT, PARTITION, RETAIN, REFRESH])?;
4207        let name = match option {
4208            ASSERT => {
4209                self.expect_keywords(&[NOT, NULL])?;
4210                MaterializedViewOptionName::AssertNotNull
4211            }
4212            PARTITION => {
4213                self.expect_keyword(BY)?;
4214                MaterializedViewOptionName::PartitionBy
4215            }
4216            RETAIN => {
4217                self.expect_keyword(HISTORY)?;
4218                MaterializedViewOptionName::RetainHistory
4219            }
4220            REFRESH => MaterializedViewOptionName::Refresh,
4221            _ => unreachable!(),
4222        };
4223        Ok(name)
4224    }
4225
4226    fn parse_materialized_view_option(
4227        &mut self,
4228    ) -> Result<MaterializedViewOption<Raw>, ParserError> {
4229        let name = self.parse_materialized_view_option_name()?;
4230        let value = match name {
4231            MaterializedViewOptionName::RetainHistory => self.parse_option_retain_history()?,
4232            MaterializedViewOptionName::Refresh => {
4233                Some(self.parse_materialized_view_refresh_option_value()?)
4234            }
4235            _ => self.parse_optional_option_value()?,
4236        };
4237        Ok(MaterializedViewOption { name, value })
4238    }
4239
4240    fn parse_option_retain_history(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
4241        Ok(Some(self.parse_retain_history()?))
4242    }
4243
4244    fn parse_retain_history(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
4245        let _ = self.consume_token(&Token::Eq);
4246        self.expect_keyword(FOR)?;
4247        let value = self.parse_value()?;
4248        Ok(WithOptionValue::RetainHistoryFor(value))
4249    }
4250
4251    fn parse_materialized_view_refresh_option_value(
4252        &mut self,
4253    ) -> Result<WithOptionValue<Raw>, ParserError> {
4254        let _ = self.consume_token(&Token::Eq);
4255
4256        match self.expect_one_of_keywords(&[ON, AT, EVERY])? {
4257            ON => {
4258                self.expect_keyword(COMMIT)?;
4259                Ok(WithOptionValue::Refresh(RefreshOptionValue::OnCommit))
4260            }
4261            AT => {
4262                if self.parse_keyword(CREATION) {
4263                    Ok(WithOptionValue::Refresh(RefreshOptionValue::AtCreation))
4264                } else {
4265                    Ok(WithOptionValue::Refresh(RefreshOptionValue::At(
4266                        RefreshAtOptionValue {
4267                            time: self.parse_expr()?,
4268                        },
4269                    )))
4270                }
4271            }
4272            EVERY => {
4273                let interval = self.parse_interval_value()?;
4274                let aligned_to = if self.parse_keywords(&[ALIGNED, TO]) {
4275                    Some(self.parse_expr()?)
4276                } else {
4277                    None
4278                };
4279                Ok(WithOptionValue::Refresh(RefreshOptionValue::Every(
4280                    RefreshEveryOptionValue {
4281                        interval,
4282                        aligned_to,
4283                    },
4284                )))
4285            }
4286            _ => unreachable!(),
4287        }
4288    }
4289
4290    fn parse_create_index(&mut self) -> Result<Statement<Raw>, ParserError> {
4291        let default_index = self.parse_keyword(DEFAULT);
4292        self.expect_keyword(INDEX)?;
4293
4294        let if_not_exists = self.parse_if_not_exists()?;
4295        let name = if self.peek_keyword(IN) || self.peek_keyword(ON) {
4296            if if_not_exists && !default_index {
4297                return self.expected(self.peek_pos(), "index name", self.peek_token());
4298            }
4299            None
4300        } else {
4301            Some(self.parse_identifier()?)
4302        };
4303        let in_cluster = self.parse_optional_in_cluster()?;
4304        self.expect_keyword(ON)?;
4305        let on_name = self.parse_raw_name()?;
4306
4307        // Arrangements are the only index type we support, so we can just ignore this
4308        if self.parse_keyword(USING) {
4309            self.expect_keyword(ARRANGEMENT)?;
4310        }
4311
4312        let key_parts = if default_index {
4313            None
4314        } else {
4315            self.expect_token(&Token::LParen)?;
4316            if self.consume_token(&Token::RParen) {
4317                Some(vec![])
4318            } else {
4319                let key_parts = self
4320                    .parse_comma_separated(Parser::parse_order_by_expr)?
4321                    .into_iter()
4322                    .map(|x| x.expr)
4323                    .collect::<Vec<_>>();
4324                self.expect_token(&Token::RParen)?;
4325                Some(key_parts)
4326            }
4327        };
4328
4329        let with_options = if self.parse_keyword(WITH) {
4330            self.expect_token(&Token::LParen)?;
4331            let o = if matches!(self.peek_token(), Some(Token::RParen)) {
4332                vec![]
4333            } else {
4334                self.parse_comma_separated(Parser::parse_index_option)?
4335            };
4336            self.expect_token(&Token::RParen)?;
4337            o
4338        } else {
4339            vec![]
4340        };
4341
4342        Ok(Statement::CreateIndex(CreateIndexStatement {
4343            name,
4344            in_cluster,
4345            on_name,
4346            key_parts,
4347            with_options,
4348            if_not_exists,
4349        }))
4350    }
4351
4352    fn parse_table_option_name(&mut self) -> Result<TableOptionName, ParserError> {
4353        // this is only so we can test redacted values, of which no other
4354        // examples exist as of its introduction.
4355        if self.parse_keyword(REDACTED) {
4356            return Ok(TableOptionName::RedactedTest);
4357        }
4358        let name = match self.expect_one_of_keywords(&[PARTITION, RETAIN])? {
4359            PARTITION => {
4360                self.expect_keyword(BY)?;
4361                TableOptionName::PartitionBy
4362            }
4363            RETAIN => {
4364                self.expect_keyword(HISTORY)?;
4365                TableOptionName::RetainHistory
4366            }
4367            _ => unreachable!(),
4368        };
4369        Ok(name)
4370    }
4371
4372    fn parse_table_option(&mut self) -> Result<TableOption<Raw>, ParserError> {
4373        let name = self.parse_table_option_name()?;
4374        let value = match name {
4375            TableOptionName::PartitionBy => self.parse_optional_option_value(),
4376            TableOptionName::RetainHistory => self.parse_option_retain_history(),
4377            TableOptionName::RedactedTest => self.parse_optional_option_value(),
4378        }?;
4379        Ok(TableOption { name, value })
4380    }
4381
4382    fn parse_index_option_name(&mut self) -> Result<IndexOptionName, ParserError> {
4383        self.expect_keywords(&[RETAIN, HISTORY])?;
4384        Ok(IndexOptionName::RetainHistory)
4385    }
4386
4387    fn parse_index_option(&mut self) -> Result<IndexOption<Raw>, ParserError> {
4388        let name = self.parse_index_option_name()?;
4389        let value = match name {
4390            IndexOptionName::RetainHistory => self.parse_option_retain_history(),
4391        }?;
4392        Ok(IndexOption { name, value })
4393    }
4394
4395    fn parse_raw_ident(&mut self) -> Result<RawClusterName, ParserError> {
4396        if self.consume_token(&Token::LBracket) {
4397            let id = self.parse_raw_ident_str()?;
4398            self.expect_token(&Token::RBracket)?;
4399            Ok(RawClusterName::Resolved(id))
4400        } else {
4401            Ok(RawClusterName::Unresolved(self.parse_identifier()?))
4402        }
4403    }
4404
4405    fn parse_raw_network_policy_name(&mut self) -> Result<RawNetworkPolicyName, ParserError> {
4406        if self.consume_token(&Token::LBracket) {
4407            let id = self.parse_raw_ident_str()?;
4408            self.expect_token(&Token::RBracket)?;
4409            Ok(RawNetworkPolicyName::Resolved(id))
4410        } else {
4411            Ok(RawNetworkPolicyName::Unresolved(self.parse_identifier()?))
4412        }
4413    }
4414
4415    fn parse_raw_ident_str(&mut self) -> Result<String, ParserError> {
4416        let id = match self.next_token() {
4417            Some(Token::Ident(id)) => id.into_inner(),
4418            Some(Token::Number(n)) => n,
4419            _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4420        };
4421        // A resolved name renders as `[id]`; an empty id (e.g. `[""]`) would
4422        // display as `[]` and fail to reparse. Reject it.
4423        if id.is_empty() {
4424            return parser_err!(self, self.peek_prev_pos(), "expected id");
4425        }
4426        Ok(id)
4427    }
4428
4429    fn parse_optional_in_cluster(&mut self) -> Result<Option<RawClusterName>, ParserError> {
4430        if self.parse_keywords(&[IN, CLUSTER]) {
4431            Ok(Some(self.parse_raw_ident()?))
4432        } else {
4433            Ok(None)
4434        }
4435    }
4436
4437    fn parse_create_role(&mut self) -> Result<Statement<Raw>, ParserError> {
4438        self.expect_keyword(ROLE)?;
4439        let name = self.parse_identifier()?;
4440        let _ = self.parse_keyword(WITH);
4441        let options = self.parse_role_attributes()?;
4442        Ok(Statement::CreateRole(CreateRoleStatement { name, options }))
4443    }
4444
4445    fn parse_role_attributes(&mut self) -> Result<Vec<RoleAttribute>, ParserError> {
4446        let mut options = vec![];
4447        loop {
4448            match self.parse_one_of_keywords(&[
4449                SUPERUSER,
4450                NOSUPERUSER,
4451                LOGIN,
4452                NOLOGIN,
4453                INHERIT,
4454                NOINHERIT,
4455                CREATECLUSTER,
4456                NOCREATECLUSTER,
4457                CREATEDB,
4458                NOCREATEDB,
4459                CREATEROLE,
4460                NOCREATEROLE,
4461                PASSWORD,
4462            ]) {
4463                None => break,
4464                Some(SUPERUSER) => options.push(RoleAttribute::SuperUser),
4465                Some(NOSUPERUSER) => options.push(RoleAttribute::NoSuperUser),
4466                Some(LOGIN) => options.push(RoleAttribute::Login),
4467                Some(NOLOGIN) => options.push(RoleAttribute::NoLogin),
4468                Some(INHERIT) => options.push(RoleAttribute::Inherit),
4469                Some(NOINHERIT) => options.push(RoleAttribute::NoInherit),
4470                Some(CREATECLUSTER) => options.push(RoleAttribute::CreateCluster),
4471                Some(NOCREATECLUSTER) => options.push(RoleAttribute::NoCreateCluster),
4472                Some(CREATEDB) => options.push(RoleAttribute::CreateDB),
4473                Some(NOCREATEDB) => options.push(RoleAttribute::NoCreateDB),
4474                Some(CREATEROLE) => options.push(RoleAttribute::CreateRole),
4475                Some(NOCREATEROLE) => options.push(RoleAttribute::NoCreateRole),
4476                Some(PASSWORD) => {
4477                    if self.parse_keyword(NULL) {
4478                        options.push(RoleAttribute::Password(None));
4479                        continue;
4480                    }
4481                    let password = self.parse_literal_string()?;
4482                    options.push(RoleAttribute::Password(Some(password)));
4483                }
4484                Some(_) => unreachable!(),
4485            }
4486        }
4487        Ok(options)
4488    }
4489
4490    fn parse_create_secret(&mut self) -> Result<Statement<Raw>, ParserError> {
4491        self.expect_keyword(SECRET)?;
4492        let if_not_exists = self.parse_if_not_exists()?;
4493        let name = self.parse_item_name()?;
4494        self.expect_keyword(AS)?;
4495        let value = self.parse_expr()?;
4496        Ok(Statement::CreateSecret(CreateSecretStatement {
4497            name,
4498            if_not_exists,
4499            value,
4500        }))
4501    }
4502
4503    fn parse_create_type(&mut self) -> Result<Statement<Raw>, ParserError> {
4504        self.expect_keyword(TYPE)?;
4505        let name = self.parse_item_name()?;
4506        self.expect_keyword(AS)?;
4507
4508        match self.parse_one_of_keywords(&[LIST, MAP]) {
4509            Some(LIST) => {
4510                self.expect_token(&Token::LParen)?;
4511                let options = self.parse_comma_separated(Parser::parse_create_type_list_option)?;
4512                self.expect_token(&Token::RParen)?;
4513                Ok(Statement::CreateType(CreateTypeStatement {
4514                    name,
4515                    as_type: CreateTypeAs::List { options },
4516                }))
4517            }
4518            Some(MAP) => {
4519                self.expect_token(&Token::LParen)?;
4520                let options = self.parse_comma_separated(Parser::parse_create_type_map_option)?;
4521                self.expect_token(&Token::RParen)?;
4522                Ok(Statement::CreateType(CreateTypeStatement {
4523                    name,
4524                    as_type: CreateTypeAs::Map { options },
4525                }))
4526            }
4527            None => {
4528                let column_defs = self.parse_composite_type_definition()?;
4529
4530                Ok(Statement::CreateType(CreateTypeStatement {
4531                    name,
4532                    as_type: CreateTypeAs::Record { column_defs },
4533                }))
4534            }
4535            _ => unreachable!(),
4536        }
4537    }
4538
4539    fn parse_create_type_list_option(&mut self) -> Result<CreateTypeListOption<Raw>, ParserError> {
4540        self.expect_keywords(&[ELEMENT, TYPE])?;
4541        let name = CreateTypeListOptionName::ElementType;
4542        Ok(CreateTypeListOption {
4543            name,
4544            value: Some(self.parse_data_type_option_value()?),
4545        })
4546    }
4547
4548    fn parse_create_type_map_option(&mut self) -> Result<CreateTypeMapOption<Raw>, ParserError> {
4549        let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
4550            KEY => {
4551                self.expect_keyword(TYPE)?;
4552                CreateTypeMapOptionName::KeyType
4553            }
4554            VALUE => {
4555                self.expect_keyword(TYPE)?;
4556                CreateTypeMapOptionName::ValueType
4557            }
4558            _ => unreachable!(),
4559        };
4560        Ok(CreateTypeMapOption {
4561            name,
4562            value: Some(self.parse_data_type_option_value()?),
4563        })
4564    }
4565
4566    fn parse_create_cluster(&mut self) -> Result<Statement<Raw>, ParserError> {
4567        let name = self.parse_identifier()?;
4568        // For historical reasons, the parentheses around the options can be
4569        // omitted.
4570        let paren = self.consume_token(&Token::LParen);
4571        let options = self.parse_comma_separated(Parser::parse_cluster_option)?;
4572        if paren {
4573            self.expect_token(&Token::RParen)?;
4574        }
4575
4576        let features = if self.parse_keywords(&[FEATURES]) {
4577            self.expect_token(&Token::LParen)?;
4578            let features = self.parse_comma_separated(Parser::parse_cluster_feature)?;
4579            self.expect_token(&Token::RParen)?;
4580            features
4581        } else {
4582            Vec::new()
4583        };
4584
4585        Ok(Statement::CreateCluster(CreateClusterStatement {
4586            name,
4587            options,
4588            features,
4589        }))
4590    }
4591
4592    fn parse_cluster_option_name(&mut self) -> Result<ClusterOptionName, ParserError> {
4593        let option = self.expect_one_of_keywords(&[
4594            AUTO,
4595            AVAILABILITY,
4596            DISK,
4597            EXPERIMENTAL,
4598            INTROSPECTION,
4599            MANAGED,
4600            REPLICAS,
4601            REPLICATION,
4602            SIZE,
4603            SCHEDULE,
4604            WORKLOAD,
4605        ])?;
4606        let name = match option {
4607            AUTO => {
4608                self.expect_keywords(&[SCALING, STRATEGY])?;
4609                ClusterOptionName::AutoScalingStrategy
4610            }
4611            AVAILABILITY => {
4612                self.expect_keyword(ZONES)?;
4613                ClusterOptionName::AvailabilityZones
4614            }
4615            DISK => ClusterOptionName::Disk,
4616            EXPERIMENTAL => {
4617                self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4618                ClusterOptionName::ExperimentalArrangementCompression
4619            }
4620            INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4621                DEBUGGING => ClusterOptionName::IntrospectionDebugging,
4622                INTERVAL => ClusterOptionName::IntrospectionInterval,
4623                _ => unreachable!(),
4624            },
4625            MANAGED => ClusterOptionName::Managed,
4626            REPLICAS => ClusterOptionName::Replicas,
4627            REPLICATION => {
4628                self.expect_keyword(FACTOR)?;
4629                ClusterOptionName::ReplicationFactor
4630            }
4631            SIZE => ClusterOptionName::Size,
4632            SCHEDULE => ClusterOptionName::Schedule,
4633            WORKLOAD => {
4634                self.expect_keyword(CLASS)?;
4635                ClusterOptionName::WorkloadClass
4636            }
4637            _ => unreachable!(),
4638        };
4639        Ok(name)
4640    }
4641
4642    fn parse_cluster_option(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4643        let name = self.parse_cluster_option_name()?;
4644
4645        match name {
4646            ClusterOptionName::Replicas => self.parse_cluster_option_replicas(),
4647            ClusterOptionName::Schedule => self.parse_cluster_option_schedule(),
4648            ClusterOptionName::AutoScalingStrategy => {
4649                self.parse_cluster_option_auto_scaling_strategy()
4650            }
4651            _ => {
4652                let value = self.parse_optional_option_value()?;
4653                Ok(ClusterOption { name, value })
4654            }
4655        }
4656    }
4657
4658    fn parse_alter_cluster_option(&mut self) -> Result<ClusterAlterOption<Raw>, ParserError> {
4659        let (name, value) = match self.expect_one_of_keywords(&[WAIT])? {
4660            WAIT => {
4661                let _ = self.consume_token(&Token::Eq);
4662                let v = match self.expect_one_of_keywords(&[FOR, UNTIL])? {
4663                    FOR => Some(WithOptionValue::ClusterAlterStrategy(
4664                        ClusterAlterOptionValue::For(self.parse_value()?),
4665                    )),
4666                    UNTIL => {
4667                        self.expect_keyword(READY)?;
4668                        let _ = self.consume_token(&Token::Eq);
4669                        self.expect_token(&Token::LParen)?;
4670                        let opts = Some(WithOptionValue::ClusterAlterStrategy(
4671                            ClusterAlterOptionValue::UntilReady(self.parse_comma_separated(
4672                                Parser::parse_cluster_alter_until_ready_option,
4673                            )?),
4674                        ));
4675                        self.expect_token(&Token::RParen)?;
4676                        opts
4677                    }
4678                    _ => unreachable!(),
4679                };
4680                (ClusterAlterOptionName::Wait, v)
4681            }
4682            _ => unreachable!(),
4683        };
4684        Ok(ClusterAlterOption { name, value })
4685    }
4686
4687    fn parse_cluster_alter_until_ready_option(
4688        &mut self,
4689    ) -> Result<ClusterAlterUntilReadyOption<Raw>, ParserError> {
4690        let name = match self.expect_one_of_keywords(&[TIMEOUT, ON])? {
4691            ON => {
4692                self.expect_keywords(&[TIMEOUT])?;
4693                ClusterAlterUntilReadyOptionName::OnTimeout
4694            }
4695            TIMEOUT => ClusterAlterUntilReadyOptionName::Timeout,
4696            _ => unreachable!(),
4697        };
4698        let value = self.parse_optional_option_value()?;
4699        Ok(ClusterAlterUntilReadyOption { name, value })
4700    }
4701
4702    fn parse_cluster_option_replicas(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4703        let _ = self.consume_token(&Token::Eq);
4704        self.expect_token(&Token::LParen)?;
4705        let replicas = if self.consume_token(&Token::RParen) {
4706            vec![]
4707        } else {
4708            let replicas = self.parse_comma_separated(|parser| {
4709                let name = parser.parse_identifier()?;
4710                parser.expect_token(&Token::LParen)?;
4711                let options = parser.parse_comma_separated(Parser::parse_replica_option)?;
4712                parser.expect_token(&Token::RParen)?;
4713                Ok(ReplicaDefinition { name, options })
4714            })?;
4715            self.expect_token(&Token::RParen)?;
4716            replicas
4717        };
4718        Ok(ClusterOption {
4719            name: ClusterOptionName::Replicas,
4720            value: Some(WithOptionValue::ClusterReplicas(replicas)),
4721        })
4722    }
4723
4724    fn parse_cluster_option_schedule(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4725        let _ = self.consume_token(&Token::Eq);
4726        let kw = self.expect_one_of_keywords(&[MANUAL, ON])?;
4727        let value = match kw {
4728            MANUAL => ClusterScheduleOptionValue::Manual,
4729            ON => {
4730                self.expect_keyword(REFRESH)?;
4731                // Parse optional `(HYDRATION TIME ESTIMATE ...)`
4732                let hydration_time_estimate = if self.consume_token(&Token::LParen) {
4733                    self.expect_keywords(&[HYDRATION, TIME, ESTIMATE])?;
4734                    let _ = self.consume_token(&Token::Eq);
4735                    let interval = self.parse_interval_value()?;
4736                    self.expect_token(&Token::RParen)?;
4737                    Some(interval)
4738                } else {
4739                    None
4740                };
4741                ClusterScheduleOptionValue::Refresh {
4742                    hydration_time_estimate,
4743                }
4744            }
4745            _ => unreachable!(),
4746        };
4747        Ok(ClusterOption {
4748            name: ClusterOptionName::Schedule,
4749            value: Some(WithOptionValue::ClusterScheduleOptionValue(value)),
4750        })
4751    }
4752
4753    /// Parse the value of the `AUTO SCALING STRATEGY` cluster option: a
4754    /// paren-enclosed list of strategy sub-policies. v1 supports only
4755    /// `ON HYDRATION (HYDRATION SIZE = '...' [, LINGER DURATION = '...'])`. An
4756    /// empty list `()` disables autoscaling.
4757    fn parse_cluster_option_auto_scaling_strategy(
4758        &mut self,
4759    ) -> Result<ClusterOption<Raw>, ParserError> {
4760        let _ = self.consume_token(&Token::Eq);
4761        self.expect_token(&Token::LParen)?;
4762        let mut value = ClusterAutoScalingStrategyOptionValue { on_hydration: None };
4763        if !self.consume_token(&Token::RParen) {
4764            // The list is a comma-separated set of strategy sub-policies, each
4765            // named by a leading keyword. Only `ON HYDRATION` exists in v1.
4766            loop {
4767                self.expect_keywords(&[ON, HYDRATION])?;
4768                self.expect_token(&Token::LParen)?;
4769                self.expect_keywords(&[HYDRATION, SIZE])?;
4770                let _ = self.consume_token(&Token::Eq);
4771                let hydration_size = self.parse_value()?;
4772                let linger_duration = if self.consume_token(&Token::Comma) {
4773                    self.expect_keywords(&[LINGER, DURATION])?;
4774                    let _ = self.consume_token(&Token::Eq);
4775                    Some(self.parse_value()?)
4776                } else {
4777                    None
4778                };
4779                self.expect_token(&Token::RParen)?;
4780                // Each sub-policy may appear at most once; a repeated entry would
4781                // otherwise silently keep only the last.
4782                if value.on_hydration.is_some() {
4783                    return parser_err!(
4784                        self,
4785                        self.peek_prev_pos(),
4786                        "ON HYDRATION specified more than once"
4787                    );
4788                }
4789                value.on_hydration = Some(OnHydrationOptionValue {
4790                    hydration_size,
4791                    linger_duration,
4792                });
4793                if !self.consume_token(&Token::Comma) {
4794                    break;
4795                }
4796            }
4797            self.expect_token(&Token::RParen)?;
4798        }
4799        Ok(ClusterOption {
4800            name: ClusterOptionName::AutoScalingStrategy,
4801            value: Some(WithOptionValue::ClusterAutoScalingStrategyOptionValue(
4802                value,
4803            )),
4804        })
4805    }
4806
4807    fn parse_replica_option(&mut self) -> Result<ReplicaOption<Raw>, ParserError> {
4808        let name = match self.expect_one_of_keywords(&[
4809            AVAILABILITY,
4810            BILLED,
4811            COMPUTE,
4812            COMPUTECTL,
4813            DISK,
4814            EXPERIMENTAL,
4815            INTERNAL,
4816            INTROSPECTION,
4817            SIZE,
4818            STORAGE,
4819            STORAGECTL,
4820            WORKERS,
4821        ])? {
4822            AVAILABILITY => {
4823                self.expect_keyword(ZONE)?;
4824                ReplicaOptionName::AvailabilityZone
4825            }
4826            BILLED => {
4827                self.expect_keyword(AS)?;
4828                ReplicaOptionName::BilledAs
4829            }
4830            COMPUTE => {
4831                self.expect_keyword(ADDRESSES)?;
4832                ReplicaOptionName::ComputeAddresses
4833            }
4834            COMPUTECTL => {
4835                self.expect_keyword(ADDRESSES)?;
4836                ReplicaOptionName::ComputectlAddresses
4837            }
4838            DISK => ReplicaOptionName::Disk,
4839            EXPERIMENTAL => {
4840                self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4841                ReplicaOptionName::ExperimentalArrangementCompression
4842            }
4843            INTERNAL => ReplicaOptionName::Internal,
4844            INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4845                DEBUGGING => ReplicaOptionName::IntrospectionDebugging,
4846                INTERVAL => ReplicaOptionName::IntrospectionInterval,
4847                _ => unreachable!(),
4848            },
4849            SIZE => ReplicaOptionName::Size,
4850            STORAGE => {
4851                self.expect_keyword(ADDRESSES)?;
4852                ReplicaOptionName::StorageAddresses
4853            }
4854            STORAGECTL => {
4855                self.expect_keyword(ADDRESSES)?;
4856                ReplicaOptionName::StoragectlAddresses
4857            }
4858            WORKERS => ReplicaOptionName::Workers,
4859            _ => unreachable!(),
4860        };
4861        let value = self.parse_optional_option_value()?;
4862        Ok(ReplicaOption { name, value })
4863    }
4864
4865    fn parse_cluster_feature(&mut self) -> Result<ClusterFeature<Raw>, ParserError> {
4866        Ok(ClusterFeature {
4867            name: self.parse_cluster_feature_name()?,
4868            value: self.parse_optional_option_value()?,
4869        })
4870    }
4871
4872    fn parse_create_cluster_replica(&mut self) -> Result<Statement<Raw>, ParserError> {
4873        self.next_token();
4874        let of_cluster = self.parse_identifier()?;
4875        self.expect_token(&Token::Dot)?;
4876        let name = self.parse_identifier()?;
4877        // For historical reasons, the parentheses around the options can be
4878        // omitted.
4879        let paren = self.consume_token(&Token::LParen);
4880        let options = self.parse_comma_separated(Parser::parse_replica_option)?;
4881        if paren {
4882            let _ = self.consume_token(&Token::RParen);
4883        }
4884        Ok(Statement::CreateClusterReplica(
4885            CreateClusterReplicaStatement {
4886                of_cluster,
4887                definition: ReplicaDefinition { name, options },
4888            },
4889        ))
4890    }
4891
4892    fn parse_if_exists(&mut self) -> Result<bool, ParserError> {
4893        if self.parse_keyword(IF) {
4894            self.expect_keyword(EXISTS)?;
4895            Ok(true)
4896        } else {
4897            Ok(false)
4898        }
4899    }
4900
4901    fn parse_if_not_exists(&mut self) -> Result<bool, ParserError> {
4902        if self.parse_keyword(IF) {
4903            self.expect_keywords(&[NOT, EXISTS])?;
4904            Ok(true)
4905        } else {
4906            Ok(false)
4907        }
4908    }
4909
4910    fn parse_alias(&mut self) -> Result<Option<Ident>, ParserError> {
4911        self.parse_keyword(AS)
4912            .then(|| self.parse_identifier())
4913            .transpose()
4914    }
4915
4916    fn parse_source_include_metadata(&mut self) -> Result<Vec<SourceIncludeMetadata>, ParserError> {
4917        if self.parse_keyword(INCLUDE) {
4918            self.parse_comma_separated(|parser| {
4919                let metadata = match parser
4920                    .expect_one_of_keywords(&[KEY, TIMESTAMP, PARTITION, OFFSET, HEADERS, HEADER])?
4921                {
4922                    KEY => SourceIncludeMetadata::Key {
4923                        alias: parser.parse_alias()?,
4924                    },
4925                    TIMESTAMP => SourceIncludeMetadata::Timestamp {
4926                        alias: parser.parse_alias()?,
4927                    },
4928                    PARTITION => SourceIncludeMetadata::Partition {
4929                        alias: parser.parse_alias()?,
4930                    },
4931                    OFFSET => SourceIncludeMetadata::Offset {
4932                        alias: parser.parse_alias()?,
4933                    },
4934                    HEADERS => SourceIncludeMetadata::Headers {
4935                        alias: parser.parse_alias()?,
4936                    },
4937                    HEADER => {
4938                        let key: String = parser.parse_literal_string()?;
4939                        parser.expect_keyword(AS)?;
4940                        let alias = parser.parse_identifier()?;
4941                        let use_bytes = parser.parse_keyword(BYTES);
4942                        SourceIncludeMetadata::Header {
4943                            alias,
4944                            key,
4945                            use_bytes,
4946                        }
4947                    }
4948                    _ => unreachable!("only explicitly allowed items can be parsed"),
4949                };
4950                Ok(metadata)
4951            })
4952        } else {
4953            Ok(vec![])
4954        }
4955    }
4956
4957    fn parse_discard(&mut self) -> Result<Statement<Raw>, ParserError> {
4958        let target = match self.expect_one_of_keywords(&[ALL, PLANS, SEQUENCES, TEMP, TEMPORARY])? {
4959            ALL => DiscardTarget::All,
4960            PLANS => DiscardTarget::Plans,
4961            SEQUENCES => DiscardTarget::Sequences,
4962            TEMP | TEMPORARY => DiscardTarget::Temp,
4963            _ => unreachable!(),
4964        };
4965        Ok(Statement::Discard(DiscardStatement { target }))
4966    }
4967
4968    fn parse_drop(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
4969        if self.parse_keyword(OWNED) {
4970            self.parse_drop_owned()
4971                .map_parser_err(StatementKind::DropOwned)
4972        } else {
4973            self.parse_drop_objects()
4974                .map_parser_err(StatementKind::DropObjects)
4975        }
4976    }
4977
4978    fn parse_drop_objects(&mut self) -> Result<Statement<Raw>, ParserError> {
4979        let object_type = self.expect_object_type()?;
4980        let if_exists = self.parse_if_exists()?;
4981        match object_type {
4982            ObjectType::Database => {
4983                let name = UnresolvedObjectName::Database(self.parse_database_name()?);
4984                let restrict = matches!(
4985                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4986                    Some(RESTRICT),
4987                );
4988                Ok(Statement::DropObjects(DropObjectsStatement {
4989                    object_type: ObjectType::Database,
4990                    if_exists,
4991                    names: vec![name],
4992                    cascade: !restrict,
4993                }))
4994            }
4995            ObjectType::Schema => {
4996                let names = self.parse_comma_separated(|parser| {
4997                    Ok(UnresolvedObjectName::Schema(parser.parse_schema_name()?))
4998                })?;
4999
5000                let cascade = matches!(
5001                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5002                    Some(CASCADE),
5003                );
5004                Ok(Statement::DropObjects(DropObjectsStatement {
5005                    object_type: ObjectType::Schema,
5006                    if_exists,
5007                    names,
5008                    cascade,
5009                }))
5010            }
5011            ObjectType::Role => {
5012                let names = self.parse_comma_separated(|parser| {
5013                    Ok(UnresolvedObjectName::Role(parser.parse_identifier()?))
5014                })?;
5015                Ok(Statement::DropObjects(DropObjectsStatement {
5016                    object_type: ObjectType::Role,
5017                    if_exists,
5018                    names,
5019                    cascade: false,
5020                }))
5021            }
5022            ObjectType::NetworkPolicy => {
5023                let names = self.parse_comma_separated(|parser| {
5024                    Ok(UnresolvedObjectName::NetworkPolicy(
5025                        parser.parse_identifier()?,
5026                    ))
5027                })?;
5028                Ok(Statement::DropObjects(DropObjectsStatement {
5029                    object_type: ObjectType::NetworkPolicy,
5030                    if_exists,
5031                    names,
5032                    cascade: false,
5033                }))
5034            }
5035            ObjectType::Cluster => self.parse_drop_clusters(if_exists),
5036            ObjectType::ClusterReplica => self.parse_drop_cluster_replicas(if_exists),
5037            ObjectType::Table
5038            | ObjectType::View
5039            | ObjectType::MaterializedView
5040            | ObjectType::Source
5041            | ObjectType::Sink
5042            | ObjectType::Index
5043            | ObjectType::Type
5044            | ObjectType::Secret
5045            | ObjectType::Connection => {
5046                let names = self.parse_comma_separated(|parser| {
5047                    Ok(UnresolvedObjectName::Item(parser.parse_item_name()?))
5048                })?;
5049                let cascade = matches!(
5050                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5051                    Some(CASCADE),
5052                );
5053                Ok(Statement::DropObjects(DropObjectsStatement {
5054                    object_type,
5055                    if_exists,
5056                    names,
5057                    cascade,
5058                }))
5059            }
5060            ObjectType::Func | ObjectType::Subsource => parser_err!(
5061                self,
5062                self.peek_prev_pos(),
5063                format!("Unsupported DROP on {object_type}")
5064            ),
5065        }
5066    }
5067
5068    fn parse_drop_clusters(&mut self, if_exists: bool) -> Result<Statement<Raw>, ParserError> {
5069        let names = self.parse_comma_separated(|parser| {
5070            Ok(UnresolvedObjectName::Cluster(parser.parse_identifier()?))
5071        })?;
5072        let cascade = matches!(
5073            self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5074            Some(CASCADE),
5075        );
5076        Ok(Statement::DropObjects(DropObjectsStatement {
5077            object_type: ObjectType::Cluster,
5078            if_exists,
5079            names,
5080            cascade,
5081        }))
5082    }
5083
5084    fn parse_drop_cluster_replicas(
5085        &mut self,
5086        if_exists: bool,
5087    ) -> Result<Statement<Raw>, ParserError> {
5088        let names = self.parse_comma_separated(|p| {
5089            Ok(UnresolvedObjectName::ClusterReplica(
5090                p.parse_cluster_replica_name()?,
5091            ))
5092        })?;
5093        Ok(Statement::DropObjects(DropObjectsStatement {
5094            object_type: ObjectType::ClusterReplica,
5095            if_exists,
5096            names,
5097            cascade: false,
5098        }))
5099    }
5100
5101    fn parse_drop_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
5102        self.expect_keyword(BY)?;
5103        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
5104        let cascade = if self.parse_keyword(CASCADE) {
5105            Some(true)
5106        } else if self.parse_keyword(RESTRICT) {
5107            Some(false)
5108        } else {
5109            None
5110        };
5111        Ok(Statement::DropOwned(DropOwnedStatement {
5112            role_names,
5113            cascade,
5114        }))
5115    }
5116
5117    fn parse_cluster_replica_name(&mut self) -> Result<QualifiedReplica, ParserError> {
5118        let cluster = self.parse_identifier()?;
5119        self.expect_token(&Token::Dot)?;
5120        let replica = self.parse_identifier()?;
5121        Ok(QualifiedReplica { cluster, replica })
5122    }
5123
5124    fn parse_alter_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5125        let name = self.parse_identifier()?;
5126        self.expect_keyword(SET)?;
5127        self.expect_token(&Token::LParen)?;
5128        let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5129        self.expect_token(&Token::RParen)?;
5130        Ok(Statement::AlterNetworkPolicy(AlterNetworkPolicyStatement {
5131            name,
5132            options,
5133        }))
5134    }
5135
5136    fn parse_create_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5137        self.expect_keywords(&[NETWORK, POLICY])?;
5138        let name = self.parse_identifier()?;
5139        self.expect_token(&Token::LParen)?;
5140        let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5141        self.expect_token(&Token::RParen)?;
5142        Ok(Statement::CreateNetworkPolicy(
5143            CreateNetworkPolicyStatement { name, options },
5144        ))
5145    }
5146
5147    fn parse_network_policy_option(&mut self) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5148        let name = match self.expect_one_of_keywords(&[RULES])? {
5149            RULES => NetworkPolicyOptionName::Rules,
5150            v => panic!("found unreachable keyword {}", v),
5151        };
5152        match name {
5153            NetworkPolicyOptionName::Rules => self.parse_network_policy_option_rules(),
5154        }
5155    }
5156
5157    fn parse_network_policy_option_rules(
5158        &mut self,
5159    ) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5160        let _ = self.consume_token(&Token::Eq);
5161        self.expect_token(&Token::LParen)?;
5162        let rules = if self.consume_token(&Token::RParen) {
5163            vec![]
5164        } else {
5165            let rules = self.parse_comma_separated(|parser| {
5166                let name = parser.parse_identifier()?;
5167                parser.expect_token(&Token::LParen)?;
5168                let options =
5169                    parser.parse_comma_separated(Parser::parse_network_policy_rule_option)?;
5170                parser.expect_token(&Token::RParen)?;
5171                Ok(NetworkPolicyRuleDefinition { name, options })
5172            })?;
5173            self.expect_token(&Token::RParen)?;
5174            rules
5175        };
5176        Ok(NetworkPolicyOption {
5177            name: NetworkPolicyOptionName::Rules,
5178            value: Some(WithOptionValue::NetworkPolicyRules(rules)),
5179        })
5180    }
5181
5182    fn parse_network_policy_rule_option(
5183        &mut self,
5184    ) -> Result<NetworkPolicyRuleOption<Raw>, ParserError> {
5185        let name = match self.expect_one_of_keywords(&[ACTION, ADDRESS, DIRECTION])? {
5186            ACTION => NetworkPolicyRuleOptionName::Action,
5187            ADDRESS => NetworkPolicyRuleOptionName::Address,
5188            DIRECTION => NetworkPolicyRuleOptionName::Direction,
5189            v => panic!("found unreachable keyword {}", v),
5190        };
5191        let value = self.parse_optional_option_value()?;
5192        Ok(NetworkPolicyRuleOption { name, value })
5193    }
5194
5195    fn parse_create_table(&mut self) -> Result<Statement<Raw>, ParserError> {
5196        let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
5197        self.expect_keyword(TABLE)?;
5198        let if_not_exists = self.parse_if_not_exists()?;
5199        let table_name = self.parse_item_name()?;
5200        // parse optional column list (schema)
5201        let (columns, constraints) = self.parse_columns(Mandatory)?;
5202
5203        let with_options = if self.parse_keyword(WITH) {
5204            self.expect_token(&Token::LParen)?;
5205            let o = if matches!(self.peek_token(), Some(Token::RParen)) {
5206                vec![]
5207            } else {
5208                self.parse_comma_separated(Parser::parse_table_option)?
5209            };
5210            self.expect_token(&Token::RParen)?;
5211            o
5212        } else {
5213            vec![]
5214        };
5215
5216        Ok(Statement::CreateTable(CreateTableStatement {
5217            name: table_name,
5218            columns,
5219            constraints,
5220            if_not_exists,
5221            temporary,
5222            with_options,
5223        }))
5224    }
5225
5226    fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5227        if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5228            return parser_err!(
5229                self,
5230                self.peek_prev_pos(),
5231                "temporary tables FROM SOURCE are not supported"
5232            );
5233        }
5234        self.expect_keyword(TABLE)?;
5235        let if_not_exists = self.parse_if_not_exists()?;
5236        let table_name = self.parse_item_name()?;
5237
5238        if self.parse_keywords(&[FROM, WEBHOOK]) {
5239            // Webhook Source, which works differently than all other sources.
5240            return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5241        }
5242
5243        let (columns, constraints) = self.parse_table_from_source_columns()?;
5244
5245        self.expect_keywords(&[FROM, SOURCE])?;
5246
5247        let source = self.parse_raw_name()?;
5248
5249        let external_reference = if self.consume_token(&Token::LParen) {
5250            self.expect_keyword(REFERENCE)?;
5251            let _ = self.consume_token(&Token::Eq);
5252            let external_reference = self.parse_item_name()?;
5253            self.expect_token(&Token::RParen)?;
5254            Some(external_reference)
5255        } else {
5256            None
5257        };
5258
5259        let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5260            Some(KEY) => {
5261                self.expect_keyword(FORMAT)?;
5262                let key = self.parse_format()?;
5263                self.expect_keywords(&[VALUE, FORMAT])?;
5264                let value = self.parse_format()?;
5265                Some(FormatSpecifier::KeyValue { key, value })
5266            }
5267            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5268            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5269            None => None,
5270        };
5271        let include_metadata = self.parse_source_include_metadata()?;
5272
5273        let envelope = if self.parse_keyword(ENVELOPE) {
5274            Some(self.parse_source_envelope()?)
5275        } else {
5276            None
5277        };
5278
5279        let with_options = if self.parse_keyword(WITH) {
5280            self.expect_token(&Token::LParen)?;
5281            let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5282            self.expect_token(&Token::RParen)?;
5283            options
5284        } else {
5285            vec![]
5286        };
5287
5288        Ok(Statement::CreateTableFromSource(
5289            CreateTableFromSourceStatement {
5290                name: table_name,
5291                columns,
5292                constraints,
5293                if_not_exists,
5294                source,
5295                external_reference,
5296                format,
5297                include_metadata,
5298                envelope,
5299                with_options,
5300            },
5301        ))
5302    }
5303
5304    fn parse_table_from_source_option(
5305        &mut self,
5306    ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5307        let option = match self
5308            .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5309        {
5310            ref keyword @ (TEXT | EXCLUDE) => {
5311                self.expect_keyword(COLUMNS)?;
5312
5313                let _ = self.consume_token(&Token::Eq);
5314
5315                let value = self
5316                    .parse_option_sequence(Parser::parse_identifier)?
5317                    .map(|inner| {
5318                        WithOptionValue::Sequence(
5319                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5320                        )
5321                    });
5322
5323                TableFromSourceOption {
5324                    name: match *keyword {
5325                        TEXT => TableFromSourceOptionName::TextColumns,
5326                        EXCLUDE => TableFromSourceOptionName::ExcludeColumns,
5327                        _ => unreachable!(),
5328                    },
5329                    value,
5330                }
5331            }
5332            DETAILS => TableFromSourceOption {
5333                name: TableFromSourceOptionName::Details,
5334                value: self.parse_optional_option_value()?,
5335            },
5336            IGNORE => {
5337                self.expect_keyword(COLUMNS)?;
5338                let _ = self.consume_token(&Token::Eq);
5339
5340                let value = self
5341                    .parse_option_sequence(Parser::parse_identifier)?
5342                    .map(|inner| {
5343                        WithOptionValue::Sequence(
5344                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5345                        )
5346                    });
5347                TableFromSourceOption {
5348                    // IGNORE is historical syntax for this option.
5349                    name: TableFromSourceOptionName::ExcludeColumns,
5350                    value,
5351                }
5352            }
5353            PARTITION => {
5354                self.expect_keyword(BY)?;
5355                TableFromSourceOption {
5356                    name: TableFromSourceOptionName::PartitionBy,
5357                    value: self.parse_optional_option_value()?,
5358                }
5359            }
5360            RETAIN => {
5361                self.expect_keyword(HISTORY)?;
5362                TableFromSourceOption {
5363                    name: TableFromSourceOptionName::RetainHistory,
5364                    value: self.parse_option_retain_history()?,
5365                }
5366            }
5367            _ => unreachable!(),
5368        };
5369        Ok(option)
5370    }
5371
5372    fn parse_table_from_source_columns(
5373        &mut self,
5374    ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5375        let mut constraints = vec![];
5376
5377        if !self.consume_token(&Token::LParen) {
5378            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5379        }
5380        if self.consume_token(&Token::RParen) {
5381            // Tables with zero columns are a PostgreSQL extension.
5382            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5383        }
5384
5385        let mut column_names = vec![];
5386        let mut column_defs = vec![];
5387        loop {
5388            if let Some(constraint) = self.parse_optional_table_constraint()? {
5389                constraints.push(constraint);
5390            } else if let Some(column_name) = self.consume_identifier()? {
5391                let next_token = self.peek_token();
5392                match next_token {
5393                    Some(Token::Comma) | Some(Token::RParen) => {
5394                        column_names.push(column_name);
5395                    }
5396                    _ => {
5397                        let data_type = self.parse_data_type()?;
5398                        let collation = if self.parse_keyword(COLLATE) {
5399                            Some(self.parse_item_name()?)
5400                        } else {
5401                            None
5402                        };
5403                        let mut options = vec![];
5404                        loop {
5405                            match self.peek_token() {
5406                                None | Some(Token::Comma) | Some(Token::RParen) => break,
5407                                _ => options.push(self.parse_column_option_def()?),
5408                            }
5409                        }
5410
5411                        column_defs.push(ColumnDef {
5412                            name: column_name,
5413                            data_type,
5414                            collation,
5415                            options,
5416                        });
5417                    }
5418                }
5419            } else {
5420                return self.expected(
5421                    self.peek_pos(),
5422                    "column name or constraint definition",
5423                    self.peek_token(),
5424                );
5425            }
5426            if self.consume_token(&Token::Comma) {
5427                // Continue.
5428            } else if self.consume_token(&Token::RParen) {
5429                break;
5430            } else {
5431                return self.expected(
5432                    self.peek_pos(),
5433                    "',' or ')' after column definition",
5434                    self.peek_token(),
5435                );
5436            }
5437        }
5438        if !column_defs.is_empty() && !column_names.is_empty() {
5439            return parser_err!(
5440                self,
5441                self.peek_prev_pos(),
5442                "cannot mix column definitions and column names"
5443            );
5444        }
5445
5446        let columns = match column_defs.is_empty() {
5447            true => match column_names.is_empty() {
5448                true => TableFromSourceColumns::NotSpecified,
5449                false => TableFromSourceColumns::Named(column_names),
5450            },
5451            false => TableFromSourceColumns::Defined(column_defs),
5452        };
5453
5454        Ok((columns, constraints))
5455    }
5456
5457    fn parse_columns(
5458        &mut self,
5459        optional: IsOptional,
5460    ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5461        let mut columns = vec![];
5462        let mut constraints = vec![];
5463
5464        if !self.consume_token(&Token::LParen) {
5465            if optional == Optional {
5466                return Ok((columns, constraints));
5467            } else {
5468                return self.expected(
5469                    self.peek_pos(),
5470                    "a list of columns in parentheses",
5471                    self.peek_token(),
5472                );
5473            }
5474        }
5475        if self.consume_token(&Token::RParen) {
5476            // Tables with zero columns are a PostgreSQL extension.
5477            return Ok((columns, constraints));
5478        }
5479
5480        loop {
5481            if let Some(constraint) = self.parse_optional_table_constraint()? {
5482                constraints.push(constraint);
5483            } else if let Some(column_name) = self.consume_identifier()? {
5484                let data_type = self.parse_data_type()?;
5485                let collation = if self.parse_keyword(COLLATE) {
5486                    Some(self.parse_item_name()?)
5487                } else {
5488                    None
5489                };
5490                let mut options = vec![];
5491                loop {
5492                    match self.peek_token() {
5493                        None | Some(Token::Comma) | Some(Token::RParen) => break,
5494                        _ => options.push(self.parse_column_option_def()?),
5495                    }
5496                }
5497
5498                columns.push(ColumnDef {
5499                    name: column_name,
5500                    data_type,
5501                    collation,
5502                    options,
5503                });
5504            } else {
5505                return self.expected(
5506                    self.peek_pos(),
5507                    "column name or constraint definition",
5508                    self.peek_token(),
5509                );
5510            }
5511            if self.consume_token(&Token::Comma) {
5512                // Continue.
5513            } else if self.consume_token(&Token::RParen) {
5514                break;
5515            } else {
5516                return self.expected(
5517                    self.peek_pos(),
5518                    "',' or ')' after column definition",
5519                    self.peek_token(),
5520                );
5521            }
5522        }
5523
5524        Ok((columns, constraints))
5525    }
5526
5527    fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5528        let name = if self.parse_keyword(CONSTRAINT) {
5529            Some(self.parse_identifier()?)
5530        } else {
5531            None
5532        };
5533
5534        let option = if self.parse_keywords(&[NOT, NULL]) {
5535            ColumnOption::NotNull
5536        } else if self.parse_keyword(NULL) {
5537            ColumnOption::Null
5538        } else if self.parse_keyword(DEFAULT) {
5539            ColumnOption::Default(self.parse_expr()?)
5540        } else if self.parse_keywords(&[PRIMARY, KEY]) {
5541            ColumnOption::Unique { is_primary: true }
5542        } else if self.parse_keyword(UNIQUE) {
5543            ColumnOption::Unique { is_primary: false }
5544        } else if self.parse_keyword(REFERENCES) {
5545            let foreign_table = self.parse_item_name()?;
5546            let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5547            ColumnOption::ForeignKey {
5548                foreign_table,
5549                referred_columns,
5550            }
5551        } else if self.parse_keyword(CHECK) {
5552            self.expect_token(&Token::LParen)?;
5553            let expr = self.parse_expr()?;
5554            self.expect_token(&Token::RParen)?;
5555            ColumnOption::Check(expr)
5556        } else if self.parse_keyword(VERSION) {
5557            self.expect_keyword(ADDED)?;
5558            let action = ColumnVersioned::Added;
5559            let version = self.parse_version()?;
5560
5561            ColumnOption::Versioned { action, version }
5562        } else {
5563            return self.expected(self.peek_pos(), "column option", self.peek_token());
5564        };
5565
5566        Ok(ColumnOptionDef { name, option })
5567    }
5568
5569    fn parse_optional_table_constraint(
5570        &mut self,
5571    ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5572        let name = if self.parse_keyword(CONSTRAINT) {
5573            Some(self.parse_identifier()?)
5574        } else {
5575            None
5576        };
5577        match self.next_token() {
5578            Some(Token::Keyword(PRIMARY)) => {
5579                self.expect_keyword(KEY)?;
5580                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5581                Ok(Some(TableConstraint::Unique {
5582                    name,
5583                    columns,
5584                    is_primary: true,
5585                    nulls_not_distinct: false,
5586                }))
5587            }
5588            Some(Token::Keyword(UNIQUE)) => {
5589                let nulls_not_distinct = if self.parse_keyword(NULLS) {
5590                    self.expect_keywords(&[NOT, DISTINCT])?;
5591                    true
5592                } else {
5593                    false
5594                };
5595
5596                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5597                Ok(Some(TableConstraint::Unique {
5598                    name,
5599                    columns,
5600                    is_primary: false,
5601                    nulls_not_distinct,
5602                }))
5603            }
5604            Some(Token::Keyword(FOREIGN)) => {
5605                self.expect_keyword(KEY)?;
5606                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5607                self.expect_keyword(REFERENCES)?;
5608                let foreign_table = self.parse_raw_name()?;
5609                let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5610                Ok(Some(TableConstraint::ForeignKey {
5611                    name,
5612                    columns,
5613                    foreign_table,
5614                    referred_columns,
5615                }))
5616            }
5617            Some(Token::Keyword(CHECK)) => {
5618                self.expect_token(&Token::LParen)?;
5619                let expr = Box::new(self.parse_expr()?);
5620                self.expect_token(&Token::RParen)?;
5621                Ok(Some(TableConstraint::Check { name, expr }))
5622            }
5623            unexpected => {
5624                if name.is_some() {
5625                    self.expected(
5626                        self.peek_prev_pos(),
5627                        "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5628                        unexpected,
5629                    )
5630                } else {
5631                    self.prev_token();
5632                    Ok(None)
5633                }
5634            }
5635        }
5636    }
5637
5638    fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5639        let _ = self.consume_token(&Token::Eq);
5640        Ok(WithOptionValue::Item(self.parse_raw_name()?))
5641    }
5642
5643    fn parse_optional_connection_credential_option_value(
5644        &mut self,
5645    ) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5646        match self.peek_token() {
5647            Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5648            _ => {
5649                let _ = self.consume_token(&Token::Eq);
5650                Ok(Some(self.parse_connection_credential_option_value()?))
5651            }
5652        }
5653    }
5654
5655    fn parse_connection_credential_option_value(
5656        &mut self,
5657    ) -> Result<WithOptionValue<Raw>, ParserError> {
5658        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::Value(Value::String("secret".to_string())))
5663            }
5664        } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5665            Ok(WithOptionValue::Value(value))
5666        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
5667            Ok(WithOptionValue::Value(Value::String(ident.into_string())))
5668        } else {
5669            self.expected(
5670                self.peek_pos(),
5671                "connection credential value",
5672                self.peek_token(),
5673            )
5674        }
5675    }
5676
5677    fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5678        // The next token might be a value and might not. The only valid things
5679        // that indicate no value would be `)` for end-of-options , `,` for
5680        // another-option, or ';'/nothing for end-of-statement. Either of those
5681        // means there's no value, anything else means we expect a valid value.
5682        match self.peek_token() {
5683            Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5684            _ => {
5685                let _ = self.consume_token(&Token::Eq);
5686                Ok(Some(self.parse_option_value()?))
5687            }
5688        }
5689    }
5690
5691    fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5692    where
5693        F: FnMut(&mut Self) -> Result<T, ParserError>,
5694    {
5695        Ok(if self.consume_token(&Token::LParen) {
5696            let options = if self.consume_token(&Token::RParen) {
5697                vec![]
5698            } else {
5699                let options = self.parse_comma_separated(f)?;
5700                self.expect_token(&Token::RParen)?;
5701                options
5702            };
5703
5704            Some(options)
5705        } else if self.consume_token(&Token::LBracket) {
5706            let options = if self.consume_token(&Token::RBracket) {
5707                vec![]
5708            } else {
5709                let options = self.parse_comma_separated(f)?;
5710
5711                self.expect_token(&Token::RBracket)?;
5712                options
5713            };
5714
5715            Some(options)
5716        } else {
5717            None
5718        })
5719    }
5720
5721    fn parse_option_map(
5722        &mut self,
5723    ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5724        Ok(if self.parse_keyword(MAP) {
5725            self.expect_token(&Token::LBracket)?;
5726            let mut map = BTreeMap::new();
5727            loop {
5728                if let Some(Token::RBracket) = self.peek_token() {
5729                    break;
5730                }
5731                let key = match self.next_token() {
5732                    Some(Token::String(s)) => s,
5733                    token => return self.expected(self.peek_pos(), "string", token),
5734                };
5735                self.expect_token(&Token::Arrow)?;
5736                let value = Parser::parse_option_value(self)?;
5737                map.insert(key, value);
5738                if !self.consume_token(&Token::Comma) {
5739                    break;
5740                }
5741            }
5742            self.expect_token(&Token::RBracket)?;
5743            Some(map)
5744        } else {
5745            None
5746        })
5747    }
5748
5749    fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5750        if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5751            Ok(WithOptionValue::Sequence(seq))
5752        } else if let Some(map) = self.parse_option_map()? {
5753            Ok(WithOptionValue::Map(map))
5754        } else if self.parse_keyword(SECRET) {
5755            if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5756                Ok(WithOptionValue::Secret(secret))
5757            } else {
5758                Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5759                    vec![ident!("secret")],
5760                )))
5761            }
5762        } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5763            Ok(WithOptionValue::Value(value))
5764        } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5765            Ok(WithOptionValue::UnresolvedItemName(item_name))
5766        } else {
5767            self.expected(self.peek_pos(), "option value", self.peek_token())
5768        }
5769    }
5770
5771    fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5772        let _ = self.consume_token(&Token::Eq);
5773        Ok(WithOptionValue::DataType(self.parse_data_type()?))
5774    }
5775
5776    fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5777        if self.parse_keyword(SYSTEM) {
5778            self.parse_alter_system()
5779        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5780            self.parse_alter_default_privileges()
5781                .map_parser_err(StatementKind::AlterDefaultPrivileges)
5782        } else {
5783            self.parse_alter_object()
5784        }
5785    }
5786
5787    fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5788        let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5789
5790        match object_type {
5791            ObjectType::Role => self
5792                .parse_alter_role()
5793                .map_parser_err(StatementKind::AlterRole),
5794            ObjectType::Sink => self.parse_alter_sink(),
5795            ObjectType::Source => self.parse_alter_source(),
5796            ObjectType::Index => self.parse_alter_index(),
5797            ObjectType::Secret => self.parse_alter_secret(),
5798            ObjectType::Connection => self.parse_alter_connection(),
5799            ObjectType::View | ObjectType::MaterializedView | ObjectType::Table => {
5800                self.parse_alter_views(object_type)
5801            }
5802            ObjectType::Type => {
5803                let if_exists = self
5804                    .parse_if_exists()
5805                    .map_parser_err(StatementKind::AlterOwner)?;
5806                let name = UnresolvedObjectName::Item(
5807                    self.parse_item_name()
5808                        .map_parser_err(StatementKind::AlterOwner)?,
5809                );
5810                self.expect_keywords(&[OWNER, TO])
5811                    .map_parser_err(StatementKind::AlterOwner)?;
5812                let new_owner = self
5813                    .parse_identifier()
5814                    .map_parser_err(StatementKind::AlterOwner)?;
5815                Ok(Statement::AlterOwner(AlterOwnerStatement {
5816                    object_type,
5817                    if_exists,
5818                    name,
5819                    new_owner,
5820                }))
5821            }
5822            ObjectType::Cluster => self.parse_alter_cluster(object_type),
5823            ObjectType::ClusterReplica => {
5824                let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5825                let name = UnresolvedObjectName::ClusterReplica(
5826                    self.parse_cluster_replica_name()
5827                        .map_no_statement_parser_err()?,
5828                );
5829                let action = self
5830                    .expect_one_of_keywords(&[OWNER, RENAME])
5831                    .map_no_statement_parser_err()?;
5832                self.expect_keyword(TO).map_no_statement_parser_err()?;
5833                match action {
5834                    OWNER => {
5835                        let new_owner = self
5836                            .parse_identifier()
5837                            .map_parser_err(StatementKind::AlterOwner)?;
5838                        Ok(Statement::AlterOwner(AlterOwnerStatement {
5839                            object_type,
5840                            if_exists,
5841                            name,
5842                            new_owner,
5843                        }))
5844                    }
5845                    RENAME => {
5846                        let to_item_name = self
5847                            .parse_identifier()
5848                            .map_parser_err(StatementKind::AlterObjectRename)?;
5849                        Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5850                            object_type,
5851                            if_exists,
5852                            name,
5853                            to_item_name,
5854                        }))
5855                    }
5856                    _ => unreachable!(),
5857                }
5858            }
5859            ObjectType::Database => {
5860                let if_exists = self
5861                    .parse_if_exists()
5862                    .map_parser_err(StatementKind::AlterOwner)?;
5863                let name = UnresolvedObjectName::Database(
5864                    self.parse_database_name()
5865                        .map_parser_err(StatementKind::AlterOwner)?,
5866                );
5867                self.expect_keywords(&[OWNER, TO])
5868                    .map_parser_err(StatementKind::AlterOwner)?;
5869                let new_owner = self
5870                    .parse_identifier()
5871                    .map_parser_err(StatementKind::AlterOwner)?;
5872                Ok(Statement::AlterOwner(AlterOwnerStatement {
5873                    object_type,
5874                    if_exists,
5875                    name,
5876                    new_owner,
5877                }))
5878            }
5879            ObjectType::Schema => self.parse_alter_schema(object_type),
5880            ObjectType::NetworkPolicy => self
5881                .parse_alter_network_policy()
5882                .map_parser_err(StatementKind::AlterNetworkPolicy),
5883            ObjectType::Func | ObjectType::Subsource => parser_err!(
5884                self,
5885                self.peek_prev_pos(),
5886                format!("Unsupported ALTER on {object_type}")
5887            )
5888            .map_no_statement_parser_err(),
5889        }
5890    }
5891
5892    fn parse_alter_cluster(
5893        &mut self,
5894        object_type: ObjectType,
5895    ) -> Result<Statement<Raw>, ParserStatementError> {
5896        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5897        let name = self.parse_identifier().map_no_statement_parser_err()?;
5898        let action = self
5899            .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
5900            .map_no_statement_parser_err()?;
5901        match action {
5902            OWNER => {
5903                self.expect_keyword(TO)
5904                    .map_parser_err(StatementKind::AlterOwner)?;
5905                let new_owner = self
5906                    .parse_identifier()
5907                    .map_parser_err(StatementKind::AlterOwner)?;
5908                let name = UnresolvedObjectName::Cluster(name);
5909                Ok(Statement::AlterOwner(AlterOwnerStatement {
5910                    object_type,
5911                    if_exists,
5912                    name,
5913                    new_owner,
5914                }))
5915            }
5916            RENAME => {
5917                self.expect_keyword(TO)
5918                    .map_parser_err(StatementKind::AlterObjectRename)?;
5919                let to_item_name = self
5920                    .parse_identifier()
5921                    .map_parser_err(StatementKind::AlterObjectRename)?;
5922                let name = UnresolvedObjectName::Cluster(name);
5923                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5924                    object_type,
5925                    if_exists,
5926                    name,
5927                    to_item_name,
5928                }))
5929            }
5930            RESET => {
5931                self.expect_token(&Token::LParen)
5932                    .map_parser_err(StatementKind::AlterCluster)?;
5933                let names = self
5934                    .parse_comma_separated(Parser::parse_cluster_option_name)
5935                    .map_parser_err(StatementKind::AlterCluster)?;
5936                self.expect_token(&Token::RParen)
5937                    .map_parser_err(StatementKind::AlterCluster)?;
5938                Ok(Statement::AlterCluster(AlterClusterStatement {
5939                    if_exists,
5940                    name,
5941                    action: AlterClusterAction::ResetOptions(names),
5942                }))
5943            }
5944            SET => {
5945                self.expect_token(&Token::LParen)
5946                    .map_parser_err(StatementKind::AlterCluster)?;
5947                let options = self
5948                    .parse_comma_separated(Parser::parse_cluster_option)
5949                    .map_parser_err(StatementKind::AlterCluster)?;
5950                self.expect_token(&Token::RParen)
5951                    .map_parser_err(StatementKind::AlterCluster)?;
5952                let with_options = if self.parse_keyword(WITH) {
5953                    self.expect_token(&Token::LParen)
5954                        .map_parser_err(StatementKind::AlterCluster)?;
5955                    let options = self
5956                        .parse_comma_separated(Parser::parse_alter_cluster_option)
5957                        .map_parser_err(StatementKind::AlterCluster)?;
5958                    self.expect_token(&Token::RParen)
5959                        .map_parser_err(StatementKind::AlterCluster)?;
5960                    options
5961                } else {
5962                    vec![]
5963                };
5964                Ok(Statement::AlterCluster(AlterClusterStatement {
5965                    if_exists,
5966                    name,
5967                    action: AlterClusterAction::SetOptions {
5968                        options,
5969                        with_options,
5970                    },
5971                }))
5972            }
5973            SWAP => {
5974                self.expect_keyword(WITH)
5975                    .map_parser_err(StatementKind::AlterObjectSwap)?;
5976                let name_b = self
5977                    .parse_identifier()
5978                    .map_parser_err(StatementKind::AlterObjectSwap)?;
5979
5980                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
5981                    object_type,
5982                    if_exists,
5983                    name_a: UnresolvedObjectName::Cluster(name),
5984                    name_b,
5985                }))
5986            }
5987            _ => unreachable!(),
5988        }
5989    }
5990
5991    fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5992        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5993        let source_name = self.parse_item_name().map_no_statement_parser_err()?;
5994
5995        Ok(
5996            match self
5997                .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
5998                .map_no_statement_parser_err()?
5999            {
6000                ADD => {
6001                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6002                        .map_parser_err(StatementKind::AlterSource)?;
6003
6004                    // TODO: Add IF NOT EXISTS?
6005                    let subsources = self
6006                        .parse_comma_separated(Parser::parse_subsource_references)
6007                        .map_parser_err(StatementKind::AlterSource)?;
6008
6009                    let options = if self.parse_keyword(WITH) {
6010                        self.expect_token(&Token::LParen)
6011                            .map_parser_err(StatementKind::AlterSource)?;
6012                        let options = self
6013                            .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
6014                            .map_parser_err(StatementKind::AlterSource)?;
6015                        self.expect_token(&Token::RParen)
6016                            .map_parser_err(StatementKind::AlterSource)?;
6017                        options
6018                    } else {
6019                        vec![]
6020                    };
6021
6022                    Statement::AlterSource(AlterSourceStatement {
6023                        source_name,
6024                        if_exists,
6025                        action: AlterSourceAction::AddSubsources {
6026                            external_references: subsources,
6027                            options,
6028                        },
6029                    })
6030                }
6031                DROP => {
6032                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6033                        .map_parser_err(StatementKind::AlterSource)?;
6034
6035                    let if_exists_inner = self
6036                        .parse_if_exists()
6037                        .map_parser_err(StatementKind::AlterSource)?;
6038
6039                    let names = self
6040                        .parse_comma_separated(Parser::parse_item_name)
6041                        .map_parser_err(StatementKind::AlterSource)?;
6042
6043                    let cascade = matches!(
6044                        self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
6045                            .map_parser_err(StatementKind::AlterSource)?,
6046                        Some(CASCADE),
6047                    );
6048
6049                    Statement::AlterSource(AlterSourceStatement {
6050                        source_name,
6051                        if_exists,
6052                        action: AlterSourceAction::DropSubsources {
6053                            if_exists: if_exists_inner,
6054                            cascade,
6055                            names,
6056                        },
6057                    })
6058                }
6059                RESET => {
6060                    self.expect_token(&Token::LParen)
6061                        .map_parser_err(StatementKind::AlterSource)?;
6062                    let reset_options = self
6063                        .parse_comma_separated(Parser::parse_source_option_name)
6064                        .map_parser_err(StatementKind::AlterSource)?;
6065                    self.expect_token(&Token::RParen)
6066                        .map_parser_err(StatementKind::AlterSource)?;
6067
6068                    Statement::AlterSource(AlterSourceStatement {
6069                        source_name,
6070                        if_exists,
6071                        action: AlterSourceAction::ResetOptions(reset_options),
6072                    })
6073                }
6074                SET => {
6075                    if let Some(stmt) = self.maybe_parse_alter_set_cluster(
6076                        if_exists,
6077                        &source_name,
6078                        ObjectType::Source,
6079                    ) {
6080                        return stmt;
6081                    }
6082                    self.expect_token(&Token::LParen)
6083                        .map_parser_err(StatementKind::AlterSource)?;
6084                    let set_options = self
6085                        .parse_comma_separated(Parser::parse_source_option)
6086                        .map_parser_err(StatementKind::AlterSource)?;
6087                    self.expect_token(&Token::RParen)
6088                        .map_parser_err(StatementKind::AlterSource)?;
6089                    Statement::AlterSource(AlterSourceStatement {
6090                        source_name,
6091                        if_exists,
6092                        action: AlterSourceAction::SetOptions(set_options),
6093                    })
6094                }
6095                RENAME => {
6096                    self.expect_keyword(TO)
6097                        .map_parser_err(StatementKind::AlterObjectRename)?;
6098                    let to_item_name = self
6099                        .parse_identifier()
6100                        .map_parser_err(StatementKind::AlterObjectRename)?;
6101
6102                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6103                        object_type: ObjectType::Source,
6104                        if_exists,
6105                        name: UnresolvedObjectName::Item(source_name),
6106                        to_item_name,
6107                    })
6108                }
6109                OWNER => {
6110                    self.expect_keyword(TO)
6111                        .map_parser_err(StatementKind::AlterOwner)?;
6112                    let new_owner = self
6113                        .parse_identifier()
6114                        .map_parser_err(StatementKind::AlterOwner)?;
6115
6116                    Statement::AlterOwner(AlterOwnerStatement {
6117                        object_type: ObjectType::Source,
6118                        if_exists,
6119                        name: UnresolvedObjectName::Item(source_name),
6120                        new_owner,
6121                    })
6122                }
6123                REFRESH => {
6124                    self.expect_keyword(REFERENCES)
6125                        .map_parser_err(StatementKind::AlterSource)?;
6126                    Statement::AlterSource(AlterSourceStatement {
6127                        source_name,
6128                        if_exists,
6129                        action: AlterSourceAction::RefreshReferences,
6130                    })
6131                }
6132                _ => unreachable!(),
6133            },
6134        )
6135    }
6136
6137    fn parse_alter_source_add_subsource_option(
6138        &mut self,
6139    ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6140        match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6141            ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6142                self.expect_keyword(COLUMNS)?;
6143
6144                let _ = self.consume_token(&Token::Eq);
6145
6146                let value = self
6147                    .parse_option_sequence(Parser::parse_item_name)?
6148                    .map(|inner| {
6149                        WithOptionValue::Sequence(
6150                            inner
6151                                .into_iter()
6152                                .map(WithOptionValue::UnresolvedItemName)
6153                                .collect_vec(),
6154                        )
6155                    });
6156
6157                Ok(AlterSourceAddSubsourceOption {
6158                    name: match *keyword {
6159                        TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6160                        // IGNORE is historical syntax for this option.
6161                        EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6162                        _ => unreachable!(),
6163                    },
6164                    value,
6165                })
6166            }
6167            _ => unreachable!(),
6168        }
6169    }
6170
6171    fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6172        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6173        let name = self.parse_item_name().map_no_statement_parser_err()?;
6174
6175        Ok(
6176            match self
6177                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6178                .map_no_statement_parser_err()?
6179            {
6180                RESET => {
6181                    self.expect_token(&Token::LParen)
6182                        .map_parser_err(StatementKind::AlterIndex)?;
6183                    let reset_options = self
6184                        .parse_comma_separated(Parser::parse_index_option_name)
6185                        .map_parser_err(StatementKind::AlterIndex)?;
6186                    self.expect_token(&Token::RParen)
6187                        .map_parser_err(StatementKind::AlterIndex)?;
6188
6189                    Statement::AlterIndex(AlterIndexStatement {
6190                        index_name: name,
6191                        if_exists,
6192                        action: AlterIndexAction::ResetOptions(reset_options),
6193                    })
6194                }
6195                SET => {
6196                    self.expect_token(&Token::LParen)
6197                        .map_parser_err(StatementKind::AlterIndex)?;
6198                    let set_options = self
6199                        .parse_comma_separated(Parser::parse_index_option)
6200                        .map_parser_err(StatementKind::AlterIndex)?;
6201                    self.expect_token(&Token::RParen)
6202                        .map_parser_err(StatementKind::AlterIndex)?;
6203                    Statement::AlterIndex(AlterIndexStatement {
6204                        index_name: name,
6205                        if_exists,
6206                        action: AlterIndexAction::SetOptions(set_options),
6207                    })
6208                }
6209                RENAME => {
6210                    self.expect_keyword(TO)
6211                        .map_parser_err(StatementKind::AlterObjectRename)?;
6212                    let to_item_name = self
6213                        .parse_identifier()
6214                        .map_parser_err(StatementKind::AlterObjectRename)?;
6215
6216                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6217                        object_type: ObjectType::Index,
6218                        if_exists,
6219                        name: UnresolvedObjectName::Item(name),
6220                        to_item_name,
6221                    })
6222                }
6223                OWNER => {
6224                    self.expect_keyword(TO)
6225                        .map_parser_err(StatementKind::AlterOwner)?;
6226                    let new_owner = self
6227                        .parse_identifier()
6228                        .map_parser_err(StatementKind::AlterOwner)?;
6229
6230                    Statement::AlterOwner(AlterOwnerStatement {
6231                        object_type: ObjectType::Index,
6232                        if_exists,
6233                        name: UnresolvedObjectName::Item(name),
6234                        new_owner,
6235                    })
6236                }
6237                _ => unreachable!(),
6238            },
6239        )
6240    }
6241
6242    fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6243        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6244        let name = self.parse_item_name().map_no_statement_parser_err()?;
6245
6246        Ok(
6247            match self
6248                .expect_one_of_keywords(&[AS, RENAME, OWNER])
6249                .map_no_statement_parser_err()?
6250            {
6251                AS => {
6252                    let value = self
6253                        .parse_expr()
6254                        .map_parser_err(StatementKind::AlterSecret)?;
6255                    Statement::AlterSecret(AlterSecretStatement {
6256                        name,
6257                        if_exists,
6258                        value,
6259                    })
6260                }
6261                RENAME => {
6262                    self.expect_keyword(TO)
6263                        .map_parser_err(StatementKind::AlterObjectRename)?;
6264                    let to_item_name = self
6265                        .parse_identifier()
6266                        .map_parser_err(StatementKind::AlterObjectRename)?;
6267
6268                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6269                        object_type: ObjectType::Secret,
6270                        if_exists,
6271                        name: UnresolvedObjectName::Item(name),
6272                        to_item_name,
6273                    })
6274                }
6275                OWNER => {
6276                    self.expect_keyword(TO)
6277                        .map_parser_err(StatementKind::AlterOwner)?;
6278                    let new_owner = self
6279                        .parse_identifier()
6280                        .map_parser_err(StatementKind::AlterOwner)?;
6281
6282                    Statement::AlterOwner(AlterOwnerStatement {
6283                        object_type: ObjectType::Secret,
6284                        if_exists,
6285                        name: UnresolvedObjectName::Item(name),
6286                        new_owner,
6287                    })
6288                }
6289                _ => unreachable!(),
6290            },
6291        )
6292    }
6293
6294    /// Parse an ALTER SINK statement.
6295    fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6296        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6297        let name = self.parse_item_name().map_no_statement_parser_err()?;
6298
6299        Ok(
6300            match self
6301                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6302                .map_no_statement_parser_err()?
6303            {
6304                RESET => {
6305                    self.expect_token(&Token::LParen)
6306                        .map_parser_err(StatementKind::AlterSink)?;
6307                    let reset_options = self
6308                        .parse_comma_separated(Parser::parse_create_sink_option_name)
6309                        .map_parser_err(StatementKind::AlterSink)?;
6310                    self.expect_token(&Token::RParen)
6311                        .map_parser_err(StatementKind::AlterSink)?;
6312
6313                    Statement::AlterSink(AlterSinkStatement {
6314                        sink_name: name,
6315                        if_exists,
6316                        action: AlterSinkAction::ResetOptions(reset_options),
6317                    })
6318                }
6319                SET => {
6320                    if let Some(result) =
6321                        self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6322                    {
6323                        return result;
6324                    }
6325
6326                    if self.parse_keyword(FROM) {
6327                        let from = self
6328                            .parse_raw_name()
6329                            .map_parser_err(StatementKind::AlterSink)?;
6330
6331                        Statement::AlterSink(AlterSinkStatement {
6332                            sink_name: name,
6333                            if_exists,
6334                            action: AlterSinkAction::ChangeRelation(from),
6335                        })
6336                    } else {
6337                        self.expect_token(&Token::LParen)
6338                            .map_parser_err(StatementKind::AlterSink)?;
6339                        let set_options = self
6340                            .parse_comma_separated(Parser::parse_create_sink_option)
6341                            .map_parser_err(StatementKind::AlterSink)?;
6342                        self.expect_token(&Token::RParen)
6343                            .map_parser_err(StatementKind::AlterSink)?;
6344                        Statement::AlterSink(AlterSinkStatement {
6345                            sink_name: name,
6346                            if_exists,
6347                            action: AlterSinkAction::SetOptions(set_options),
6348                        })
6349                    }
6350                }
6351                RENAME => {
6352                    self.expect_keyword(TO)
6353                        .map_parser_err(StatementKind::AlterObjectRename)?;
6354                    let to_item_name = self
6355                        .parse_identifier()
6356                        .map_parser_err(StatementKind::AlterObjectRename)?;
6357
6358                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6359                        object_type: ObjectType::Sink,
6360                        if_exists,
6361                        name: UnresolvedObjectName::Item(name),
6362                        to_item_name,
6363                    })
6364                }
6365                OWNER => {
6366                    self.expect_keyword(TO)
6367                        .map_parser_err(StatementKind::AlterOwner)?;
6368                    let new_owner = self
6369                        .parse_identifier()
6370                        .map_parser_err(StatementKind::AlterOwner)?;
6371
6372                    Statement::AlterOwner(AlterOwnerStatement {
6373                        object_type: ObjectType::Sink,
6374                        if_exists,
6375                        name: UnresolvedObjectName::Item(name),
6376                        new_owner,
6377                    })
6378                }
6379                _ => unreachable!(),
6380            },
6381        )
6382    }
6383
6384    /// Parse an ALTER SYSTEM statement.
6385    fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6386        match self
6387            .expect_one_of_keywords(&[SET, RESET])
6388            .map_no_statement_parser_err()?
6389        {
6390            SET => {
6391                let name = self
6392                    .parse_identifier()
6393                    .map_parser_err(StatementKind::AlterSystemSet)?;
6394                self.expect_keyword_or_token(TO, &Token::Eq)
6395                    .map_parser_err(StatementKind::AlterSystemSet)?;
6396                let to = self
6397                    .parse_set_variable_to()
6398                    .map_parser_err(StatementKind::AlterSystemSet)?;
6399                Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6400                    name,
6401                    to,
6402                }))
6403            }
6404            RESET => {
6405                if self.parse_keyword(ALL) {
6406                    Ok(Statement::AlterSystemResetAll(
6407                        AlterSystemResetAllStatement {},
6408                    ))
6409                } else {
6410                    let name = self
6411                        .parse_identifier()
6412                        .map_parser_err(StatementKind::AlterSystemReset)?;
6413                    Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6414                        name,
6415                    }))
6416                }
6417            }
6418            _ => unreachable!(),
6419        }
6420    }
6421
6422    fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6423        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6424        let name = self.parse_item_name().map_no_statement_parser_err()?;
6425
6426        Ok(
6427            match self
6428                .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6429                .map_no_statement_parser_err()?
6430            {
6431                RENAME => {
6432                    self.expect_keyword(TO)
6433                        .map_parser_err(StatementKind::AlterObjectRename)?;
6434                    let to_item_name = self
6435                        .parse_identifier()
6436                        .map_parser_err(StatementKind::AlterObjectRename)?;
6437
6438                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6439                        object_type: ObjectType::Connection,
6440                        if_exists,
6441                        name: UnresolvedObjectName::Item(name),
6442                        to_item_name,
6443                    })
6444                }
6445                OWNER => {
6446                    self.expect_keyword(TO)
6447                        .map_parser_err(StatementKind::AlterOwner)?;
6448                    let new_owner = self
6449                        .parse_identifier()
6450                        .map_parser_err(StatementKind::AlterOwner)?;
6451
6452                    Statement::AlterOwner(AlterOwnerStatement {
6453                        object_type: ObjectType::Connection,
6454                        if_exists,
6455                        name: UnresolvedObjectName::Item(name),
6456                        new_owner,
6457                    })
6458                }
6459                _ => {
6460                    self.prev_token();
6461                    let actions = self
6462                        .parse_comma_separated(Parser::parse_alter_connection_action)
6463                        .map_parser_err(StatementKind::AlterConnection)?;
6464
6465                    let with_options = if self.parse_keyword(WITH) {
6466                        self.expect_token(&Token::LParen)
6467                            .map_parser_err(StatementKind::AlterConnection)?;
6468                        let options = self
6469                            .parse_comma_separated(Parser::parse_alter_connection_option)
6470                            .map_parser_err(StatementKind::AlterConnection)?;
6471                        self.expect_token(&Token::RParen)
6472                            .map_parser_err(StatementKind::AlterConnection)?;
6473                        options
6474                    } else {
6475                        vec![]
6476                    };
6477
6478                    Statement::AlterConnection(AlterConnectionStatement {
6479                        name,
6480                        if_exists,
6481                        actions,
6482                        with_options,
6483                    })
6484                }
6485            },
6486        )
6487    }
6488
6489    fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6490        let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6491            ROTATE => {
6492                self.expect_keyword(KEYS)?;
6493                AlterConnectionAction::RotateKeys
6494            }
6495            SET => {
6496                self.expect_token(&Token::LParen)?;
6497                let option = self.parse_connection_option_unified()?;
6498                self.expect_token(&Token::RParen)?;
6499                AlterConnectionAction::SetOption(option)
6500            }
6501            DROP | RESET => {
6502                self.expect_token(&Token::LParen)?;
6503                let option = self.parse_connection_option_name()?;
6504                self.expect_token(&Token::RParen)?;
6505                AlterConnectionAction::DropOption(option)
6506            }
6507            _ => unreachable!(),
6508        };
6509
6510        Ok(r)
6511    }
6512
6513    /// Parses a single valid option in the WITH block of a create source
6514    fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6515        let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6516            VALIDATE => AlterConnectionOptionName::Validate,
6517            _ => unreachable!(),
6518        };
6519
6520        Ok(AlterConnectionOption {
6521            name,
6522            value: self.parse_optional_option_value()?,
6523        })
6524    }
6525
6526    fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6527        let name = self.parse_identifier()?;
6528
6529        let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6530            Some(SET) => {
6531                let name = self.parse_identifier()?;
6532                self.expect_keyword_or_token(TO, &Token::Eq)?;
6533                let value = self.parse_set_variable_to()?;
6534                let var = SetRoleVar::Set { name, value };
6535                AlterRoleOption::Variable(var)
6536            }
6537            Some(RESET) => {
6538                let name = self.parse_identifier()?;
6539                let var = SetRoleVar::Reset { name };
6540                AlterRoleOption::Variable(var)
6541            }
6542            Some(WITH) | None => {
6543                let _ = self.parse_keyword(WITH);
6544                let attrs = self.parse_role_attributes()?;
6545                AlterRoleOption::Attributes(attrs)
6546            }
6547            Some(k) => unreachable!("unmatched keyword: {k}"),
6548        };
6549
6550        Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6551    }
6552
6553    fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6554        self.expect_keyword(FOR)?;
6555        let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6556            ROLE | USER => TargetRoleSpecification::Roles(
6557                self.parse_comma_separated(Parser::parse_identifier)?,
6558            ),
6559            ALL => {
6560                self.expect_keyword(ROLES)?;
6561                TargetRoleSpecification::AllRoles
6562            }
6563            _ => unreachable!(),
6564        };
6565        let target_objects = if self.parse_keyword(IN) {
6566            match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6567                SCHEMA => GrantTargetAllSpecification::AllSchemas {
6568                    schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6569                },
6570                DATABASE => GrantTargetAllSpecification::AllDatabases {
6571                    databases: self.parse_comma_separated(Parser::parse_database_name)?,
6572                },
6573                _ => unreachable!(),
6574            }
6575        } else {
6576            GrantTargetAllSpecification::All
6577        };
6578        let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6579        let privileges = self.parse_privilege_specification().ok_or_else(|| {
6580            self.expected::<_, PrivilegeSpecification>(
6581                self.peek_pos(),
6582                "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6583                self.peek_token(),
6584            )
6585            .expect_err("only returns errors")
6586        })?;
6587        self.expect_keyword(ON)?;
6588        let object_type =
6589            self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6590        if is_grant {
6591            self.expect_keyword(TO)?;
6592        } else {
6593            self.expect_keyword(FROM)?;
6594        }
6595        let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6596
6597        let grant_or_revoke = if is_grant {
6598            AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6599                privileges,
6600                object_type,
6601                grantees,
6602            })
6603        } else {
6604            AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6605                privileges,
6606                object_type,
6607                revokees: grantees,
6608            })
6609        };
6610
6611        Ok(Statement::AlterDefaultPrivileges(
6612            AlterDefaultPrivilegesStatement {
6613                target_roles,
6614                target_objects,
6615                grant_or_revoke,
6616            },
6617        ))
6618    }
6619
6620    fn parse_alter_views(
6621        &mut self,
6622        object_type: ObjectType,
6623    ) -> Result<Statement<Raw>, ParserStatementError> {
6624        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6625        let name = self.parse_item_name().map_no_statement_parser_err()?;
6626        let keywords: &[_] = match object_type {
6627            ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6628            ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6629            ObjectType::View => &[SET, RENAME, OWNER, RESET],
6630            ObjectType::Source
6631            | ObjectType::Sink
6632            | ObjectType::Index
6633            | ObjectType::Type
6634            | ObjectType::Role
6635            | ObjectType::Cluster
6636            | ObjectType::ClusterReplica
6637            | ObjectType::Secret
6638            | ObjectType::Connection
6639            | ObjectType::Database
6640            | ObjectType::Schema
6641            | ObjectType::Func
6642            | ObjectType::Subsource
6643            | ObjectType::NetworkPolicy => {
6644                unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6645            }
6646        };
6647
6648        let action = self
6649            .expect_one_of_keywords(keywords)
6650            .map_no_statement_parser_err()?;
6651        match action {
6652            RENAME => {
6653                self.expect_keyword(TO).map_no_statement_parser_err()?;
6654                let to_item_name = self
6655                    .parse_identifier()
6656                    .map_parser_err(StatementKind::AlterObjectRename)?;
6657                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6658                    object_type,
6659                    if_exists,
6660                    name: UnresolvedObjectName::Item(name),
6661                    to_item_name,
6662                }))
6663            }
6664            SET => {
6665                if self.parse_keyword(CLUSTER) {
6666                    self.parse_alter_set_cluster(if_exists, name, object_type)
6667                } else {
6668                    self.expect_token(&Token::LParen)
6669                        .map_no_statement_parser_err()?;
6670                    self.expect_keywords(&[RETAIN, HISTORY])
6671                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6672                    let history = self
6673                        .parse_retain_history()
6674                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6675                    self.expect_token(&Token::RParen)
6676                        .map_parser_err(StatementKind::AlterCluster)?;
6677                    Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6678                        object_type,
6679                        if_exists,
6680                        name: UnresolvedObjectName::Item(name),
6681                        history: Some(history),
6682                    }))
6683                }
6684            }
6685            RESET => {
6686                self.expect_token(&Token::LParen)
6687                    .map_no_statement_parser_err()?;
6688                self.expect_keywords(&[RETAIN, HISTORY])
6689                    .map_parser_err(StatementKind::AlterRetainHistory)?;
6690                self.expect_token(&Token::RParen)
6691                    .map_no_statement_parser_err()?;
6692                Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6693                    object_type,
6694                    if_exists,
6695                    name: UnresolvedObjectName::Item(name),
6696                    history: None,
6697                }))
6698            }
6699            OWNER => {
6700                self.expect_keyword(TO).map_no_statement_parser_err()?;
6701                let new_owner = self
6702                    .parse_identifier()
6703                    .map_parser_err(StatementKind::AlterOwner)?;
6704                Ok(Statement::AlterOwner(AlterOwnerStatement {
6705                    object_type,
6706                    if_exists,
6707                    name: UnresolvedObjectName::Item(name),
6708                    new_owner,
6709                }))
6710            }
6711            ADD => {
6712                assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6713
6714                self.expect_keyword(COLUMN)
6715                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6716                let if_col_not_exist = self
6717                    .parse_if_not_exists()
6718                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6719                let column_name = self
6720                    .parse_identifier()
6721                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6722                let data_type = self
6723                    .parse_data_type()
6724                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6725
6726                Ok(Statement::AlterTableAddColumn(
6727                    AlterTableAddColumnStatement {
6728                        if_exists,
6729                        name,
6730                        if_col_not_exist,
6731                        column_name,
6732                        data_type,
6733                    },
6734                ))
6735            }
6736            APPLY => {
6737                assert_eq!(
6738                    object_type,
6739                    ObjectType::MaterializedView,
6740                    "checked object_type above",
6741                );
6742
6743                self.expect_keyword(REPLACEMENT)
6744                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6745
6746                let replacement_name = self
6747                    .parse_item_name()
6748                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6749
6750                Ok(Statement::AlterMaterializedViewApplyReplacement(
6751                    AlterMaterializedViewApplyReplacementStatement {
6752                        if_exists,
6753                        name,
6754                        replacement_name,
6755                    },
6756                ))
6757            }
6758            _ => unreachable!(),
6759        }
6760    }
6761
6762    fn parse_alter_schema(
6763        &mut self,
6764        object_type: ObjectType,
6765    ) -> Result<Statement<Raw>, ParserStatementError> {
6766        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6767        let name = self.parse_schema_name().map_no_statement_parser_err()?;
6768        let name = UnresolvedObjectName::Schema(name);
6769        let action = self
6770            .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6771            .map_no_statement_parser_err()?;
6772
6773        match action {
6774            OWNER => {
6775                self.expect_keyword(TO)
6776                    .map_parser_err(StatementKind::AlterOwner)?;
6777                let new_owner = self
6778                    .parse_identifier()
6779                    .map_parser_err(StatementKind::AlterOwner)?;
6780
6781                Ok(Statement::AlterOwner(AlterOwnerStatement {
6782                    object_type,
6783                    if_exists,
6784                    name,
6785                    new_owner,
6786                }))
6787            }
6788            RENAME => {
6789                self.expect_keyword(TO)
6790                    .map_parser_err(StatementKind::AlterObjectRename)?;
6791                let to_item_name = self
6792                    .parse_identifier()
6793                    .map_parser_err(StatementKind::AlterObjectRename)?;
6794
6795                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6796                    object_type,
6797                    if_exists,
6798                    name,
6799                    to_item_name,
6800                }))
6801            }
6802            SWAP => {
6803                self.expect_keyword(WITH)
6804                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6805                let name_b = self
6806                    .parse_identifier()
6807                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6808
6809                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6810                    object_type,
6811                    if_exists,
6812                    name_a: name,
6813                    name_b,
6814                }))
6815            }
6816            k => unreachable!("programming error, unmatched {k}"),
6817        }
6818    }
6819
6820    /// Parses `CLUSTER name` fragments into a [`AlterSetClusterStatement`] if `CLUSTER` is found.
6821    fn maybe_parse_alter_set_cluster(
6822        &mut self,
6823        if_exists: bool,
6824        name: &UnresolvedItemName,
6825        object_type: ObjectType,
6826    ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6827        if self.parse_keyword(CLUSTER) {
6828            Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6829        } else {
6830            None
6831        }
6832    }
6833
6834    /// Parses `IN CLUSTER name` fragments into a [`AlterSetClusterStatement`].
6835    fn parse_alter_set_cluster(
6836        &mut self,
6837        if_exists: bool,
6838        name: UnresolvedItemName,
6839        object_type: ObjectType,
6840    ) -> Result<Statement<Raw>, ParserStatementError> {
6841        let set_cluster = self
6842            .parse_raw_ident()
6843            .map_parser_err(StatementKind::AlterSetCluster)?;
6844        Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6845            name,
6846            if_exists,
6847            set_cluster,
6848            object_type,
6849        }))
6850    }
6851
6852    /// Parse a copy statement
6853    fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6854        // We support an optional "INTO" keyword for COPY INTO <table> FROM
6855        let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
6856            Some(self.peek_prev_pos())
6857        } else {
6858            None
6859        };
6860
6861        let relation = if self.consume_token(&Token::LParen) {
6862            let query = self.parse_statement()?.ast;
6863            self.expect_token(&Token::RParen)
6864                .map_parser_err(StatementKind::Copy)?;
6865            match query {
6866                Statement::Select(stmt) => CopyRelation::Select(stmt),
6867                Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
6868                _ => {
6869                    return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
6870                        .map_parser_err(StatementKind::Copy);
6871                }
6872            }
6873        } else {
6874            let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
6875            let columns = self
6876                .parse_parenthesized_column_list(Optional)
6877                .map_parser_err(StatementKind::Copy)?;
6878            CopyRelation::Named { name, columns }
6879        };
6880        let (direction, target) = match self
6881            .expect_one_of_keywords(&[FROM, TO])
6882            .map_parser_err(StatementKind::Copy)?
6883        {
6884            FROM => {
6885                if let CopyRelation::Named { .. } = relation {
6886                    // Ok.
6887                } else {
6888                    return parser_err!(
6889                        self,
6890                        self.peek_prev_pos(),
6891                        "queries not allowed in COPY FROM"
6892                    )
6893                    .map_no_statement_parser_err();
6894                }
6895                if self.parse_keyword(STDIN) {
6896                    (CopyDirection::From, CopyTarget::Stdin)
6897                } else {
6898                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6899                    (CopyDirection::From, CopyTarget::Expr(url_expr))
6900                }
6901            }
6902            TO => {
6903                // We only support the INTO keyword for 'COPY FROM'.
6904                if let Some(into_pos) = maybe_into_pos {
6905                    return self
6906                        .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
6907                        .map_parser_err(StatementKind::Copy);
6908                }
6909
6910                if self.parse_keyword(STDOUT) {
6911                    (CopyDirection::To, CopyTarget::Stdout)
6912                } else {
6913                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6914                    (CopyDirection::To, CopyTarget::Expr(url_expr))
6915                }
6916            }
6917            _ => unreachable!(),
6918        };
6919        // WITH must be followed by LParen. The WITH in COPY is optional for backward
6920        // compat with Postgres but is required elsewhere, which is why we don't use
6921        // parse_with_options here.
6922        let has_options = if self.parse_keyword(WITH) {
6923            self.expect_token(&Token::LParen)
6924                .map_parser_err(StatementKind::Copy)?;
6925            true
6926        } else {
6927            self.consume_token(&Token::LParen)
6928        };
6929        let options = if has_options {
6930            let o = self
6931                .parse_comma_separated(Parser::parse_copy_option)
6932                .map_parser_err(StatementKind::Copy)?;
6933            self.expect_token(&Token::RParen)
6934                .map_parser_err(StatementKind::Copy)?;
6935            o
6936        } else {
6937            vec![]
6938        };
6939        Ok(Statement::Copy(CopyStatement {
6940            relation,
6941            direction,
6942            target,
6943            options,
6944        }))
6945    }
6946
6947    fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
6948        let name = match self.expect_one_of_keywords(&[
6949            FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
6950        ])? {
6951            FORMAT => CopyOptionName::Format,
6952            DELIMITER => CopyOptionName::Delimiter,
6953            NULL => CopyOptionName::Null,
6954            ESCAPE => CopyOptionName::Escape,
6955            QUOTE => CopyOptionName::Quote,
6956            HEADER => CopyOptionName::Header,
6957            AWS => {
6958                self.expect_keyword(CONNECTION)?;
6959                return Ok(CopyOption {
6960                    name: CopyOptionName::AwsConnection,
6961                    value: Some(self.parse_object_option_value()?),
6962                });
6963            }
6964            MAX => {
6965                self.expect_keywords(&[FILE, SIZE])?;
6966                CopyOptionName::MaxFileSize
6967            }
6968            FILES => CopyOptionName::Files,
6969            PATTERN => CopyOptionName::Pattern,
6970            _ => unreachable!(),
6971        };
6972        Ok(CopyOption {
6973            name,
6974            value: self.parse_optional_option_value()?,
6975        })
6976    }
6977
6978    /// Parse a literal value (numbers, strings, date/time, booleans)
6979    fn parse_value(&mut self) -> Result<Value, ParserError> {
6980        match self.next_token() {
6981            Some(t) => match t {
6982                Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
6983                Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
6984                Token::Keyword(NULL) => Ok(Value::Null),
6985                Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
6986                Token::Keyword(kw) => {
6987                    parser_err!(
6988                        self,
6989                        self.peek_prev_pos(),
6990                        format!("No value parser for keyword {}", kw)
6991                    )
6992                }
6993                Token::Op(ref op) if op == "-" => match self.next_token() {
6994                    Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
6995                    other => self.expected(self.peek_prev_pos(), "literal int", other),
6996                },
6997                Token::Number(ref n) => Ok(Value::Number(n.to_string())),
6998                Token::String(ref s) => Ok(Value::String(s.to_string())),
6999                Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
7000                _ => parser_err!(
7001                    self,
7002                    self.peek_prev_pos(),
7003                    format!("Unsupported value: {:?}", t)
7004                ),
7005            },
7006            None => parser_err!(
7007                self,
7008                self.peek_prev_pos(),
7009                "Expecting a value, but found EOF"
7010            ),
7011        }
7012    }
7013
7014    fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
7015        if self.consume_token(&Token::LParen) {
7016            let subquery = self.parse_query()?;
7017            self.expect_token(&Token::RParen)?;
7018            Ok(Expr::ArraySubquery(Box::new(subquery)))
7019        } else {
7020            self.parse_sequence(Self::parse_array).map(Expr::Array)
7021        }
7022    }
7023
7024    fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
7025        if self.consume_token(&Token::LParen) {
7026            let subquery = self.parse_query()?;
7027            self.expect_token(&Token::RParen)?;
7028            Ok(Expr::ListSubquery(Box::new(subquery)))
7029        } else {
7030            self.parse_sequence(Self::parse_list).map(Expr::List)
7031        }
7032    }
7033
7034    fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
7035        if self.consume_token(&Token::LParen) {
7036            let subquery = self.parse_query()?;
7037            self.expect_token(&Token::RParen)?;
7038            return Ok(Expr::MapSubquery(Box::new(subquery)));
7039        }
7040
7041        self.expect_token(&Token::LBracket)?;
7042        let mut exprs = vec![];
7043        loop {
7044            if let Some(Token::RBracket) = self.peek_token() {
7045                break;
7046            }
7047            let key = self.parse_expr()?;
7048            self.expect_token(&Token::Arrow)?;
7049            let value = if let Some(Token::LBracket) = self.peek_token() {
7050                self.parse_map()?
7051            } else {
7052                self.parse_expr()?
7053            };
7054            exprs.push(MapEntry { key, value });
7055            if !self.consume_token(&Token::Comma) {
7056                break;
7057            }
7058        }
7059        self.expect_token(&Token::RBracket)?;
7060        Ok(Expr::Map(exprs))
7061    }
7062
7063    fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
7064    where
7065        F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
7066    {
7067        self.expect_token(&Token::LBracket)?;
7068        let mut exprs = vec![];
7069        loop {
7070            if let Some(Token::RBracket) = self.peek_token() {
7071                break;
7072            }
7073            let expr = if let Some(Token::LBracket) = self.peek_token() {
7074                f(self)?
7075            } else {
7076                self.parse_expr()?
7077            };
7078            exprs.push(expr);
7079            if !self.consume_token(&Token::Comma) {
7080                break;
7081            }
7082        }
7083        self.expect_token(&Token::RBracket)?;
7084        Ok(exprs)
7085    }
7086
7087    fn parse_number_value(&mut self) -> Result<Value, ParserError> {
7088        match self.parse_value()? {
7089            v @ Value::Number(_) => Ok(v),
7090            _ => {
7091                self.prev_token();
7092                self.expected(self.peek_pos(), "literal number", self.peek_token())
7093            }
7094        }
7095    }
7096
7097    fn parse_version(&mut self) -> Result<Version, ParserError> {
7098        let version = self.parse_literal_uint()?;
7099        Ok(Version(version))
7100    }
7101
7102    /// Parse a signed literal integer.
7103    fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
7104        let negative = self.consume_token(&Token::Op("-".into()));
7105        match self.next_token() {
7106            Some(Token::Number(s)) => {
7107                let n = s.parse::<i64>().map_err(|e| {
7108                    self.error(
7109                        self.peek_prev_pos(),
7110                        format!("Could not parse '{}' as i64: {}", s, e),
7111                    )
7112                })?;
7113                if negative {
7114                    n.checked_neg().ok_or_else(|| {
7115                        self.error(
7116                            self.peek_prev_pos(),
7117                            format!("Could not parse '{}' as i64: overflows i64", s),
7118                        )
7119                    })
7120                } else {
7121                    Ok(n)
7122                }
7123            }
7124            other => self.expected(self.peek_prev_pos(), "literal integer", other),
7125        }
7126    }
7127
7128    /// Parse an unsigned literal integer.
7129    fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7130        match self.next_token() {
7131            Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7132                self.error(
7133                    self.peek_prev_pos(),
7134                    format!("Could not parse '{}' as u64: {}", s, e),
7135                )
7136            }),
7137            other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7138        }
7139    }
7140
7141    /// Parse a literal string
7142    fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7143        match self.next_token() {
7144            Some(Token::String(ref s)) => Ok(s.clone()),
7145            other => self.expected(self.peek_prev_pos(), "literal string", other),
7146        }
7147    }
7148
7149    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
7150    fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7151        let other = |ident| RawDataType::Other {
7152            name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7153            typ_mod: vec![],
7154        };
7155
7156        let mut data_type = match self.next_token() {
7157            Some(Token::Keyword(kw)) => match kw {
7158                // Text-like types
7159                CHAR | CHARACTER => {
7160                    let name = if self.parse_keyword(VARYING) {
7161                        ident!("varchar")
7162                    } else {
7163                        ident!("bpchar")
7164                    };
7165                    RawDataType::Other {
7166                        name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7167                        typ_mod: self.parse_typ_mod()?,
7168                    }
7169                }
7170                BPCHAR => RawDataType::Other {
7171                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7172                    typ_mod: self.parse_typ_mod()?,
7173                },
7174                VARCHAR => RawDataType::Other {
7175                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7176                    typ_mod: self.parse_typ_mod()?,
7177                },
7178                STRING => other(ident!("text")),
7179
7180                // Number-like types
7181                BIGINT => other(ident!("int8")),
7182                SMALLINT => other(ident!("int2")),
7183                DEC | DECIMAL => RawDataType::Other {
7184                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7185                    typ_mod: self.parse_typ_mod()?,
7186                },
7187                DOUBLE => {
7188                    let _ = self.parse_keyword(PRECISION);
7189                    other(ident!("float8"))
7190                }
7191                FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7192                    v if v == 0 || v > 53 => {
7193                        return Err(self.error(
7194                            self.peek_prev_pos(),
7195                            "precision for type float must be within ([1-53])".into(),
7196                        ));
7197                    }
7198                    v if v < 25 => other(ident!("float4")),
7199                    _ => other(ident!("float8")),
7200                },
7201                INT | INTEGER => other(ident!("int4")),
7202                REAL => other(ident!("float4")),
7203
7204                // Time-like types
7205                TIME => {
7206                    if self.parse_keyword(WITH) {
7207                        self.expect_keywords(&[TIME, ZONE])?;
7208                        other(ident!("timetz"))
7209                    } else {
7210                        if self.parse_keyword(WITHOUT) {
7211                            self.expect_keywords(&[TIME, ZONE])?;
7212                        }
7213                        other(ident!("time"))
7214                    }
7215                }
7216                TIMESTAMP => {
7217                    let typ_mod = self.parse_timestamp_precision()?;
7218                    if self.parse_keyword(WITH) {
7219                        self.expect_keywords(&[TIME, ZONE])?;
7220                        RawDataType::Other {
7221                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7222                                "timestamptz"
7223                            ))),
7224                            typ_mod,
7225                        }
7226                    } else {
7227                        if self.parse_keyword(WITHOUT) {
7228                            self.expect_keywords(&[TIME, ZONE])?;
7229                        }
7230                        RawDataType::Other {
7231                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7232                                "timestamp"
7233                            ))),
7234                            typ_mod,
7235                        }
7236                    }
7237                }
7238                TIMESTAMPTZ => {
7239                    let typ_mod = self.parse_timestamp_precision()?;
7240                    RawDataType::Other {
7241                        name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7242                            "timestamptz"
7243                        ))),
7244                        typ_mod,
7245                    }
7246                }
7247
7248                // MZ "proprietary" types
7249                MAP => {
7250                    return self.parse_map_type();
7251                }
7252
7253                // Misc.
7254                BOOLEAN => other(ident!("bool")),
7255                BYTES => other(ident!("bytea")),
7256                JSON => other(ident!("jsonb")),
7257
7258                // We do not want any reserved keywords to be parsed as data type names,
7259                // eg "CASE 'foo' WHEN ... END" should not parse as "CAST 'foo' AS CASE"
7260                kw if kw.is_sometimes_reserved() => {
7261                    return self.expected(
7262                        self.peek_prev_pos(),
7263                        "a data type name",
7264                        Some(Token::Keyword(kw)),
7265                    );
7266                }
7267                _ => {
7268                    self.prev_token();
7269                    RawDataType::Other {
7270                        name: RawItemName::Name(self.parse_item_name()?),
7271                        typ_mod: self.parse_typ_mod()?,
7272                    }
7273                }
7274            },
7275            Some(Token::Ident(_) | Token::LBracket) => {
7276                self.prev_token();
7277                RawDataType::Other {
7278                    name: self.parse_raw_name()?,
7279                    typ_mod: self.parse_typ_mod()?,
7280                }
7281            }
7282            other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7283        };
7284
7285        loop {
7286            match self.peek_token() {
7287                Some(Token::Keyword(LIST)) => {
7288                    self.next_token();
7289                    data_type = RawDataType::List(Box::new(data_type));
7290                }
7291                Some(Token::LBracket) => {
7292                    // Handle array suffixes. Note that `int[]`, `int[][][]`,
7293                    // and `int[2][2]` all parse to the same "int array" type.
7294                    self.next_token();
7295                    let _ = self.maybe_parse(|parser| parser.parse_number_value());
7296                    self.expect_token(&Token::RBracket)?;
7297                    if !matches!(data_type, RawDataType::Array(_)) {
7298                        data_type = RawDataType::Array(Box::new(data_type));
7299                    }
7300                }
7301                _ => break,
7302            }
7303        }
7304        Ok(data_type)
7305    }
7306
7307    fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7308        if self.consume_token(&Token::LParen) {
7309            let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7310            self.expect_token(&Token::RParen)?;
7311            Ok(typ_mod)
7312        } else {
7313            Ok(vec![])
7314        }
7315    }
7316
7317    // parses the precision in timestamp(<precision>) and timestamptz(<precision>)
7318    fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7319        if self.consume_token(&Token::LParen) {
7320            let typ_mod = self.parse_literal_int()?;
7321            self.expect_token(&Token::RParen)?;
7322            Ok(vec![typ_mod])
7323        } else {
7324            Ok(vec![])
7325        }
7326    }
7327
7328    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
7329    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
7330    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
7331    fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7332    where
7333        F: FnOnce(Keyword) -> bool,
7334    {
7335        let after_as = self.parse_keyword(AS);
7336        match self.next_token() {
7337            // Do not accept `AS OF`, which is reserved for providing timestamp information
7338            // to queries.
7339            Some(Token::Keyword(OF)) => {
7340                self.prev_token();
7341                if after_as {
7342                    self.prev_token();
7343                }
7344                Ok(None)
7345            }
7346            // Accept any other identifier after `AS` (though many dialects have restrictions on
7347            // keywords that may appear here). If there's no `AS`: don't parse keywords,
7348            // which may start a construct allowed in this position, to be parsed as aliases.
7349            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
7350            // not an alias.)
7351            Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7352            Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7353            not_an_ident => {
7354                if after_as {
7355                    return self.expected(
7356                        self.peek_prev_pos(),
7357                        "an identifier after AS",
7358                        not_an_ident,
7359                    );
7360                }
7361                self.prev_token();
7362                Ok(None) // no alias found
7363            }
7364        }
7365    }
7366
7367    /// Parse `AS identifier` when the AS is describing a table-valued object,
7368    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
7369    /// the alias is allowed to optionally name the columns in the table, in
7370    /// addition to the table itself.
7371    fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7372        match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7373            Some(name) => {
7374                let columns = self.parse_parenthesized_column_list(Optional)?;
7375                Ok(Some(TableAlias {
7376                    name,
7377                    columns,
7378                    strict: false,
7379                }))
7380            }
7381            None => Ok(None),
7382        }
7383    }
7384
7385    fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7386        Ok(match self.parse_raw_name()? {
7387            named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7388            RawItemName::Name(name) => DeferredItemName::Deferred(name),
7389        })
7390    }
7391
7392    fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7393        if self.consume_token(&Token::LBracket) {
7394            let id = match self.next_token() {
7395                Some(Token::Ident(id)) => id.into_inner(),
7396                _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7397            };
7398            self.expect_keyword(AS)?;
7399            let name = self.parse_item_name()?;
7400            // TODO(justin): is there a more idiomatic way to detect a fully-qualified name?
7401            if name.0.len() < 2 {
7402                return parser_err!(
7403                    self,
7404                    self.peek_prev_pos(),
7405                    "table name in square brackets must be fully qualified"
7406                );
7407            }
7408
7409            let version = if self.parse_keywords(&[VERSION]) {
7410                let version = self.parse_version()?;
7411                Some(version)
7412            } else {
7413                None
7414            };
7415
7416            self.expect_token(&Token::RBracket)?;
7417            Ok(RawItemName::Id(id, name, version))
7418        } else {
7419            Ok(RawItemName::Name(self.parse_item_name()?))
7420        }
7421    }
7422
7423    fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7424        let start = self.peek_pos();
7425        let mut item_name = self.parse_raw_name()?;
7426        let column_name = match &mut item_name {
7427            RawItemName::Name(UnresolvedItemName(identifiers)) => {
7428                if identifiers.len() < 2 {
7429                    return Err(ParserError::new(
7430                        start,
7431                        "need to specify an object and a column",
7432                    ));
7433                }
7434                identifiers.pop().unwrap()
7435            }
7436            RawItemName::Id(_, _, _) => {
7437                self.expect_token(&Token::Dot)?;
7438                self.parse_identifier()?
7439            }
7440        };
7441
7442        Ok(ColumnName {
7443            relation: item_name,
7444            column: column_name,
7445        })
7446    }
7447
7448    /// Parse a possibly quoted database identifier, e.g.
7449    /// `foo` or `"mydatabase"`
7450    fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7451        Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7452    }
7453
7454    /// Parse a possibly qualified, possibly quoted schema identifier, e.g.
7455    /// `foo` or `mydatabase."schema"`
7456    fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7457        Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7458    }
7459
7460    /// Parse a possibly qualified, possibly quoted object identifier, e.g.
7461    /// `foo` or `myschema."table"`
7462    fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7463        Ok(UnresolvedItemName(self.parse_identifiers()?))
7464    }
7465
7466    /// Parse an object name.
7467    fn parse_object_name(
7468        &mut self,
7469        object_type: ObjectType,
7470    ) -> Result<UnresolvedObjectName, ParserError> {
7471        Ok(match object_type {
7472            ObjectType::Table
7473            | ObjectType::View
7474            | ObjectType::MaterializedView
7475            | ObjectType::Source
7476            | ObjectType::Subsource
7477            | ObjectType::Sink
7478            | ObjectType::Index
7479            | ObjectType::Type
7480            | ObjectType::Secret
7481            | ObjectType::Connection
7482            | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7483            ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7484            ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7485            ObjectType::ClusterReplica => {
7486                UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7487            }
7488            ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7489            ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7490            ObjectType::NetworkPolicy => {
7491                UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7492            }
7493        })
7494    }
7495
7496    ///Parse one or more simple one-word identifiers separated by a '.'
7497    fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7498        let mut idents = vec![];
7499        loop {
7500            idents.push(self.parse_identifier()?);
7501            if !self.consume_token(&Token::Dot) {
7502                break;
7503            }
7504        }
7505        Ok(idents)
7506    }
7507
7508    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
7509    fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7510        match self.consume_identifier()? {
7511            Some(id) => {
7512                if id.as_str().is_empty() {
7513                    return parser_err!(
7514                        self,
7515                        self.peek_prev_pos(),
7516                        "zero-length delimited identifier",
7517                    );
7518                }
7519                Ok(id)
7520            }
7521            None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7522        }
7523    }
7524
7525    fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7526        match self.peek_token() {
7527            Some(Token::Keyword(kw)) => {
7528                self.next_token();
7529                Ok(Some(kw.into()))
7530            }
7531            Some(Token::Ident(id)) => {
7532                self.next_token();
7533                Ok(Some(self.new_identifier(id)?))
7534            }
7535            _ => Ok(None),
7536        }
7537    }
7538
7539    fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7540        let mut id_parts = vec![id];
7541        match self.peek_token() {
7542            Some(Token::LParen) | Some(Token::Dot) => {
7543                let mut ends_with_wildcard = false;
7544                while self.consume_token(&Token::Dot) {
7545                    match self.next_token() {
7546                        Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7547                        Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7548                        Some(Token::Star) => {
7549                            ends_with_wildcard = true;
7550                            break;
7551                        }
7552                        unexpected => {
7553                            return self.expected(
7554                                self.peek_prev_pos(),
7555                                "an identifier or a '*' after '.'",
7556                                unexpected,
7557                            );
7558                        }
7559                    }
7560                }
7561                if ends_with_wildcard {
7562                    Ok(Expr::QualifiedWildcard(id_parts))
7563                } else if self.peek_token() == Some(Token::LParen) {
7564                    let function =
7565                        self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7566                    Ok(Expr::Function(function))
7567                } else {
7568                    Ok(Expr::Identifier(id_parts))
7569                }
7570            }
7571            _ => Ok(Expr::Identifier(id_parts)),
7572        }
7573    }
7574
7575    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
7576    fn parse_parenthesized_column_list(
7577        &mut self,
7578        optional: IsOptional,
7579    ) -> Result<Vec<Ident>, ParserError> {
7580        if self.consume_token(&Token::LParen) {
7581            let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7582            self.expect_token(&Token::RParen)?;
7583            Ok(cols)
7584        } else if optional == Optional {
7585            Ok(vec![])
7586        } else {
7587            self.expected(
7588                self.peek_pos(),
7589                "a list of columns in parentheses",
7590                self.peek_token(),
7591            )
7592        }
7593    }
7594
7595    fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7596        if self.consume_token(&Token::LParen) {
7597            let n = self.parse_literal_uint()?;
7598            self.expect_token(&Token::RParen)?;
7599            Ok(Some(n))
7600        } else {
7601            Ok(None)
7602        }
7603    }
7604
7605    fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7606        self.expect_token(&Token::LBracket)?;
7607        let key_type = Box::new(self.parse_data_type()?);
7608        self.expect_token(&Token::Arrow)?;
7609        let value_type = Box::new(self.parse_data_type()?);
7610        self.expect_token(&Token::RBracket)?;
7611        Ok(RawDataType::Map {
7612            key_type,
7613            value_type,
7614        })
7615    }
7616
7617    fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7618        self.expect_keyword(FROM)?;
7619        let table_name = RawItemName::Name(self.parse_item_name()?);
7620        let alias = self.parse_optional_table_alias()?;
7621        let using = if self.parse_keyword(USING) {
7622            self.parse_comma_separated(Parser::parse_table_and_joins)?
7623        } else {
7624            vec![]
7625        };
7626        let selection = if self.parse_keyword(WHERE) {
7627            Some(self.parse_expr()?)
7628        } else {
7629            None
7630        };
7631
7632        Ok(Statement::Delete(DeleteStatement {
7633            table_name,
7634            alias,
7635            using,
7636            selection,
7637        }))
7638    }
7639
7640    /// Parses a SELECT (or WITH, VALUES, TABLE) statement with optional AS OF.
7641    fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7642        Ok(SelectStatement {
7643            query: self.parse_query()?,
7644            as_of: self.parse_optional_as_of()?,
7645        })
7646    }
7647
7648    /// Parse a query expression, i.e. a `SELECT` statement optionally
7649    /// preceded with some `WITH` CTE declarations and optionally followed
7650    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
7651    /// expect the initial keyword to be already consumed
7652    fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7653        self.checked_recur_mut(|parser| {
7654            let cte_block = if parser.parse_keyword(WITH) {
7655                if parser.parse_keyword(MUTUALLY) {
7656                    parser.expect_keyword(RECURSIVE)?;
7657                    let options = if parser.consume_token(&Token::LParen) {
7658                        let options =
7659                            parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7660                        parser.expect_token(&Token::RParen)?;
7661                        options
7662                    } else {
7663                        vec![]
7664                    };
7665                    CteBlock::MutuallyRecursive(MutRecBlock {
7666                        options,
7667                        ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7668                    })
7669                } else {
7670                    // TODO: optional RECURSIVE
7671                    CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7672                }
7673            } else {
7674                CteBlock::empty()
7675            };
7676
7677            let body = parser.parse_query_body(SetPrecedence::Zero)?;
7678
7679            parser.parse_query_tail(cte_block, body)
7680        })
7681    }
7682
7683    fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7684        match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7685            RECURSION => {
7686                self.expect_keyword(LIMIT)?;
7687                Ok(MutRecBlockOption {
7688                    name: MutRecBlockOptionName::RecursionLimit,
7689                    value: self.parse_optional_option_value()?,
7690                })
7691            }
7692            RETURN => {
7693                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7694                Ok(MutRecBlockOption {
7695                    name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7696                    value: self.parse_optional_option_value()?,
7697                })
7698            }
7699            ERROR => {
7700                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7701                Ok(MutRecBlockOption {
7702                    name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7703                    value: self.parse_optional_option_value()?,
7704                })
7705            }
7706            _ => unreachable!(),
7707        }
7708    }
7709
7710    fn parse_query_tail(
7711        &mut self,
7712        ctes: CteBlock<Raw>,
7713        body: SetExpr<Raw>,
7714    ) -> Result<Query<Raw>, ParserError> {
7715        let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7716            SetExpr::Query(query) => {
7717                let Query {
7718                    ctes,
7719                    body,
7720                    order_by,
7721                    limit,
7722                    offset,
7723                } = *query;
7724                (ctes, order_by, limit, offset, body)
7725            }
7726            _ => (CteBlock::empty(), vec![], None, None, body),
7727        };
7728
7729        let ctes = if ctes.is_empty() {
7730            inner_ctes
7731        } else if !inner_ctes.is_empty() {
7732            return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7733        } else {
7734            ctes
7735        };
7736
7737        let order_by = if self.parse_keywords(&[ORDER, BY]) {
7738            if !inner_order_by.is_empty() {
7739                return parser_err!(
7740                    self,
7741                    self.peek_prev_pos(),
7742                    "multiple ORDER BY clauses not allowed"
7743                );
7744            }
7745            self.parse_comma_separated(Parser::parse_order_by_expr)?
7746        } else {
7747            inner_order_by
7748        };
7749
7750        // Parse LIMIT, FETCH, OFFSET in any order, but:
7751        // - Only at most one of LIMIT or FETCH is allowed.
7752        // - Only at most one occurrence is allowed from each of these.
7753        let mut limit = inner_limit;
7754        let mut offset = inner_offset;
7755        while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7756            match parsed_keyword {
7757                LIMIT => {
7758                    if limit.is_some() {
7759                        return parser_err!(
7760                            self,
7761                            self.peek_prev_pos(),
7762                            "multiple LIMIT/FETCH clauses not allowed"
7763                        );
7764                    }
7765                    limit = if self.parse_keyword(ALL) {
7766                        None
7767                    } else {
7768                        Some(Limit {
7769                            with_ties: false,
7770                            quantity: self.parse_expr()?,
7771                        })
7772                    };
7773                }
7774                OFFSET => {
7775                    if offset.is_some() {
7776                        return parser_err!(
7777                            self,
7778                            self.peek_prev_pos(),
7779                            "multiple OFFSET clauses not allowed"
7780                        );
7781                    }
7782                    let value = self.parse_expr()?;
7783                    let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7784                    offset = Some(value);
7785                }
7786                FETCH => {
7787                    if limit.is_some() {
7788                        return parser_err!(
7789                            self,
7790                            self.peek_prev_pos(),
7791                            "multiple LIMIT/FETCH clauses not allowed"
7792                        );
7793                    }
7794                    self.expect_one_of_keywords(&[FIRST, NEXT])?;
7795                    let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7796                        Expr::Value(Value::Number('1'.into()))
7797                    } else {
7798                        let quantity = self.parse_expr()?;
7799                        self.expect_one_of_keywords(&[ROW, ROWS])?;
7800                        quantity
7801                    };
7802                    let with_ties = if self.parse_keyword(ONLY) {
7803                        false
7804                    } else if self.parse_keywords(&[WITH, TIES]) {
7805                        true
7806                    } else {
7807                        return self.expected(
7808                            self.peek_pos(),
7809                            "one of ONLY or WITH TIES",
7810                            self.peek_token(),
7811                        );
7812                    };
7813                    limit = Some(Limit {
7814                        with_ties,
7815                        quantity,
7816                    });
7817                }
7818                _ => unreachable!(),
7819            }
7820        }
7821
7822        Ok(Query {
7823            ctes,
7824            body,
7825            order_by,
7826            limit,
7827            offset,
7828        })
7829    }
7830
7831    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
7832    fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7833        let alias = TableAlias {
7834            name: self.parse_identifier()?,
7835            columns: self.parse_parenthesized_column_list(Optional)?,
7836            strict: false,
7837        };
7838        self.expect_keyword(AS)?;
7839        self.expect_token(&Token::LParen)?;
7840        let query = self.parse_query()?;
7841        self.expect_token(&Token::RParen)?;
7842        Ok(Cte {
7843            alias,
7844            query,
7845            id: (),
7846        })
7847    }
7848
7849    /// Parse a mutually recursive CTE (`alias ( col1: typ1, col2: typ2, ... ) AS (subquery)`).
7850    ///
7851    /// The main distinction from `parse_cte` is that the column names and types are mandatory.
7852    /// This is not how SQL works for `WITH RECURSIVE`, but we are doing it for now to make the
7853    /// query interpretation that much easier.
7854    fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7855        let name = self.parse_identifier()?;
7856        self.expect_token(&Token::LParen)?;
7857        let columns = self.parse_comma_separated(|parser| {
7858            Ok(CteMutRecColumnDef {
7859                name: parser.parse_identifier()?,
7860                data_type: parser.parse_data_type()?,
7861            })
7862        })?;
7863        self.expect_token(&Token::RParen)?;
7864        self.expect_keyword(AS)?;
7865        self.expect_token(&Token::LParen)?;
7866        let query = self.parse_query()?;
7867        self.expect_token(&Token::RParen)?;
7868        Ok(CteMutRec {
7869            name,
7870            columns,
7871            query,
7872            id: (),
7873        })
7874    }
7875
7876    /// Parse a "query body", which is an expression with roughly the
7877    /// following grammar:
7878    /// ```text
7879    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
7880    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
7881    ///   subquery ::= query_body [ order_by_limit ]
7882    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
7883    /// ```
7884    fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
7885        // We parse the expression using a Pratt parser, as in `parse_expr()`.
7886        // Start by parsing a restricted SELECT or a `(subquery)`:
7887        let expr = if self.parse_keyword(SELECT) {
7888            SetExpr::Select(Box::new(self.parse_select()?))
7889        } else if self.consume_token(&Token::LParen) {
7890            // CTEs are not allowed here, but the parser currently accepts them
7891            let subquery = self.parse_query()?;
7892            self.expect_token(&Token::RParen)?;
7893            SetExpr::Query(Box::new(subquery))
7894        } else if self.parse_keyword(VALUES) {
7895            SetExpr::Values(self.parse_values()?)
7896        } else if self.parse_keyword(SHOW) {
7897            SetExpr::Show(self.parse_show()?)
7898        } else if self.parse_keyword(TABLE) {
7899            SetExpr::Table(self.parse_raw_name()?)
7900        } else {
7901            return self.expected(
7902                self.peek_pos(),
7903                "SELECT, VALUES, or a subquery in the query body",
7904                self.peek_token(),
7905            );
7906        };
7907
7908        self.parse_query_body_seeded(precedence, expr)
7909    }
7910
7911    fn parse_query_body_seeded(
7912        &mut self,
7913        precedence: SetPrecedence,
7914        mut expr: SetExpr<Raw>,
7915    ) -> Result<SetExpr<Raw>, ParserError> {
7916        loop {
7917            // The query can be optionally followed by a set operator:
7918            let next_token = self.peek_token();
7919            let op = self.parse_set_operator(&next_token);
7920            let next_precedence = match op {
7921                // UNION and EXCEPT have the same precedence and evaluate left-to-right
7922                Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7923                // INTERSECT has higher precedence than UNION/EXCEPT
7924                Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7925                // Unexpected token or EOF => stop parsing the query body
7926                None => break,
7927            };
7928            if precedence >= next_precedence {
7929                break;
7930            }
7931            self.next_token(); // skip past the set operator
7932
7933            let all = self.parse_keyword(ALL);
7934            let distinct = self.parse_keyword(DISTINCT);
7935            if all && distinct {
7936                return parser_err!(
7937                    self,
7938                    self.peek_prev_pos(),
7939                    "Cannot specify both ALL and DISTINCT in set operation"
7940                );
7941            }
7942            expr = SetExpr::SetOperation {
7943                left: Box::new(expr),
7944                op: op.unwrap(),
7945                all,
7946                right: Box::new(self.parse_query_body(next_precedence)?),
7947            };
7948        }
7949
7950        Ok(expr)
7951    }
7952
7953    fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
7954        match token {
7955            Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
7956            Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
7957            Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
7958            _ => None,
7959        }
7960    }
7961
7962    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
7963    /// assuming the initial `SELECT` was already consumed
7964    fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
7965        let all = self.parse_keyword(ALL);
7966        let distinct = self.parse_keyword(DISTINCT);
7967        if all && distinct {
7968            return parser_err!(
7969                self,
7970                self.peek_prev_pos(),
7971                "Cannot specify both ALL and DISTINCT in SELECT"
7972            );
7973        }
7974        let distinct = if distinct && self.parse_keyword(ON) {
7975            self.expect_token(&Token::LParen)?;
7976            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
7977            self.expect_token(&Token::RParen)?;
7978            Some(Distinct::On(exprs))
7979        } else if distinct {
7980            Some(Distinct::EntireRow)
7981        } else {
7982            None
7983        };
7984
7985        let projection = match self.peek_token() {
7986            // An empty target list is permissible to match PostgreSQL, which
7987            // permits these for symmetry with zero column tables. We need
7988            // to sniff out `AS` here specially to support `SELECT AS OF ...`.
7989            Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
7990            Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
7991            _ => {
7992                let mut projection = vec![];
7993                loop {
7994                    projection.push(self.parse_select_item()?);
7995                    if !self.consume_token(&Token::Comma) {
7996                        break;
7997                    }
7998                    if self.peek_keyword(FROM) {
7999                        return parser_err!(
8000                            self,
8001                            self.peek_prev_pos(),
8002                            "invalid trailing comma in SELECT list",
8003                        );
8004                    }
8005                }
8006                projection
8007            }
8008        };
8009
8010        // Note that for keywords to be properly handled here, they need to be
8011        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
8012        // otherwise they may be parsed as an alias as part of the `projection`
8013        // or `from`.
8014
8015        let from = if self.parse_keyword(FROM) {
8016            self.parse_comma_separated(Parser::parse_table_and_joins)?
8017        } else {
8018            vec![]
8019        };
8020
8021        let selection = if self.parse_keyword(WHERE) {
8022            Some(self.parse_expr()?)
8023        } else {
8024            None
8025        };
8026
8027        let group_by = if self.parse_keywords(&[GROUP, BY]) {
8028            self.parse_comma_separated(Parser::parse_expr)?
8029        } else {
8030            vec![]
8031        };
8032
8033        let having = if self.parse_keyword(HAVING) {
8034            Some(self.parse_expr()?)
8035        } else {
8036            None
8037        };
8038
8039        let qualify = if self.parse_keyword(QUALIFY) {
8040            Some(self.parse_expr()?)
8041        } else {
8042            None
8043        };
8044
8045        let options = if self.parse_keyword(OPTIONS) {
8046            self.expect_token(&Token::LParen)?;
8047            let options = self.parse_comma_separated(Self::parse_select_option)?;
8048            self.expect_token(&Token::RParen)?;
8049            options
8050        } else {
8051            vec![]
8052        };
8053
8054        Ok(Select {
8055            distinct,
8056            projection,
8057            from,
8058            selection,
8059            group_by,
8060            having,
8061            qualify,
8062            options,
8063        })
8064    }
8065
8066    fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
8067        let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
8068            EXPECTED => {
8069                self.expect_keywords(&[GROUP, SIZE])?;
8070                SelectOptionName::ExpectedGroupSize
8071            }
8072            AGGREGATE => {
8073                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8074                SelectOptionName::AggregateInputGroupSize
8075            }
8076            DISTINCT => {
8077                self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
8078                SelectOptionName::DistinctOnInputGroupSize
8079            }
8080            LIMIT => {
8081                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8082                SelectOptionName::LimitInputGroupSize
8083            }
8084            _ => unreachable!(),
8085        };
8086        Ok(SelectOption {
8087            name,
8088            value: self.parse_optional_option_value()?,
8089        })
8090    }
8091
8092    fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8093        let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
8094        let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
8095        let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8096        if !normal {
8097            match variable.as_str().parse() {
8098                Ok(TIME) => {
8099                    self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8100                    variable = ident!("timezone");
8101                    normal = true;
8102                }
8103                Ok(NAMES) => {
8104                    variable = ident!("client_encoding");
8105                    normal = true;
8106                }
8107                _ => {}
8108            }
8109        }
8110        if variable.as_str().parse() == Ok(SCHEMA) {
8111            variable = ident!("search_path");
8112            let to = self
8113                .parse_set_schema_to()
8114                .map_parser_err(StatementKind::SetVariable)?;
8115            Ok(Statement::SetVariable(SetVariableStatement {
8116                local: modifier == Some(LOCAL),
8117                variable,
8118                to,
8119            }))
8120        } else if normal {
8121            let to = self
8122                .parse_set_variable_to()
8123                .map_parser_err(StatementKind::SetVariable)?;
8124            Ok(Statement::SetVariable(SetVariableStatement {
8125                local: modifier == Some(LOCAL),
8126                variable,
8127                to,
8128            }))
8129        } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8130            // SET TRANSACTION transaction_mode
8131            Ok(Statement::SetTransaction(SetTransactionStatement {
8132                local: true,
8133                modes: self
8134                    .parse_transaction_modes(true)
8135                    .map_parser_err(StatementKind::SetTransaction)?,
8136            }))
8137        } else if modifier == Some(SESSION)
8138            && variable.as_str().parse() == Ok(CHARACTERISTICS)
8139            && self.parse_keywords(&[AS, TRANSACTION])
8140        {
8141            // SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
8142            Ok(Statement::SetTransaction(SetTransactionStatement {
8143                local: false,
8144                modes: self
8145                    .parse_transaction_modes(true)
8146                    .map_parser_err(StatementKind::SetTransaction)?,
8147            }))
8148        } else {
8149            self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8150                .map_no_statement_parser_err()
8151        }
8152    }
8153
8154    fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8155        if self.parse_keyword(DEFAULT) {
8156            Ok(SetVariableTo::Default)
8157        } else {
8158            let to = self.parse_set_variable_value()?;
8159            Ok(SetVariableTo::Values(vec![to]))
8160        }
8161    }
8162
8163    fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8164        if self.parse_keyword(DEFAULT) {
8165            Ok(SetVariableTo::Default)
8166        } else {
8167            Ok(SetVariableTo::Values(
8168                self.parse_comma_separated(Parser::parse_set_variable_value)?,
8169            ))
8170        }
8171    }
8172
8173    fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8174        if let Some(value) = self.maybe_parse(Parser::parse_value) {
8175            Ok(SetVariableValue::Literal(value))
8176        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8177            Ok(SetVariableValue::Ident(ident))
8178        } else {
8179            self.expected(self.peek_pos(), "variable value", self.peek_token())
8180        }
8181    }
8182
8183    fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8184        let mut variable = self.parse_identifier()?;
8185        if variable.as_str().parse() == Ok(SCHEMA) {
8186            variable = ident!("search_path");
8187        }
8188        Ok(Statement::ResetVariable(ResetVariableStatement {
8189            variable,
8190        }))
8191    }
8192
8193    fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8194        let redacted = self.parse_keyword(REDACTED);
8195        if redacted && !self.peek_keyword(CREATE) {
8196            return parser_err!(
8197                self,
8198                self.peek_pos(),
8199                "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8200            );
8201        }
8202        if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8203            self.parse_show_columns()
8204        } else if self.parse_keyword(OBJECTS) {
8205            let from = if self.parse_keywords(&[FROM]) {
8206                Some(self.parse_schema_name()?)
8207            } else {
8208                None
8209            };
8210            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8211                object_type: ShowObjectType::Object,
8212                from,
8213                filter: self.parse_show_statement_filter()?,
8214            }))
8215        } else if let Some(object_type) = self.parse_plural_object_type() {
8216            let from = if object_type.lives_in_schema() {
8217                if self.parse_keywords(&[FROM]) {
8218                    Some(self.parse_schema_name()?)
8219                } else {
8220                    None
8221                }
8222            } else {
8223                None
8224            };
8225
8226            let show_object_type = match object_type {
8227                ObjectType::Database => ShowObjectType::Database,
8228                ObjectType::Schema => {
8229                    let from = if self.parse_keyword(FROM) {
8230                        Some(self.parse_database_name()?)
8231                    } else {
8232                        None
8233                    };
8234                    ShowObjectType::Schema { from }
8235                }
8236                ObjectType::Table => {
8237                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8238                        Some(self.parse_raw_name()?)
8239                    } else {
8240                        None
8241                    };
8242                    ShowObjectType::Table { on_source }
8243                }
8244                ObjectType::View => ShowObjectType::View,
8245                ObjectType::Source => {
8246                    let in_cluster = self.parse_optional_in_cluster()?;
8247                    ShowObjectType::Source { in_cluster }
8248                }
8249                ObjectType::Subsource => {
8250                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8251                        Some(self.parse_raw_name()?)
8252                    } else {
8253                        None
8254                    };
8255
8256                    if from.is_some() && on_source.is_some() {
8257                        return parser_err!(
8258                            self,
8259                            self.peek_prev_pos(),
8260                            "Cannot specify both FROM and ON"
8261                        );
8262                    }
8263
8264                    ShowObjectType::Subsource { on_source }
8265                }
8266                ObjectType::Sink => {
8267                    let in_cluster = self.parse_optional_in_cluster()?;
8268                    ShowObjectType::Sink { in_cluster }
8269                }
8270                ObjectType::Type => ShowObjectType::Type,
8271                ObjectType::Role => ShowObjectType::Role,
8272                ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8273                ObjectType::Secret => ShowObjectType::Secret,
8274                ObjectType::Connection => ShowObjectType::Connection,
8275                ObjectType::Cluster => ShowObjectType::Cluster,
8276                ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8277                ObjectType::MaterializedView => {
8278                    let in_cluster = self.parse_optional_in_cluster()?;
8279                    ShowObjectType::MaterializedView { in_cluster }
8280                }
8281                ObjectType::Index => {
8282                    let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8283                        Some(self.parse_raw_name()?)
8284                    } else {
8285                        None
8286                    };
8287
8288                    if from.is_some() && on_object.is_some() {
8289                        return parser_err!(
8290                            self,
8291                            self.peek_prev_pos(),
8292                            "Cannot specify both FROM and ON"
8293                        );
8294                    }
8295
8296                    let in_cluster = self.parse_optional_in_cluster()?;
8297                    ShowObjectType::Index {
8298                        in_cluster,
8299                        on_object,
8300                    }
8301                }
8302                ObjectType::Func => {
8303                    return parser_err!(
8304                        self,
8305                        self.peek_prev_pos(),
8306                        format!("Unsupported SHOW on {object_type}")
8307                    );
8308                }
8309            };
8310            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8311                object_type: show_object_type,
8312                from,
8313                filter: self.parse_show_statement_filter()?,
8314            }))
8315        } else if self.parse_keyword(CLUSTER) {
8316            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8317                variable: ident!("cluster"),
8318            }))
8319        } else if self.parse_keyword(PRIVILEGES) {
8320            self.parse_show_privileges()
8321        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8322            self.parse_show_default_privileges()
8323        } else if self.parse_keyword(ROLE) {
8324            self.expect_keyword(MEMBERSHIP)?;
8325            let role = if self.parse_keyword(FOR) {
8326                Some(self.parse_identifier()?)
8327            } else {
8328                None
8329            };
8330            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8331                object_type: ShowObjectType::RoleMembership { role },
8332                from: None,
8333                filter: self.parse_show_statement_filter()?,
8334            }))
8335        } else if self.parse_keywords(&[CREATE, VIEW]) {
8336            Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8337                view_name: self.parse_raw_name()?,
8338                redacted,
8339            }))
8340        } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8341            Ok(ShowStatement::ShowCreateMaterializedView(
8342                ShowCreateMaterializedViewStatement {
8343                    materialized_view_name: self.parse_raw_name()?,
8344                    redacted,
8345                },
8346            ))
8347        } else if self.parse_keywords(&[CREATE, SOURCE]) {
8348            Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8349                source_name: self.parse_raw_name()?,
8350                redacted,
8351            }))
8352        } else if self.parse_keywords(&[CREATE, TABLE]) {
8353            Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8354                table_name: self.parse_raw_name()?,
8355                redacted,
8356            }))
8357        } else if self.parse_keywords(&[CREATE, SINK]) {
8358            Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8359                sink_name: self.parse_raw_name()?,
8360                redacted,
8361            }))
8362        } else if self.parse_keywords(&[CREATE, INDEX]) {
8363            Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8364                index_name: self.parse_raw_name()?,
8365                redacted,
8366            }))
8367        } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8368            Ok(ShowStatement::ShowCreateConnection(
8369                ShowCreateConnectionStatement {
8370                    connection_name: self.parse_raw_name()?,
8371                    redacted,
8372                },
8373            ))
8374        } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8375            if redacted {
8376                return parser_err!(
8377                    self,
8378                    self.peek_prev_pos(),
8379                    "SHOW REDACTED CREATE CLUSTER is not supported"
8380                );
8381            }
8382            Ok(ShowStatement::ShowCreateCluster(
8383                ShowCreateClusterStatement {
8384                    cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8385                },
8386            ))
8387        } else if self.parse_keywords(&[CREATE, TYPE]) {
8388            Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8389                type_name: self.parse_data_type()?,
8390                redacted,
8391            }))
8392        } else {
8393            let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8394                ident!("transaction_isolation")
8395            } else if self.parse_keywords(&[TIME, ZONE]) {
8396                ident!("timezone")
8397            } else {
8398                self.parse_identifier()?
8399            };
8400            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8401                variable,
8402            }))
8403        }
8404    }
8405
8406    fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8407        self.expect_one_of_keywords(&[FROM, IN])?;
8408        let table_name = self.parse_raw_name()?;
8409        // MySQL also supports FROM <database> here. In other words, MySQL
8410        // allows both FROM <table> FROM <database> and FROM <database>.<table>,
8411        // while we only support the latter for now.
8412        let filter = self.parse_show_statement_filter()?;
8413        Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8414            table_name,
8415            filter,
8416        }))
8417    }
8418
8419    fn parse_show_statement_filter(
8420        &mut self,
8421    ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8422        if self.parse_keyword(LIKE) {
8423            Ok(Some(ShowStatementFilter::Like(
8424                self.parse_literal_string()?,
8425            )))
8426        } else if self.parse_keyword(WHERE) {
8427            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8428        } else {
8429            Ok(None)
8430        }
8431    }
8432
8433    fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8434        let object_type = if self.parse_keyword(ON) {
8435            Some(self.expect_plural_system_object_type_for_privileges()?)
8436        } else {
8437            None
8438        };
8439        let role = if self.parse_keyword(FOR) {
8440            Some(self.parse_identifier()?)
8441        } else {
8442            None
8443        };
8444        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8445            object_type: ShowObjectType::Privileges { object_type, role },
8446            from: None,
8447            filter: self.parse_show_statement_filter()?,
8448        }))
8449    }
8450
8451    fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8452        let object_type = if self.parse_keyword(ON) {
8453            Some(self.expect_plural_object_type_for_privileges()?)
8454        } else {
8455            None
8456        };
8457        let role = if self.parse_keyword(FOR) {
8458            Some(self.parse_identifier()?)
8459        } else {
8460            None
8461        };
8462        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8463            object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8464            from: None,
8465            filter: self.parse_show_statement_filter()?,
8466        }))
8467    }
8468
8469    fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8470        self.expect_keyword(SHARD)?;
8471        let id = self.parse_literal_string()?;
8472        Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8473    }
8474
8475    fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8476        let relation = self.parse_table_factor()?;
8477
8478        // Note that for keywords to be properly handled here, they need to be
8479        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
8480        // a table alias.
8481        let mut joins = vec![];
8482        loop {
8483            let join = if self.parse_keyword(CROSS) {
8484                self.expect_keyword(JOIN)?;
8485                Join {
8486                    relation: self.parse_table_factor()?,
8487                    join_operator: JoinOperator::CrossJoin,
8488                }
8489            } else {
8490                let natural = self.parse_keyword(NATURAL);
8491                let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8492                    Some(kw)
8493                } else {
8494                    None
8495                };
8496
8497                let join_operator_type = match peek_keyword {
8498                    Some(INNER) | Some(JOIN) => {
8499                        let _ = self.parse_keyword(INNER);
8500                        self.expect_keyword(JOIN)?;
8501                        JoinOperator::Inner
8502                    }
8503                    Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8504                        let _ = self.next_token();
8505                        let _ = self.parse_keyword(OUTER);
8506                        self.expect_keyword(JOIN)?;
8507                        match kw {
8508                            LEFT => JoinOperator::LeftOuter,
8509                            RIGHT => JoinOperator::RightOuter,
8510                            FULL => JoinOperator::FullOuter,
8511                            _ => unreachable!(),
8512                        }
8513                    }
8514                    Some(OUTER) => {
8515                        return self.expected(
8516                            self.peek_pos(),
8517                            "LEFT, RIGHT, or FULL",
8518                            self.peek_token(),
8519                        );
8520                    }
8521                    None if natural => {
8522                        return self.expected(
8523                            self.peek_pos(),
8524                            "a join type after NATURAL",
8525                            self.peek_token(),
8526                        );
8527                    }
8528                    _ => break,
8529                };
8530                let relation = self.parse_table_factor()?;
8531                let join_constraint = self.parse_join_constraint(natural)?;
8532                Join {
8533                    relation,
8534                    join_operator: join_operator_type(join_constraint),
8535                }
8536            };
8537            joins.push(join);
8538        }
8539        Ok(TableWithJoins { relation, joins })
8540    }
8541
8542    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
8543    fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8544        // Guard the nested table-factor recursion. `FROM ((((…` descends
8545        // parse_table_factor -> parse_table_and_joins -> parse_table_factor,
8546        // and the inner `parse_query` recursion guard doesn't stop it because
8547        // the derived-table `maybe_parse` below swallows its
8548        // `RecursionLimitError`. Without this, deeply nested parens overflow
8549        // the stack (and the try-both backtracking balloons memory).
8550        self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8551    }
8552
8553    fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8554        if self.parse_keyword(LATERAL) {
8555            // LATERAL must always be followed by a subquery or table function.
8556            if self.consume_token(&Token::LParen) {
8557                return self.parse_derived_table_factor(Lateral);
8558            } else if self.parse_keywords(&[ROWS, FROM]) {
8559                return self.parse_rows_from();
8560            } else {
8561                let name = self.parse_raw_name()?;
8562                self.expect_token(&Token::LParen)?;
8563                let args = self.parse_optional_args(false)?;
8564                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8565                return Ok(TableFactor::Function {
8566                    function: Function {
8567                        name,
8568                        args,
8569                        filter: None,
8570                        over: None,
8571                        distinct: false,
8572                    },
8573                    alias,
8574                    with_ordinality,
8575                });
8576            }
8577        }
8578
8579        if self.consume_token(&Token::LParen) {
8580            // A left paren introduces either a derived table (i.e., a subquery)
8581            // or a nested join. It's nearly impossible to determine ahead of
8582            // time which it is... so we just try to parse both.
8583            //
8584            // Here's an example that demonstrates the complexity:
8585            //                     /-------------------------------------------------------\
8586            //                     | /-----------------------------------\                 |
8587            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
8588            //                   ^ ^ ^ ^
8589            //                   | | | |
8590            //                   | | | |
8591            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
8592            //                   | | (3) starts a derived table (subquery)
8593            //                   | (2) starts a nested join
8594            //                   (1) an additional set of parens around a nested join
8595            //
8596
8597            // Check if the recently consumed '(' started a derived table, in
8598            // which case we've parsed the subquery, followed by the closing
8599            // ')', and the alias of the derived table. In the example above
8600            // this is case (3), and the next token would be `NATURAL`.
8601            maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8602
8603            // The '(' we've recently consumed does not start a derived table.
8604            // For valid input this can happen either when the token following
8605            // the paren can't start a query (e.g. `foo` in `FROM (foo NATURAL
8606            // JOIN bar)`, or when the '(' we've consumed is followed by another
8607            // '(' that starts a derived table, like (3), or another nested join
8608            // (2).
8609            //
8610            // Ignore the error and back up to where we were before. Either
8611            // we'll be able to parse a valid nested join, or we won't, and
8612            // we'll return that error instead.
8613            let table_and_joins = self.parse_table_and_joins()?;
8614            match table_and_joins.relation {
8615                TableFactor::NestedJoin { .. } => (),
8616                _ => {
8617                    if table_and_joins.joins.is_empty() {
8618                        // The SQL spec prohibits derived tables and bare
8619                        // tables from appearing alone in parentheses.
8620                        self.expected(self.peek_pos(), "joined table", self.peek_token())?
8621                    }
8622                }
8623            }
8624            self.expect_token(&Token::RParen)?;
8625            Ok(TableFactor::NestedJoin {
8626                join: Box::new(table_and_joins),
8627                alias: self.parse_optional_table_alias()?,
8628            })
8629        } else if self.parse_keywords(&[ROWS, FROM]) {
8630            Ok(self.parse_rows_from()?)
8631        } else {
8632            let name = self.parse_raw_name()?;
8633            if self.consume_token(&Token::LParen) {
8634                let args = self.parse_optional_args(false)?;
8635                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8636                Ok(TableFactor::Function {
8637                    function: Function {
8638                        name,
8639                        args,
8640                        filter: None,
8641                        over: None,
8642                        distinct: false,
8643                    },
8644                    alias,
8645                    with_ordinality,
8646                })
8647            } else {
8648                Ok(TableFactor::Table {
8649                    name,
8650                    alias: self.parse_optional_table_alias()?,
8651                })
8652            }
8653        }
8654    }
8655
8656    fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8657        self.expect_token(&Token::LParen)?;
8658        let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8659        self.expect_token(&Token::RParen)?;
8660        let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8661        Ok(TableFactor::RowsFrom {
8662            functions,
8663            alias,
8664            with_ordinality,
8665        })
8666    }
8667
8668    /// Parses the things that can come after the argument list of a table function call. These are
8669    /// - optional WITH ORDINALITY
8670    /// - optional table alias
8671    /// - optional WITH ORDINALITY again! This is allowed just to keep supporting our earlier buggy
8672    ///   order where we allowed WITH ORDINALITY only after the table alias. (Postgres and other
8673    ///   systems support it only before the table alias.)
8674    fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8675        let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8676        let alias = self.parse_optional_table_alias()?;
8677        let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8678        if with_ordinality_1 && with_ordinality_2 {
8679            return parser_err!(
8680                self,
8681                self.peek_prev_pos(),
8682                "WITH ORDINALITY specified twice"
8683            );
8684        }
8685        Ok((with_ordinality_1 || with_ordinality_2, alias))
8686    }
8687
8688    fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8689        let name = self.parse_raw_name()?;
8690        self.parse_function(name)
8691    }
8692
8693    /// Parses a function call in a position that only permits "windowless"
8694    /// function syntax (PostgreSQL's `func_expr_windowless`): DISTINCT,
8695    /// FILTER, and OVER are not part of the grammar here, which guarantees
8696    /// the planner's invariant that table functions never carry them.
8697    fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8698        let name = self.parse_raw_name()?;
8699        self.expect_token(&Token::LParen)?;
8700        let args = self.parse_optional_args(false)?;
8701        Ok(Function {
8702            name,
8703            args,
8704            filter: None,
8705            over: None,
8706            distinct: false,
8707        })
8708    }
8709
8710    fn parse_derived_table_factor(
8711        &mut self,
8712        lateral: IsLateral,
8713    ) -> Result<TableFactor<Raw>, ParserError> {
8714        let subquery = Box::new(self.parse_query()?);
8715        self.expect_token(&Token::RParen)?;
8716        let alias = self.parse_optional_table_alias()?;
8717        Ok(TableFactor::Derived {
8718            lateral: match lateral {
8719                Lateral => true,
8720                NotLateral => false,
8721            },
8722            subquery,
8723            alias,
8724        })
8725    }
8726
8727    fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8728        if natural {
8729            Ok(JoinConstraint::Natural)
8730        } else if self.parse_keyword(ON) {
8731            let constraint = self.parse_expr()?;
8732            Ok(JoinConstraint::On(constraint))
8733        } else if self.parse_keyword(USING) {
8734            let columns = self.parse_parenthesized_column_list(Mandatory)?;
8735            let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8736
8737            Ok(JoinConstraint::Using { columns, alias })
8738        } else {
8739            self.expected(
8740                self.peek_pos(),
8741                "ON, or USING after JOIN",
8742                self.peek_token(),
8743            )
8744        }
8745    }
8746
8747    /// Parse an INSERT statement
8748    fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8749        self.expect_keyword(INTO)?;
8750        let table_name = self.parse_raw_name()?;
8751        let columns = self.parse_parenthesized_column_list(Optional)?;
8752        let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8753            InsertSource::DefaultValues
8754        } else {
8755            InsertSource::Query(self.parse_query()?)
8756        };
8757        let returning = self.parse_returning()?;
8758        Ok(Statement::Insert(InsertStatement {
8759            table_name,
8760            columns,
8761            source,
8762            returning,
8763        }))
8764    }
8765
8766    fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8767        Ok(if self.parse_keyword(RETURNING) {
8768            self.parse_comma_separated(Parser::parse_select_item)?
8769        } else {
8770            Vec::new()
8771        })
8772    }
8773
8774    fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8775        let table_name = RawItemName::Name(self.parse_item_name()?);
8776        // The alias here doesn't support columns, so don't use parse_optional_table_alias.
8777        let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8778        let alias = alias.map(|name| TableAlias {
8779            name,
8780            columns: Vec::new(),
8781            strict: false,
8782        });
8783
8784        self.expect_keyword(SET)?;
8785        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8786        let selection = if self.parse_keyword(WHERE) {
8787            Some(self.parse_expr()?)
8788        } else {
8789            None
8790        };
8791
8792        Ok(Statement::Update(UpdateStatement {
8793            table_name,
8794            alias,
8795            assignments,
8796            selection,
8797        }))
8798    }
8799
8800    /// Parse a `var = expr` assignment, used in an UPDATE statement
8801    fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8802        let id = self.parse_identifier()?;
8803        self.expect_token(&Token::Eq)?;
8804        let value = self.parse_expr()?;
8805        Ok(Assignment { id, value })
8806    }
8807
8808    fn parse_optional_args(
8809        &mut self,
8810        allow_order_by: bool,
8811    ) -> Result<FunctionArgs<Raw>, ParserError> {
8812        if self.consume_token(&Token::Star) {
8813            self.expect_token(&Token::RParen)?;
8814            Ok(FunctionArgs::Star)
8815        } else if self.consume_token(&Token::RParen) {
8816            Ok(FunctionArgs::args(vec![]))
8817        } else {
8818            let args = self.parse_comma_separated(Parser::parse_expr)?;
8819            // ORDER BY can only appear after at least one argument, and not after a
8820            // star. We can ignore checking for it in the other branches. See:
8821            // https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES
8822            let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8823                self.parse_comma_separated(Parser::parse_order_by_expr)?
8824            } else {
8825                vec![]
8826            };
8827            self.expect_token(&Token::RParen)?;
8828            Ok(FunctionArgs::Args { args, order_by })
8829        }
8830    }
8831
8832    /// Parse `AS OF`, if present.
8833    fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8834        if self.parse_keyword(AS) {
8835            self.expect_keyword(OF)?;
8836            if self.parse_keywords(&[AT, LEAST]) {
8837                match self.parse_expr() {
8838                    Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8839                    Err(e) => self.expected(
8840                        e.pos,
8841                        "a timestamp value after 'AS OF AT LEAST'",
8842                        self.peek_token(),
8843                    ),
8844                }
8845            } else {
8846                match self.parse_expr() {
8847                    Ok(expr) => Ok(Some(AsOf::At(expr))),
8848                    Err(e) => {
8849                        self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8850                    }
8851                }
8852            }
8853        } else {
8854            Ok(None)
8855        }
8856    }
8857
8858    /// Parse `UP TO`, if present
8859    fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
8860        if self.parse_keyword(UP) {
8861            self.expect_keyword(TO)?;
8862            self.parse_expr().map(Some)
8863        } else {
8864            Ok(None)
8865        }
8866    }
8867
8868    /// Parse `AS OF`, if present.
8869    ///
8870    /// In contrast to `parse_optional_as_of`, this parser only supports `AS OF <time>` syntax and
8871    /// directly returns an `u64`. It is only meant to be used for internal SQL syntax.
8872    fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
8873        fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
8874            let value = parser.parse_value().ok()?;
8875            let Value::Number(s) = value else { return None };
8876            s.parse().ok()
8877        }
8878
8879        if self.parse_keywords(&[AS, OF]) {
8880            match try_parse_u64(self) {
8881                Some(time) => Ok(Some(time)),
8882                None => {
8883                    self.prev_token();
8884                    self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
8885                }
8886            }
8887        } else {
8888            Ok(None)
8889        }
8890    }
8891
8892    /// Parse a comma-delimited list of projections after SELECT
8893    fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
8894        if self.consume_token(&Token::Star) {
8895            return Ok(SelectItem::Wildcard);
8896        }
8897        Ok(SelectItem::Expr {
8898            expr: self.parse_expr()?,
8899            alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
8900        })
8901    }
8902
8903    /// Parse an expression, optionally followed by ASC or DESC,
8904    /// and then `[NULLS { FIRST | LAST }]` (used in ORDER BY)
8905    fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
8906        let expr = self.parse_expr()?;
8907
8908        let asc = if self.parse_keyword(ASC) {
8909            Some(true)
8910        } else if self.parse_keyword(DESC) {
8911            Some(false)
8912        } else {
8913            None
8914        };
8915
8916        let nulls_last = if self.parse_keyword(NULLS) {
8917            let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
8918            Some(last)
8919        } else {
8920            None
8921        };
8922
8923        Ok(OrderByExpr {
8924            expr,
8925            asc,
8926            nulls_last,
8927        })
8928    }
8929
8930    fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
8931        let values = self.parse_comma_separated(|parser| {
8932            parser.expect_token(&Token::LParen)?;
8933            let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8934            parser.expect_token(&Token::RParen)?;
8935            Ok(exprs)
8936        })?;
8937        Ok(Values(values))
8938    }
8939
8940    fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
8941        self.expect_keyword(TRANSACTION)?;
8942        Ok(Statement::StartTransaction(StartTransactionStatement {
8943            modes: self.parse_transaction_modes(false)?,
8944        }))
8945    }
8946
8947    fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
8948        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8949        Ok(Statement::StartTransaction(StartTransactionStatement {
8950            modes: self.parse_transaction_modes(false)?,
8951        }))
8952    }
8953
8954    fn parse_transaction_modes(
8955        &mut self,
8956        mut required: bool,
8957    ) -> Result<Vec<TransactionMode>, ParserError> {
8958        let mut modes = vec![];
8959        loop {
8960            let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
8961                let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
8962                    TransactionIsolationLevel::ReadUncommitted
8963                } else if self.parse_keywords(&[READ, COMMITTED]) {
8964                    TransactionIsolationLevel::ReadCommitted
8965                } else if self.parse_keywords(&[REPEATABLE, READ]) {
8966                    TransactionIsolationLevel::RepeatableRead
8967                } else if self.parse_keyword(SERIALIZABLE) {
8968                    TransactionIsolationLevel::Serializable
8969                } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
8970                    TransactionIsolationLevel::StrongSessionSerializable
8971                } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
8972                    TransactionIsolationLevel::StrictSerializable
8973                } else {
8974                    self.expected(self.peek_pos(), "isolation level", self.peek_token())?
8975                };
8976                TransactionMode::IsolationLevel(iso_level)
8977            } else if self.parse_keywords(&[READ, ONLY]) {
8978                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8979            } else if self.parse_keywords(&[READ, WRITE]) {
8980                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8981            } else if required {
8982                self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
8983            } else {
8984                break;
8985            };
8986            modes.push(mode);
8987            // ANSI requires a comma after each transaction mode, but
8988            // PostgreSQL, for historical reasons, does not. We follow
8989            // PostgreSQL in making the comma optional, since that is strictly
8990            // more general.
8991            required = self.consume_token(&Token::Comma);
8992        }
8993        Ok(modes)
8994    }
8995
8996    fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
8997        Ok(Statement::Commit(CommitStatement {
8998            chain: self.parse_commit_rollback_chain()?,
8999        }))
9000    }
9001
9002    fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
9003        Ok(Statement::Rollback(RollbackStatement {
9004            chain: self.parse_commit_rollback_chain()?,
9005        }))
9006    }
9007
9008    fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
9009        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9010        if self.parse_keyword(AND) {
9011            let chain = !self.parse_keyword(NO);
9012            self.expect_keyword(CHAIN)?;
9013            Ok(chain)
9014        } else {
9015            Ok(false)
9016        }
9017    }
9018
9019    fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
9020        parser_err!(
9021            self,
9022            self.peek_prev_pos(),
9023            "TAIL has been renamed to SUBSCRIBE"
9024        )
9025    }
9026
9027    fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
9028        let _ = self.parse_keyword(TO);
9029        let relation = if self.consume_token(&Token::LParen) {
9030            let query = self.parse_query()?;
9031            self.expect_token(&Token::RParen)?;
9032            SubscribeRelation::Query(query)
9033        } else {
9034            SubscribeRelation::Name(self.parse_raw_name()?)
9035        };
9036        let mut output = self.parse_subscribe_output()?;
9037        let options = if self.parse_keyword(WITH) {
9038            self.expect_token(&Token::LParen)?;
9039            let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
9040            self.expect_token(&Token::RParen)?;
9041            options
9042        } else {
9043            vec![]
9044        };
9045        let as_of = self.parse_optional_as_of()?;
9046        let up_to = self.parse_optional_up_to()?;
9047        // For backwards compatibility, we allow parsing output options
9048        // (`ENVELOPE`, `WITHIN TIMESTAMP ORDER BY`) at the end of the
9049        // statement, if they haven't already been specified where we prefer
9050        // them, before the `WITH` options and before the `AS OF`/`UP TO`
9051        // options. Our preferred syntax better aligns with the option ordering
9052        // for `CREATE SINK` and `SELECT`.
9053        if output == SubscribeOutput::Diffs {
9054            output = self.parse_subscribe_output()?;
9055        }
9056        Ok(Statement::Subscribe(SubscribeStatement {
9057            relation,
9058            options,
9059            as_of,
9060            up_to,
9061            output,
9062        }))
9063    }
9064
9065    fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
9066        let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
9067            PROGRESS => SubscribeOptionName::Progress,
9068            SNAPSHOT => SubscribeOptionName::Snapshot,
9069            _ => unreachable!(),
9070        };
9071        Ok(SubscribeOption {
9072            name,
9073            value: self.parse_optional_option_value()?,
9074        })
9075    }
9076
9077    fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
9078        if self.parse_keywords(&[ENVELOPE]) {
9079            let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
9080            self.expect_token(&Token::LParen)?;
9081            self.expect_keyword(KEY)?;
9082            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
9083            let output = match keyword {
9084                UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
9085                DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
9086                _ => unreachable!("no other keyword allowed"),
9087            };
9088            self.expect_token(&Token::RParen)?;
9089            Ok(output)
9090        } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
9091            Ok(SubscribeOutput::WithinTimestampOrderBy {
9092                order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
9093            })
9094        } else {
9095            Ok(SubscribeOutput::Diffs)
9096        }
9097    }
9098
9099    /// Parse an `EXPLAIN` statement, assuming that the `EXPLAIN` token
9100    /// has already been consumed.
9101    fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9102        if self.parse_keyword(TIMESTAMP) {
9103            self.parse_explain_timestamp()
9104                .map_parser_err(StatementKind::ExplainTimestamp)
9105        } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9106            self.parse_explain_pushdown()
9107                .map_parser_err(StatementKind::ExplainPushdown)
9108        } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9109            self.parse_explain_analyze()
9110                .map_parser_err(StatementKind::ExplainAnalyzeObject)
9111        } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9112            self.parse_explain_schema()
9113                .map_parser_err(StatementKind::ExplainSinkSchema)
9114        } else {
9115            self.parse_explain_plan()
9116                .map_parser_err(StatementKind::ExplainPlan)
9117        }
9118    }
9119
9120    fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9121        let explainee = if self.parse_keyword(VIEW) {
9122            // Parse: `VIEW name`
9123            Explainee::View(self.parse_raw_name()?)
9124        } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9125            // Parse: `MATERIALIZED VIEW name`
9126            Explainee::MaterializedView(self.parse_raw_name()?)
9127        } else if self.parse_keyword(INDEX) {
9128            // Parse: `INDEX name`
9129            Explainee::Index(self.parse_raw_name()?)
9130        } else if self.parse_keywords(&[REPLAN, VIEW]) {
9131            // Parse: `REPLAN VIEW name`
9132            Explainee::ReplanView(self.parse_raw_name()?)
9133        } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9134            // Parse: `REPLAN MATERIALIZED VIEW name`
9135            Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9136        } else if self.parse_keywords(&[REPLAN, INDEX]) {
9137            // Parse: `REPLAN INDEX name`
9138            Explainee::ReplanIndex(self.parse_raw_name()?)
9139        } else {
9140            let broken = self.parse_keyword(BROKEN);
9141
9142            if self.peek_keywords(&[CREATE, VIEW])
9143                || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9144            {
9145                // Parse: `BROKEN? CREATE [OR REPLACE] VIEW ...`
9146                let _ = self.parse_keyword(CREATE); // consume CREATE token
9147                let stmt = match self.parse_create_view()? {
9148                    Statement::CreateView(stmt) => stmt,
9149                    _ => panic!("Unexpected statement type return after parsing"),
9150                };
9151
9152                Explainee::CreateView(Box::new(stmt), broken)
9153            } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9154                || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9155            {
9156                // Parse: `BROKEN? CREATE [OR REPLACE] MATERIALIZED VIEW ...`
9157                let _ = self.parse_keyword(CREATE); // consume CREATE token
9158                let stmt = match self.parse_create_materialized_view()? {
9159                    Statement::CreateMaterializedView(stmt) => stmt,
9160                    _ => panic!("Unexpected statement type return after parsing"),
9161                };
9162
9163                Explainee::CreateMaterializedView(Box::new(stmt), broken)
9164            } else if self.peek_keywords(&[CREATE, INDEX])
9165                || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9166            {
9167                // Parse: `BROKEN? CREATE INDEX ...`
9168                let _ = self.parse_keyword(CREATE); // consume CREATE token
9169                let stmt = match self.parse_create_index()? {
9170                    Statement::CreateIndex(stmt) => stmt,
9171                    _ => panic!("Unexpected statement type return after parsing"),
9172                };
9173
9174                Explainee::CreateIndex(Box::new(stmt), broken)
9175            } else if self.peek_keyword(SUBSCRIBE) {
9176                // Parse: `BROKEN? SUBSCRIBE ...`
9177                let _ = self.parse_keyword(SUBSCRIBE); // consume SUBSCRIBE token
9178                let stmt = match self.parse_subscribe()? {
9179                    Statement::Subscribe(stmt) => stmt,
9180                    _ => panic!("Unexpected statement type return after parsing"),
9181                };
9182                Explainee::Subscribe(Box::new(stmt), broken)
9183            } else {
9184                // Parse: `BROKEN? query`
9185                let query = self.parse_select_statement()?;
9186                Explainee::Select(Box::new(query), broken)
9187            }
9188        };
9189        Ok(explainee)
9190    }
9191
9192    /// Parse an `EXPLAIN ... PLAN` statement, assuming that the `EXPLAIN` token
9193    /// has already been consumed.
9194    fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9195        let start = self.peek_pos();
9196        let (has_stage, stage) = match self.parse_one_of_keywords(&[
9197            RAW,
9198            DECORRELATED,
9199            LOCALLY,
9200            OPTIMIZED,
9201            PHYSICAL,
9202            OPTIMIZER,
9203            PLAN,
9204        ]) {
9205            Some(RAW) => {
9206                self.expect_keyword(PLAN)?;
9207                (true, Some(ExplainStage::RawPlan))
9208            }
9209            Some(DECORRELATED) => {
9210                self.expect_keyword(PLAN)?;
9211                (true, Some(ExplainStage::DecorrelatedPlan))
9212            }
9213            Some(LOCALLY) => {
9214                self.expect_keywords(&[OPTIMIZED, PLAN])?;
9215                (true, Some(ExplainStage::LocalPlan))
9216            }
9217            Some(OPTIMIZED) => {
9218                self.expect_keyword(PLAN)?;
9219                (true, Some(ExplainStage::GlobalPlan))
9220            }
9221            Some(PHYSICAL) => {
9222                self.expect_keyword(PLAN)?;
9223                (true, Some(ExplainStage::PhysicalPlan))
9224            }
9225            Some(OPTIMIZER) => {
9226                self.expect_keyword(TRACE)?;
9227                (true, Some(ExplainStage::Trace))
9228            }
9229            Some(PLAN) => {
9230                if self.parse_keyword(INSIGHTS) {
9231                    (true, Some(ExplainStage::PlanInsights))
9232                } else {
9233                    // Use the default plan for the explainee.
9234                    (true, None)
9235                }
9236            }
9237            None => {
9238                // Use the default plan for the explainee.
9239                (false, None)
9240            }
9241            _ => unreachable!(),
9242        };
9243
9244        let with_options = if self.parse_keyword(WITH) {
9245            if self.consume_token(&Token::LParen) {
9246                let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9247                self.expect_token(&Token::RParen)?;
9248                options
9249            } else {
9250                self.prev_token(); // push back WITH in case it's actually a CTE
9251                vec![]
9252            }
9253        } else {
9254            vec![]
9255        };
9256
9257        let format = if self.parse_keyword(AS) {
9258            match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9259                Some(TEXT) => Some(ExplainFormat::Text),
9260                Some(JSON) => Some(ExplainFormat::Json),
9261                Some(DOT) => Some(ExplainFormat::Dot),
9262                Some(VERBOSE) => {
9263                    self.expect_keyword(TEXT)?;
9264                    Some(ExplainFormat::VerboseText)
9265                }
9266                None => return Err(ParserError::new(self.index, "expected a format")),
9267                _ => unreachable!(),
9268            }
9269        } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9270            // if EXPLAIN PHYSICAL PLAN is explicitly specified without AS, default to VERBOSE TEXT
9271            Some(ExplainFormat::VerboseText)
9272        } else {
9273            None
9274        };
9275
9276        if has_stage {
9277            self.expect_keyword(FOR)?;
9278        }
9279
9280        let explainee = self.parse_explainee()?;
9281
9282        // Explainees that represent a view only work in association with an
9283        // explicitly defined stage.
9284        if matches!((explainee.is_view(), &stage), (true, None)) {
9285            let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9286            return Err(self.error(start, msg));
9287        }
9288
9289        Ok(Statement::ExplainPlan(ExplainPlanStatement {
9290            stage,
9291            with_options,
9292            format,
9293            explainee,
9294        }))
9295    }
9296
9297    fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9298        Ok(ExplainPlanOption {
9299            name: self.parse_explain_plan_option_name()?,
9300            value: self.parse_optional_option_value()?,
9301        })
9302    }
9303
9304    /// Parse an `EXPLAIN FILTER PUSHDOWN` statement, assuming that the `EXPLAIN
9305    /// PUSHDOWN` tokens have already been consumed.
9306    fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9307        self.expect_keyword(FOR)?;
9308
9309        let explainee = self.parse_explainee()?;
9310
9311        Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9312            explainee,
9313        }))
9314    }
9315
9316    fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9317        // EXPLAIN ANALYZE CLUSTER (MEMORY | CPU) [WITH SKEW] [AS SQL]
9318        if self.parse_keyword(CLUSTER) {
9319            let properties = self.parse_explain_analyze_computation_properties()?;
9320            let as_sql = self.parse_keywords(&[AS, SQL]);
9321            return Ok(Statement::ExplainAnalyzeCluster(
9322                ExplainAnalyzeClusterStatement { properties, as_sql },
9323            ));
9324        }
9325
9326        // EXPLAIN ANALYZE ((MEMORY | CPU) [WITH SKEW] | HINTS) FOR (INDEX ... | MATERIALIZED VIEW ...) [AS SQL]
9327
9328        let properties = if self.parse_keyword(HINTS) {
9329            ExplainAnalyzeProperty::Hints
9330        } else {
9331            ExplainAnalyzeProperty::Computation(
9332                self.parse_explain_analyze_computation_properties()?,
9333            )
9334        };
9335
9336        self.expect_keyword(FOR)?;
9337
9338        let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9339            INDEX => Explainee::Index(self.parse_raw_name()?),
9340            MATERIALIZED => {
9341                self.expect_keyword(VIEW)?;
9342                Explainee::MaterializedView(self.parse_raw_name()?)
9343            }
9344            _ => unreachable!(),
9345        };
9346
9347        let as_sql = self.parse_keywords(&[AS, SQL]);
9348
9349        Ok(Statement::ExplainAnalyzeObject(
9350            ExplainAnalyzeObjectStatement {
9351                properties,
9352                explainee,
9353                as_sql,
9354            },
9355        ))
9356    }
9357
9358    fn parse_explain_analyze_computation_properties(
9359        &mut self,
9360    ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9361        let mut computation_properties = vec![CPU, MEMORY];
9362        let (kw, property) =
9363            self.parse_explain_analyze_computation_property(&computation_properties)?;
9364        let mut properties = vec![property];
9365        computation_properties.retain(|p| p != &kw);
9366
9367        while self.consume_token(&Token::Comma) {
9368            let (kw, property) =
9369                self.parse_explain_analyze_computation_property(&computation_properties)?;
9370            computation_properties.retain(|p| p != &kw);
9371            properties.push(property);
9372        }
9373
9374        let skew = self.parse_keywords(&[WITH, SKEW]);
9375
9376        Ok(ExplainAnalyzeComputationProperties { properties, skew })
9377    }
9378
9379    fn parse_explain_analyze_computation_property(
9380        &mut self,
9381        properties: &[Keyword],
9382    ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9383        if properties.is_empty() {
9384            return Err(ParserError::new(
9385                self.peek_pos(),
9386                "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9387            ));
9388        }
9389
9390        match self.expect_one_of_keywords(properties)? {
9391            CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9392            MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9393            _ => unreachable!(),
9394        }
9395    }
9396
9397    /// Parse an `EXPLAIN TIMESTAMP` statement, assuming that the `EXPLAIN
9398    /// TIMESTAMP` tokens have already been consumed.
9399    fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9400        let format = if self.parse_keyword(AS) {
9401            match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9402                Some(TEXT) => Some(ExplainFormat::Text),
9403                Some(JSON) => Some(ExplainFormat::Json),
9404                None => return Err(ParserError::new(self.index, "expected a format")),
9405                _ => unreachable!(),
9406            }
9407        } else {
9408            None
9409        };
9410
9411        self.expect_keyword(FOR)?;
9412
9413        let query = self.parse_select_statement()?;
9414
9415        Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9416            format,
9417            select: query,
9418        }))
9419    }
9420    /// Parse an `EXPLAIN [KEY|VALUE] SCHEMA` statement assuming that the `EXPLAIN` token
9421    /// have already been consumed
9422    fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9423        let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9424            KEY => ExplainSinkSchemaFor::Key,
9425            VALUE => ExplainSinkSchemaFor::Value,
9426            _ => unreachable!(),
9427        };
9428
9429        self.expect_keyword(SCHEMA)?;
9430
9431        let format = if self.parse_keyword(AS) {
9432            // only json format is supported
9433            self.expect_keyword(JSON)?;
9434            Some(ExplainFormat::Json)
9435        } else {
9436            None
9437        };
9438
9439        self.expect_keywords(&[FOR, CREATE])?;
9440
9441        if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9442            Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9443                schema_for,
9444                format,
9445                statement,
9446            }))
9447        } else {
9448            unreachable!("only create sink can be returned here");
9449        }
9450    }
9451
9452    /// Parse a `DECLARE` statement, assuming that the `DECLARE` token
9453    /// has already been consumed.
9454    fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9455        let name = self
9456            .parse_identifier()
9457            .map_parser_err(StatementKind::Declare)?;
9458        self.expect_keyword(CURSOR)
9459            .map_parser_err(StatementKind::Declare)?;
9460        if self.parse_keyword(WITH) {
9461            let err = parser_err!(
9462                self,
9463                self.peek_prev_pos(),
9464                format!("WITH HOLD is unsupported for cursors")
9465            )
9466            .map_parser_err(StatementKind::Declare);
9467            self.expect_keyword(HOLD)
9468                .map_parser_err(StatementKind::Declare)?;
9469            return err;
9470        }
9471        // WITHOUT HOLD is optional and the default behavior so we can ignore it.
9472        let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9473        self.expect_keyword(FOR)
9474            .map_parser_err(StatementKind::Declare)?;
9475        let StatementParseResult { ast, sql } = self.parse_statement()?;
9476        Ok(Statement::Declare(DeclareStatement {
9477            name,
9478            stmt: Box::new(ast),
9479            sql: sql.to_string(),
9480        }))
9481    }
9482
9483    /// Parse a `CLOSE` statement, assuming that the `CLOSE` token
9484    /// has already been consumed.
9485    fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9486        let name = self.parse_identifier()?;
9487        Ok(Statement::Close(CloseStatement { name }))
9488    }
9489
9490    /// Parse a `PREPARE` statement, assuming that the `PREPARE` token
9491    /// has already been consumed.
9492    fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9493        let name = self
9494            .parse_identifier()
9495            .map_parser_err(StatementKind::Prepare)?;
9496        self.expect_keyword(AS)
9497            .map_parser_err(StatementKind::Prepare)?;
9498        let pos = self.peek_pos();
9499        //
9500        let StatementParseResult { ast, sql } = self.parse_statement()?;
9501        if !matches!(
9502            ast,
9503            Statement::Select(_)
9504                | Statement::Insert(_)
9505                | Statement::Delete(_)
9506                | Statement::Update(_)
9507                | Statement::Fetch(_),
9508        ) {
9509            return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9510        }
9511        Ok(Statement::Prepare(PrepareStatement {
9512            name,
9513            stmt: Box::new(ast),
9514            sql: sql.to_string(),
9515        }))
9516    }
9517
9518    /// Parse a `EXECUTE` statement, assuming that the `EXECUTE` token
9519    /// has already been consumed.
9520    fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9521        // Check if this is EXECUTE UNIT TEST
9522        if self.parse_keywords(&[UNIT, TEST]) {
9523            return self.parse_execute_unit_test();
9524        }
9525
9526        // Otherwise parse as regular EXECUTE (prepared statement)
9527        let name = self.parse_identifier()?;
9528        let params = if self.consume_token(&Token::LParen) {
9529            let params = self.parse_comma_separated(Parser::parse_expr)?;
9530            self.expect_token(&Token::RParen)?;
9531            params
9532        } else {
9533            Vec::new()
9534        };
9535        Ok(Statement::Execute(ExecuteStatement { name, params }))
9536    }
9537
9538    /// Parse an `EXECUTE UNIT TEST` statement, assuming that the
9539    /// `EXECUTE UNIT TEST` tokens have already been consumed.
9540    fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9541        // Parse test name
9542        let name = self.parse_identifier()?;
9543
9544        // Expect FOR keyword
9545        self.expect_keyword(FOR)?;
9546
9547        // Parse target view name
9548        let target = self.parse_raw_name()?;
9549
9550        // Parse optional AT TIME clause
9551        let at_time = if self.parse_keywords(&[AT, TIME]) {
9552            Some(self.parse_expr()?)
9553        } else {
9554            None
9555        };
9556
9557        // Parse MOCK definitions (0 or more). Like CTEs, MOCK clauses are
9558        // comma-separated; no comma appears before the trailing `EXPECTED`
9559        // clause.
9560        let mut mocks = Vec::new();
9561        if self.parse_keyword(MOCK) {
9562            mocks.push(self.parse_mock_view_def()?);
9563            while self.consume_token(&Token::Comma) {
9564                self.expect_keyword(MOCK)?;
9565                mocks.push(self.parse_mock_view_def()?);
9566            }
9567        }
9568
9569        self.expect_keyword(EXPECTED)?;
9570
9571        self.expect_token(&Token::LParen)?;
9572        let expected_columns = self.parse_comma_separated(|parser| {
9573            Ok(ColumnDef {
9574                name: parser.parse_identifier()?,
9575                data_type: parser.parse_data_type()?,
9576                collation: None,
9577                options: vec![],
9578            })
9579        })?;
9580        self.expect_token(&Token::RParen)?;
9581
9582        self.expect_keyword(AS)?;
9583        self.expect_token(&Token::LParen)?;
9584        let expected_query = self.parse_query()?;
9585        self.expect_token(&Token::RParen)?;
9586
9587        let expected = ExpectedResultDef {
9588            columns: expected_columns,
9589            query: expected_query,
9590        };
9591
9592        Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9593            name,
9594            target,
9595            at_time,
9596            mocks,
9597            expected,
9598        }))
9599    }
9600
9601    /// Parse a single `MOCK <name> (<cols>) AS (<query>)` definition,
9602    /// assuming the leading `MOCK` keyword has already been consumed.
9603    fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9604        let name = self.parse_raw_name()?;
9605
9606        self.expect_token(&Token::LParen)?;
9607        let columns = self.parse_comma_separated(|parser| {
9608            Ok(ColumnDef {
9609                name: parser.parse_identifier()?,
9610                data_type: parser.parse_data_type()?,
9611                collation: None,
9612                options: vec![],
9613            })
9614        })?;
9615        self.expect_token(&Token::RParen)?;
9616
9617        self.expect_keyword(AS)?;
9618        self.expect_token(&Token::LParen)?;
9619        let query = self.parse_query()?;
9620        self.expect_token(&Token::RParen)?;
9621
9622        Ok(MockViewDef {
9623            name,
9624            columns,
9625            query,
9626        })
9627    }
9628
9629    /// Parse a `DEALLOCATE` statement, assuming that the `DEALLOCATE` token
9630    /// has already been consumed.
9631    fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9632        let _ = self.parse_keyword(PREPARE);
9633        let name = if self.parse_keyword(ALL) {
9634            None
9635        } else {
9636            Some(self.parse_identifier()?)
9637        };
9638        Ok(Statement::Deallocate(DeallocateStatement { name }))
9639    }
9640
9641    /// Parse a `FETCH` statement, assuming that the `FETCH` token
9642    /// has already been consumed.
9643    fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9644        let _ = self.parse_keyword(FORWARD);
9645        let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9646            Some(FetchDirection::ForwardCount(count))
9647        } else if self.parse_keyword(ALL) {
9648            Some(FetchDirection::ForwardAll)
9649        } else {
9650            None
9651        };
9652        let _ = self.parse_keyword(FROM);
9653        let name = self.parse_identifier()?;
9654        let options = if self.parse_keyword(WITH) {
9655            self.expect_token(&Token::LParen)?;
9656            let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9657            self.expect_token(&Token::RParen)?;
9658            options
9659        } else {
9660            vec![]
9661        };
9662        Ok(Statement::Fetch(FetchStatement {
9663            name,
9664            count,
9665            options,
9666        }))
9667    }
9668
9669    fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9670        self.expect_keyword(TIMEOUT)?;
9671        Ok(FetchOption {
9672            name: FetchOptionName::Timeout,
9673            value: self.parse_optional_option_value()?,
9674        })
9675    }
9676
9677    /// Parse a `RAISE` statement, assuming that the `RAISE` token
9678    /// has already been consumed.
9679    fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9680        let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9681            Some(DEBUG) => NoticeSeverity::Debug,
9682            Some(INFO) => NoticeSeverity::Info,
9683            Some(LOG) => NoticeSeverity::Log,
9684            Some(NOTICE) => NoticeSeverity::Notice,
9685            Some(WARNING) => NoticeSeverity::Warning,
9686            Some(_) => unreachable!(),
9687            None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9688        };
9689
9690        Ok(Statement::Raise(RaiseStatement { severity }))
9691    }
9692
9693    /// Parse a `GRANT` statement, assuming that the `GRANT` token
9694    /// has already been consumed.
9695    fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9696        match self.parse_privilege_specification() {
9697            Some(privileges) => self
9698                .parse_grant_privilege(privileges)
9699                .map_parser_err(StatementKind::GrantPrivileges),
9700            None => self
9701                .parse_grant_role()
9702                .map_parser_err(StatementKind::GrantRole),
9703        }
9704    }
9705
9706    /// Parse a `GRANT PRIVILEGE` statement, assuming that the `GRANT` token
9707    /// and all privileges have already been consumed.
9708    fn parse_grant_privilege(
9709        &mut self,
9710        privileges: PrivilegeSpecification,
9711    ) -> Result<Statement<Raw>, ParserError> {
9712        self.expect_keyword(ON)?;
9713        let target = self.expect_grant_target_specification("GRANT")?;
9714        self.expect_keyword(TO)?;
9715        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9716        Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9717            privileges,
9718            target,
9719            roles,
9720        }))
9721    }
9722
9723    /// Parse a `GRANT ROLE` statement, assuming that the `GRANT` token
9724    /// has already been consumed.
9725    fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9726        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9727        self.expect_keyword(TO)?;
9728        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9729        Ok(Statement::GrantRole(GrantRoleStatement {
9730            role_names,
9731            member_names,
9732        }))
9733    }
9734
9735    /// Parse a `REVOKE` statement, assuming that the `REVOKE` token
9736    /// has already been consumed.
9737    fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9738        match self.parse_privilege_specification() {
9739            Some(privileges) => self
9740                .parse_revoke_privilege(privileges)
9741                .map_parser_err(StatementKind::RevokePrivileges),
9742            None => self
9743                .parse_revoke_role()
9744                .map_parser_err(StatementKind::RevokeRole),
9745        }
9746    }
9747
9748    /// Parse a `REVOKE PRIVILEGE` statement, assuming that the `REVOKE` token
9749    /// and all privileges have already been consumed.
9750    fn parse_revoke_privilege(
9751        &mut self,
9752        privileges: PrivilegeSpecification,
9753    ) -> Result<Statement<Raw>, ParserError> {
9754        self.expect_keyword(ON)?;
9755        let target = self.expect_grant_target_specification("REVOKE")?;
9756        self.expect_keyword(FROM)?;
9757        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9758        Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9759            privileges,
9760            target,
9761            roles,
9762        }))
9763    }
9764
9765    /// Parse a `REVOKE ROLE` statement, assuming that the `REVOKE` token
9766    /// has already been consumed.
9767    fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9768        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9769        self.expect_keyword(FROM)?;
9770        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9771        Ok(Statement::RevokeRole(RevokeRoleStatement {
9772            role_names,
9773            member_names,
9774        }))
9775    }
9776
9777    fn expect_grant_target_specification(
9778        &mut self,
9779        statement_type: &str,
9780    ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9781        if self.parse_keyword(SYSTEM) {
9782            return Ok(GrantTargetSpecification::System);
9783        }
9784
9785        let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9786            let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9787            let object_spec_inner = if self.parse_keyword(IN) {
9788                if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9789                    return parser_err!(
9790                        self,
9791                        self.peek_prev_pos(),
9792                        format!("IN invalid for {object_type}S")
9793                    );
9794                }
9795                match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9796                    DATABASE => GrantTargetSpecificationInner::All(
9797                        GrantTargetAllSpecification::AllDatabases {
9798                            databases: self.parse_comma_separated(Parser::parse_database_name)?,
9799                        },
9800                    ),
9801                    SCHEMA => {
9802                        if object_type == ObjectType::Schema {
9803                            self.prev_token();
9804                            self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9805                        }
9806                        GrantTargetSpecificationInner::All(
9807                            GrantTargetAllSpecification::AllSchemas {
9808                                schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9809                            },
9810                        )
9811                    }
9812                    _ => unreachable!(),
9813                }
9814            } else {
9815                GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9816            };
9817            (object_type, object_spec_inner)
9818        } else {
9819            let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9820            let object_spec_inner = GrantTargetSpecificationInner::Objects {
9821                names: self
9822                    .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9823            };
9824            (object_type, object_spec_inner)
9825        };
9826
9827        Ok(GrantTargetSpecification::Object {
9828            object_type,
9829            object_spec_inner,
9830        })
9831    }
9832
9833    /// Bail out if the current token is not an object type suitable for a GRANT/REVOKE, or consume
9834    /// and return it if it is.
9835    fn expect_grant_revoke_object_type(
9836        &mut self,
9837        statement_type: &str,
9838    ) -> Result<ObjectType, ParserError> {
9839        // If the object type is omitted, then it is assumed to be a table.
9840        let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9841        self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9842    }
9843
9844    /// Bail out if the current token is not a plural object type suitable for a GRANT/REVOKE, or consume
9845    /// and return it if it is.
9846    fn expect_grant_revoke_plural_object_type(
9847        &mut self,
9848        statement_type: &str,
9849    ) -> Result<ObjectType, ParserError> {
9850        let object_type = self.expect_plural_object_type().map_err(|_| {
9851            // Limit the error message to allowed object types.
9852            self.expected::<_, ObjectType>(
9853                self.peek_pos(),
9854                "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9855                self.peek_token(),
9856            )
9857                .unwrap_err()
9858        })?;
9859        self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
9860        Ok(object_type)
9861    }
9862
9863    fn expect_grant_revoke_object_type_inner(
9864        &self,
9865        statement_type: &str,
9866        object_type: ObjectType,
9867    ) -> Result<ObjectType, ParserError> {
9868        match object_type {
9869            ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
9870                parser_err!(
9871                    self,
9872                    self.peek_prev_pos(),
9873                    format!(
9874                        "For object type {object_type}, you must specify 'TABLE' or omit the object type"
9875                    )
9876                )
9877            }
9878            ObjectType::Sink
9879            | ObjectType::Index
9880            | ObjectType::ClusterReplica
9881            | ObjectType::Role
9882            | ObjectType::Func
9883            | ObjectType::Subsource => {
9884                parser_err!(
9885                    self,
9886                    self.peek_prev_pos(),
9887                    format!("Unsupported {statement_type} on {object_type}")
9888                )
9889            }
9890            ObjectType::Table
9891            | ObjectType::Type
9892            | ObjectType::Cluster
9893            | ObjectType::Secret
9894            | ObjectType::Connection
9895            | ObjectType::Database
9896            | ObjectType::Schema
9897            | ObjectType::NetworkPolicy => Ok(object_type),
9898        }
9899    }
9900
9901    /// Bail out if the current token is not an object type, or consume and return it if it is.
9902    fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
9903        Ok(
9904            match self.expect_one_of_keywords(&[
9905                TABLE,
9906                VIEW,
9907                MATERIALIZED,
9908                SOURCE,
9909                SINK,
9910                INDEX,
9911                TYPE,
9912                ROLE,
9913                USER,
9914                CLUSTER,
9915                SECRET,
9916                CONNECTION,
9917                DATABASE,
9918                SCHEMA,
9919                FUNCTION,
9920                NETWORK,
9921            ])? {
9922                TABLE => ObjectType::Table,
9923                VIEW => ObjectType::View,
9924                MATERIALIZED => {
9925                    if let Err(e) = self.expect_keyword(VIEW) {
9926                        self.prev_token();
9927                        return Err(e);
9928                    }
9929                    ObjectType::MaterializedView
9930                }
9931                SOURCE => ObjectType::Source,
9932                SINK => ObjectType::Sink,
9933                INDEX => ObjectType::Index,
9934                TYPE => ObjectType::Type,
9935                ROLE | USER => ObjectType::Role,
9936                CLUSTER => {
9937                    if self.parse_keyword(REPLICA) {
9938                        ObjectType::ClusterReplica
9939                    } else {
9940                        ObjectType::Cluster
9941                    }
9942                }
9943                SECRET => ObjectType::Secret,
9944                CONNECTION => ObjectType::Connection,
9945                DATABASE => ObjectType::Database,
9946                SCHEMA => ObjectType::Schema,
9947                FUNCTION => ObjectType::Func,
9948                NETWORK => {
9949                    if let Err(e) = self.expect_keyword(POLICY) {
9950                        self.prev_token();
9951                        return Err(e);
9952                    }
9953                    ObjectType::NetworkPolicy
9954                }
9955                _ => unreachable!(),
9956            },
9957        )
9958    }
9959
9960    /// Look for an object type and return it if it matches.
9961    fn parse_object_type(&mut self) -> Option<ObjectType> {
9962        Some(
9963            match self.parse_one_of_keywords(&[
9964                TABLE,
9965                VIEW,
9966                MATERIALIZED,
9967                SOURCE,
9968                SINK,
9969                INDEX,
9970                TYPE,
9971                ROLE,
9972                USER,
9973                CLUSTER,
9974                SECRET,
9975                CONNECTION,
9976                DATABASE,
9977                SCHEMA,
9978                FUNCTION,
9979                NETWORK,
9980            ])? {
9981                TABLE => ObjectType::Table,
9982                VIEW => ObjectType::View,
9983                MATERIALIZED => {
9984                    if self.parse_keyword(VIEW) {
9985                        ObjectType::MaterializedView
9986                    } else {
9987                        self.prev_token();
9988                        return None;
9989                    }
9990                }
9991                SOURCE => ObjectType::Source,
9992                SINK => ObjectType::Sink,
9993                INDEX => ObjectType::Index,
9994                TYPE => ObjectType::Type,
9995                ROLE | USER => ObjectType::Role,
9996                CLUSTER => {
9997                    if self.parse_keyword(REPLICA) {
9998                        ObjectType::ClusterReplica
9999                    } else {
10000                        ObjectType::Cluster
10001                    }
10002                }
10003                SECRET => ObjectType::Secret,
10004                CONNECTION => ObjectType::Connection,
10005                DATABASE => ObjectType::Database,
10006                SCHEMA => ObjectType::Schema,
10007                FUNCTION => ObjectType::Func,
10008                NETWORK => {
10009                    if self.parse_keyword(POLICY) {
10010                        ObjectType::NetworkPolicy
10011                    } else {
10012                        self.prev_token();
10013                        return None;
10014                    }
10015                }
10016                _ => unreachable!(),
10017            },
10018        )
10019    }
10020
10021    /// Bail out if the current token is not an object type in the plural form, or consume and return it if it is.
10022    fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
10023        Ok(
10024            match self.expect_one_of_keywords(&[
10025                TABLES,
10026                VIEWS,
10027                MATERIALIZED,
10028                SOURCES,
10029                SINKS,
10030                INDEXES,
10031                TYPES,
10032                ROLES,
10033                USERS,
10034                CLUSTER,
10035                CLUSTERS,
10036                SECRETS,
10037                CONNECTIONS,
10038                DATABASES,
10039                SCHEMAS,
10040                POLICIES,
10041            ])? {
10042                TABLES => ObjectType::Table,
10043                VIEWS => ObjectType::View,
10044                MATERIALIZED => {
10045                    if let Err(e) = self.expect_keyword(VIEWS) {
10046                        self.prev_token();
10047                        return Err(e);
10048                    }
10049                    ObjectType::MaterializedView
10050                }
10051                SOURCES => ObjectType::Source,
10052                SINKS => ObjectType::Sink,
10053                INDEXES => ObjectType::Index,
10054                TYPES => ObjectType::Type,
10055                ROLES | USERS => ObjectType::Role,
10056                CLUSTER => {
10057                    if let Err(e) = self.expect_keyword(REPLICAS) {
10058                        self.prev_token();
10059                        return Err(e);
10060                    }
10061                    ObjectType::ClusterReplica
10062                }
10063                CLUSTERS => ObjectType::Cluster,
10064                SECRETS => ObjectType::Secret,
10065                CONNECTIONS => ObjectType::Connection,
10066                DATABASES => ObjectType::Database,
10067                SCHEMAS => ObjectType::Schema,
10068                POLICIES => ObjectType::NetworkPolicy,
10069                _ => unreachable!(),
10070            },
10071        )
10072    }
10073
10074    /// Look for an object type in the plural form and return it if it matches.
10075    fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
10076        Some(
10077            match self.parse_one_of_keywords(&[
10078                TABLES,
10079                VIEWS,
10080                MATERIALIZED,
10081                SOURCES,
10082                SINKS,
10083                INDEXES,
10084                TYPES,
10085                ROLES,
10086                USERS,
10087                CLUSTER,
10088                CLUSTERS,
10089                SECRETS,
10090                CONNECTIONS,
10091                DATABASES,
10092                SCHEMAS,
10093                SUBSOURCES,
10094                NETWORK,
10095            ])? {
10096                TABLES => ObjectType::Table,
10097                VIEWS => ObjectType::View,
10098                MATERIALIZED => {
10099                    if self.parse_keyword(VIEWS) {
10100                        ObjectType::MaterializedView
10101                    } else {
10102                        self.prev_token();
10103                        return None;
10104                    }
10105                }
10106                SOURCES => ObjectType::Source,
10107                SINKS => ObjectType::Sink,
10108                INDEXES => ObjectType::Index,
10109                TYPES => ObjectType::Type,
10110                ROLES | USERS => ObjectType::Role,
10111                CLUSTER => {
10112                    if self.parse_keyword(REPLICAS) {
10113                        ObjectType::ClusterReplica
10114                    } else {
10115                        self.prev_token();
10116                        return None;
10117                    }
10118                }
10119                CLUSTERS => ObjectType::Cluster,
10120                SECRETS => ObjectType::Secret,
10121                CONNECTIONS => ObjectType::Connection,
10122                DATABASES => ObjectType::Database,
10123                SCHEMAS => ObjectType::Schema,
10124                SUBSOURCES => ObjectType::Subsource,
10125                NETWORK => {
10126                    if self.parse_keyword(POLICIES) {
10127                        ObjectType::NetworkPolicy
10128                    } else {
10129                        self.prev_token();
10130                        return None;
10131                    }
10132                }
10133                _ => unreachable!(),
10134            },
10135        )
10136    }
10137
10138    /// Bail out if the current token is not a privilege object type, or consume and
10139    /// return it if it is.
10140    fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10141        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10142            return parser_err!(
10143                self,
10144                self.peek_prev_pos(),
10145                format!("For object type {object_type}, you must specify 'TABLES'")
10146            );
10147        }
10148        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10149            self.prev_token();
10150            return parser_err!(
10151                self,
10152                self.peek_prev_pos(),
10153                format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
10154            );
10155        }
10156
10157        Ok(
10158            match self.expect_one_of_keywords(&[
10159                TABLES,
10160                TYPES,
10161                CLUSTERS,
10162                SECRETS,
10163                CONNECTIONS,
10164                DATABASES,
10165                SCHEMAS,
10166            ])? {
10167                TABLES => ObjectType::Table,
10168                TYPES => ObjectType::Type,
10169                CLUSTERS => ObjectType::Cluster,
10170                SECRETS => ObjectType::Secret,
10171                CONNECTIONS => ObjectType::Connection,
10172                DATABASES => ObjectType::Database,
10173                SCHEMAS => ObjectType::Schema,
10174                _ => unreachable!(),
10175            },
10176        )
10177    }
10178
10179    /// Bail out if the current token is not a privilege object type in the plural form, or consume and
10180    /// return it if it is.
10181    fn expect_plural_system_object_type_for_privileges(
10182        &mut self,
10183    ) -> Result<SystemObjectType, ParserError> {
10184        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10185            return parser_err!(
10186                self,
10187                self.peek_prev_pos(),
10188                format!("For object type {object_type}, you must specify 'TABLES'")
10189            );
10190        }
10191        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10192            self.prev_token();
10193            return parser_err!(
10194                self,
10195                self.peek_prev_pos(),
10196                format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
10197            );
10198        }
10199
10200        Ok(
10201            match self.expect_one_of_keywords(&[
10202                SYSTEM,
10203                TABLES,
10204                TYPES,
10205                CLUSTERS,
10206                SECRETS,
10207                CONNECTIONS,
10208                DATABASES,
10209                SCHEMAS,
10210            ])? {
10211                SYSTEM => SystemObjectType::System,
10212                TABLES => SystemObjectType::Object(ObjectType::Table),
10213                TYPES => SystemObjectType::Object(ObjectType::Type),
10214                CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10215                SECRETS => SystemObjectType::Object(ObjectType::Secret),
10216                CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10217                DATABASES => SystemObjectType::Object(ObjectType::Database),
10218                SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10219                _ => unreachable!(),
10220            },
10221        )
10222    }
10223
10224    /// Look for a privilege and return it if it matches.
10225    fn parse_privilege(&mut self) -> Option<Privilege> {
10226        Some(
10227            match self.parse_one_of_keywords(&[
10228                INSERT,
10229                SELECT,
10230                UPDATE,
10231                DELETE,
10232                USAGE,
10233                CREATE,
10234                CREATEROLE,
10235                CREATEDB,
10236                CREATECLUSTER,
10237                CREATENETWORKPOLICY,
10238            ])? {
10239                INSERT => Privilege::INSERT,
10240                SELECT => Privilege::SELECT,
10241                UPDATE => Privilege::UPDATE,
10242                DELETE => Privilege::DELETE,
10243                USAGE => Privilege::USAGE,
10244                CREATE => Privilege::CREATE,
10245                CREATEROLE => Privilege::CREATEROLE,
10246                CREATEDB => Privilege::CREATEDB,
10247                CREATECLUSTER => Privilege::CREATECLUSTER,
10248                CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10249                _ => unreachable!(),
10250            },
10251        )
10252    }
10253
10254    /// Parse one or more privileges separated by a ','.
10255    fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10256        if self.parse_keyword(ALL) {
10257            let _ = self.parse_keyword(PRIVILEGES);
10258            return Some(PrivilegeSpecification::All);
10259        }
10260
10261        let mut privileges = Vec::new();
10262        while let Some(privilege) = self.parse_privilege() {
10263            privileges.push(privilege);
10264            if !self.consume_token(&Token::Comma) {
10265                break;
10266            }
10267        }
10268
10269        if privileges.is_empty() {
10270            None
10271        } else {
10272            Some(PrivilegeSpecification::Privileges(privileges))
10273        }
10274    }
10275
10276    /// Bail out if the current token is not a role specification, or consume and return it if it is.
10277    fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10278        let _ = self.parse_keyword(GROUP);
10279        self.parse_identifier()
10280    }
10281
10282    /// Parse a `REASSIGN OWNED` statement, assuming that the `REASSIGN` token
10283    /// has already been consumed.
10284    fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10285        self.expect_keywords(&[OWNED, BY])?;
10286        let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10287        self.expect_keyword(TO)?;
10288        let new_role = self.parse_identifier()?;
10289        Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10290            old_roles,
10291            new_role,
10292        }))
10293    }
10294
10295    fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10296        self.expect_keyword(ON)?;
10297
10298        let object = match self.expect_one_of_keywords(&[
10299            TABLE,
10300            VIEW,
10301            COLUMN,
10302            MATERIALIZED,
10303            SOURCE,
10304            SINK,
10305            INDEX,
10306            FUNCTION,
10307            CONNECTION,
10308            TYPE,
10309            SECRET,
10310            ROLE,
10311            DATABASE,
10312            SCHEMA,
10313            CLUSTER,
10314            NETWORK,
10315        ])? {
10316            TABLE => {
10317                let name = self.parse_raw_name()?;
10318                CommentObjectType::Table { name }
10319            }
10320            VIEW => {
10321                let name = self.parse_raw_name()?;
10322                CommentObjectType::View { name }
10323            }
10324            MATERIALIZED => {
10325                self.expect_keyword(VIEW)?;
10326                let name = self.parse_raw_name()?;
10327                CommentObjectType::MaterializedView { name }
10328            }
10329            SOURCE => {
10330                let name = self.parse_raw_name()?;
10331                CommentObjectType::Source { name }
10332            }
10333            SINK => {
10334                let name = self.parse_raw_name()?;
10335                CommentObjectType::Sink { name }
10336            }
10337            INDEX => {
10338                let name = self.parse_raw_name()?;
10339                CommentObjectType::Index { name }
10340            }
10341            FUNCTION => {
10342                let name = self.parse_raw_name()?;
10343                CommentObjectType::Func { name }
10344            }
10345            CONNECTION => {
10346                let name = self.parse_raw_name()?;
10347                CommentObjectType::Connection { name }
10348            }
10349            TYPE => {
10350                let ty = self.parse_data_type()?;
10351                CommentObjectType::Type { ty }
10352            }
10353            SECRET => {
10354                let name = self.parse_raw_name()?;
10355                CommentObjectType::Secret { name }
10356            }
10357            ROLE => {
10358                let name = self.parse_identifier()?;
10359                CommentObjectType::Role { name }
10360            }
10361            DATABASE => {
10362                let name = self.parse_database_name()?;
10363                CommentObjectType::Database { name }
10364            }
10365            SCHEMA => {
10366                let name = self.parse_schema_name()?;
10367                CommentObjectType::Schema { name }
10368            }
10369            CLUSTER => {
10370                if self.parse_keyword(REPLICA) {
10371                    let name = self.parse_cluster_replica_name()?;
10372                    CommentObjectType::ClusterReplica { name }
10373                } else {
10374                    let name = self.parse_raw_ident()?;
10375                    CommentObjectType::Cluster { name }
10376                }
10377            }
10378            COLUMN => {
10379                let name = self.parse_column_name()?;
10380                CommentObjectType::Column { name }
10381            }
10382            NETWORK => {
10383                self.expect_keyword(POLICY)?;
10384                let name = self.parse_raw_network_policy_name()?;
10385                CommentObjectType::NetworkPolicy { name }
10386            }
10387            _ => unreachable!(),
10388        };
10389
10390        self.expect_keyword(IS)?;
10391        let comment = match self.next_token() {
10392            Some(Token::Keyword(NULL)) => None,
10393            Some(Token::String(s)) => Some(s),
10394            other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10395        };
10396
10397        Ok(Statement::Comment(CommentStatement { object, comment }))
10398    }
10399
10400    pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10401    where
10402        S: TryInto<IdentString>,
10403        <S as TryInto<IdentString>>::Error: fmt::Display,
10404    {
10405        Ident::new(s).map_err(|e| ParserError {
10406            pos: self.peek_prev_pos(),
10407            message: e.to_string(),
10408        })
10409    }
10410}
10411
10412impl CheckedRecursion for Parser<'_> {
10413    fn recursion_guard(&self) -> &RecursionGuard {
10414        &self.recursion_guard
10415    }
10416}
10417
10418/// Represents an expression or query (a "fragment") with parentheses around it,
10419/// when it is unknown whether the fragment belongs to a larger expression or
10420/// query.
10421enum ParenthesizedFragment {
10422    Query(Query<Raw>),
10423    Exprs(Vec<Expr<Raw>>),
10424}
10425
10426impl ParenthesizedFragment {
10427    /// Force the fragment into an expression.
10428    fn into_expr(self) -> Expr<Raw> {
10429        match self {
10430            ParenthesizedFragment::Exprs(exprs) => {
10431                // The `ParenthesizedFragment` represents that there were
10432                // parentheses surrounding `exprs`, so...
10433                if exprs.len() == 1 {
10434                    // ...if there was only one expression, the parentheses
10435                    // were simple nesting...
10436                    Expr::Nested(Box::new(exprs.into_element()))
10437                } else {
10438                    // ...and if there were multiple expressions, the
10439                    // parentheses formed an implicit row constructor.
10440                    Expr::Row { exprs }
10441                }
10442            }
10443            // Queries become subquery expressions.
10444            ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10445        }
10446    }
10447}
10448
10449// Include the `Parser::parse_~` implementations for simple options derived by
10450// the crate's build.rs script.
10451include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));