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