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