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 name = match self.expect_one_of_keywords(&[DETAILS, PUBLICATION, TEXT, EXCLUDE])? {
3862            DETAILS => PgConfigOptionName::Details,
3863            PUBLICATION => PgConfigOptionName::Publication,
3864            TEXT => {
3865                self.expect_keyword(COLUMNS)?;
3866
3867                let _ = self.consume_token(&Token::Eq);
3868
3869                let value = self
3870                    .parse_option_sequence(Parser::parse_item_name)?
3871                    .map(|inner| {
3872                        WithOptionValue::Sequence(
3873                            inner
3874                                .into_iter()
3875                                .map(WithOptionValue::UnresolvedItemName)
3876                                .collect_vec(),
3877                        )
3878                    });
3879
3880                return Ok(PgConfigOption {
3881                    name: PgConfigOptionName::TextColumns,
3882                    value,
3883                });
3884            }
3885            EXCLUDE => {
3886                self.expect_keyword(COLUMNS)?;
3887
3888                let _ = self.consume_token(&Token::Eq);
3889
3890                let value = self
3891                    .parse_option_sequence(Parser::parse_item_name)?
3892                    .map(|inner| {
3893                        WithOptionValue::Sequence(
3894                            inner
3895                                .into_iter()
3896                                .map(WithOptionValue::UnresolvedItemName)
3897                                .collect_vec(),
3898                        )
3899                    });
3900
3901                return Ok(PgConfigOption {
3902                    name: PgConfigOptionName::ExcludeColumns,
3903                    value,
3904                });
3905            }
3906            _ => unreachable!(),
3907        };
3908        Ok(PgConfigOption {
3909            name,
3910            value: self.parse_optional_option_value()?,
3911        })
3912    }
3913
3914    fn parse_mysql_connection_option(&mut self) -> Result<MySqlConfigOption<Raw>, ParserError> {
3915        match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE, IGNORE])? {
3916            DETAILS => Ok(MySqlConfigOption {
3917                name: MySqlConfigOptionName::Details,
3918                value: self.parse_optional_option_value()?,
3919            }),
3920            TEXT => {
3921                self.expect_keyword(COLUMNS)?;
3922
3923                let _ = self.consume_token(&Token::Eq);
3924
3925                let value = self
3926                    .parse_option_sequence(Parser::parse_item_name)?
3927                    .map(|inner| {
3928                        WithOptionValue::Sequence(
3929                            inner
3930                                .into_iter()
3931                                .map(WithOptionValue::UnresolvedItemName)
3932                                .collect_vec(),
3933                        )
3934                    });
3935
3936                Ok(MySqlConfigOption {
3937                    name: MySqlConfigOptionName::TextColumns,
3938                    value,
3939                })
3940            }
3941            // IGNORE is historical syntax for the option.
3942            EXCLUDE | IGNORE => {
3943                self.expect_keyword(COLUMNS)?;
3944
3945                let _ = self.consume_token(&Token::Eq);
3946
3947                let value = self
3948                    .parse_option_sequence(Parser::parse_item_name)?
3949                    .map(|inner| {
3950                        WithOptionValue::Sequence(
3951                            inner
3952                                .into_iter()
3953                                .map(WithOptionValue::UnresolvedItemName)
3954                                .collect_vec(),
3955                        )
3956                    });
3957
3958                Ok(MySqlConfigOption {
3959                    name: MySqlConfigOptionName::ExcludeColumns,
3960                    value,
3961                })
3962            }
3963            _ => unreachable!(),
3964        }
3965    }
3966
3967    fn parse_sql_server_connection_option(
3968        &mut self,
3969    ) -> Result<SqlServerConfigOption<Raw>, ParserError> {
3970        match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE])? {
3971            DETAILS => Ok(SqlServerConfigOption {
3972                name: SqlServerConfigOptionName::Details,
3973                value: self.parse_optional_option_value()?,
3974            }),
3975            TEXT => {
3976                self.expect_keyword(COLUMNS)?;
3977
3978                let _ = self.consume_token(&Token::Eq);
3979
3980                let value = self
3981                    .parse_option_sequence(Parser::parse_item_name)?
3982                    .map(|inner| {
3983                        WithOptionValue::Sequence(
3984                            inner
3985                                .into_iter()
3986                                .map(WithOptionValue::UnresolvedItemName)
3987                                .collect_vec(),
3988                        )
3989                    });
3990
3991                Ok(SqlServerConfigOption {
3992                    name: SqlServerConfigOptionName::TextColumns,
3993                    value,
3994                })
3995            }
3996            EXCLUDE => {
3997                self.expect_keyword(COLUMNS)?;
3998
3999                let _ = self.consume_token(&Token::Eq);
4000
4001                let value = self
4002                    .parse_option_sequence(Parser::parse_item_name)?
4003                    .map(|inner| {
4004                        WithOptionValue::Sequence(
4005                            inner
4006                                .into_iter()
4007                                .map(WithOptionValue::UnresolvedItemName)
4008                                .collect_vec(),
4009                        )
4010                    });
4011
4012                Ok(SqlServerConfigOption {
4013                    name: SqlServerConfigOptionName::ExcludeColumns,
4014                    value,
4015                })
4016            }
4017            _ => unreachable!(),
4018        }
4019    }
4020
4021    fn parse_load_generator_option(&mut self) -> Result<LoadGeneratorOption<Raw>, ParserError> {
4022        let name = match self.expect_one_of_keywords(&[
4023            AS,
4024            UP,
4025            SCALE,
4026            TICK,
4027            MAX,
4028            KEYS,
4029            SNAPSHOT,
4030            TRANSACTIONAL,
4031            VALUE,
4032            SEED,
4033            PARTITIONS,
4034            BATCH,
4035        ])? {
4036            AS => {
4037                self.expect_keyword(OF)?;
4038                LoadGeneratorOptionName::AsOf
4039            }
4040            UP => {
4041                self.expect_keyword(TO)?;
4042                LoadGeneratorOptionName::UpTo
4043            }
4044            SCALE => {
4045                self.expect_keyword(FACTOR)?;
4046                LoadGeneratorOptionName::ScaleFactor
4047            }
4048            TICK => {
4049                self.expect_keyword(INTERVAL)?;
4050                LoadGeneratorOptionName::TickInterval
4051            }
4052            MAX => {
4053                self.expect_keyword(CARDINALITY)?;
4054                LoadGeneratorOptionName::MaxCardinality
4055            }
4056            KEYS => LoadGeneratorOptionName::Keys,
4057            SNAPSHOT => {
4058                self.expect_keyword(ROUNDS)?;
4059                LoadGeneratorOptionName::SnapshotRounds
4060            }
4061            TRANSACTIONAL => {
4062                self.expect_keyword(SNAPSHOT)?;
4063                LoadGeneratorOptionName::TransactionalSnapshot
4064            }
4065            VALUE => {
4066                self.expect_keyword(SIZE)?;
4067                LoadGeneratorOptionName::ValueSize
4068            }
4069            SEED => LoadGeneratorOptionName::Seed,
4070            PARTITIONS => LoadGeneratorOptionName::Partitions,
4071            BATCH => {
4072                self.expect_keyword(SIZE)?;
4073                LoadGeneratorOptionName::BatchSize
4074            }
4075            _ => unreachable!(),
4076        };
4077
4078        let _ = self.consume_token(&Token::Eq);
4079        Ok(LoadGeneratorOption {
4080            name,
4081            value: self.parse_optional_option_value()?,
4082        })
4083    }
4084
4085    fn parse_create_kafka_sink_connection(
4086        &mut self,
4087    ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4088        self.expect_keyword(CONNECTION)?;
4089
4090        let connection = self.parse_raw_name()?;
4091
4092        let options = if self.consume_token(&Token::LParen) {
4093            let options = self.parse_comma_separated(Parser::parse_kafka_sink_config_option)?;
4094            self.expect_token(&Token::RParen)?;
4095            options
4096        } else {
4097            vec![]
4098        };
4099
4100        // one token of lookahead:
4101        // * `KEY (` means we're parsing a list of columns for the key
4102        // * `KEY FORMAT` means there is no key, we'll parse a KeyValueFormat later
4103        let key =
4104            if self.peek_keyword(KEY) && self.peek_nth_token(1) != Some(Token::Keyword(FORMAT)) {
4105                let _ = self.expect_keyword(KEY);
4106                let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4107
4108                let not_enforced = if self.peek_keywords(&[NOT, ENFORCED]) {
4109                    self.expect_keywords(&[NOT, ENFORCED])?;
4110                    true
4111                } else {
4112                    false
4113                };
4114                Some(SinkKey {
4115                    key_columns,
4116                    not_enforced,
4117                })
4118            } else {
4119                None
4120            };
4121
4122        let headers = if self.parse_keyword(HEADERS) {
4123            Some(self.parse_identifier()?)
4124        } else {
4125            None
4126        };
4127
4128        Ok(CreateSinkConnection::Kafka {
4129            connection,
4130            options,
4131            key,
4132            headers,
4133        })
4134    }
4135
4136    fn parse_create_iceberg_sink_connection(
4137        &mut self,
4138    ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4139        self.expect_keyword(CONNECTION)?;
4140        let catalog_connection = self.parse_raw_name()?;
4141
4142        let options = if self.consume_token(&Token::LParen) {
4143            let options = self.parse_comma_separated(Parser::parse_iceberg_sink_config_option)?;
4144            self.expect_token(&Token::RParen)?;
4145            options
4146        } else {
4147            vec![]
4148        };
4149
4150        let aws_connection = if self.parse_keywords(&[USING, AWS, CONNECTION]) {
4151            Some(self.parse_raw_name()?)
4152        } else {
4153            None
4154        };
4155
4156        let key = if self.parse_keyword(KEY) {
4157            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4158
4159            let not_enforced = self.parse_keywords(&[NOT, ENFORCED]);
4160            Some(SinkKey {
4161                key_columns,
4162                not_enforced,
4163            })
4164        } else {
4165            None
4166        };
4167
4168        Ok(CreateSinkConnection::Iceberg {
4169            catalog_connection,
4170            aws_connection,
4171            key,
4172            options,
4173        })
4174    }
4175
4176    fn parse_create_sink_connection(&mut self) -> Result<CreateSinkConnection<Raw>, ParserError> {
4177        match self.expect_one_of_keywords(&[KAFKA, ICEBERG])? {
4178            KAFKA => self.parse_create_kafka_sink_connection(),
4179            ICEBERG => {
4180                self.expect_keyword(CATALOG)?;
4181                self.parse_create_iceberg_sink_connection()
4182            }
4183            _ => unreachable!(),
4184        }
4185    }
4186
4187    fn parse_create_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4188        let mut if_exists = if self.parse_keyword(OR) {
4189            self.expect_keyword(REPLACE)?;
4190            IfExistsBehavior::Replace
4191        } else {
4192            IfExistsBehavior::Error
4193        };
4194        let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
4195        self.expect_keyword(VIEW)?;
4196        if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4197            if_exists = IfExistsBehavior::Skip;
4198        }
4199
4200        let definition = self.parse_view_definition()?;
4201        Ok(Statement::CreateView(CreateViewStatement {
4202            temporary,
4203            if_exists,
4204            definition,
4205        }))
4206    }
4207
4208    fn parse_view_definition(&mut self) -> Result<ViewDefinition<Raw>, ParserError> {
4209        // ANSI SQL and Postgres support RECURSIVE here, but we don't.
4210        let name = self.parse_item_name()?;
4211        let columns = self.parse_parenthesized_column_list(Optional)?;
4212        // Postgres supports WITH options here, but we don't.
4213        self.expect_keyword(AS)?;
4214        let query = self.parse_query()?;
4215        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
4216        Ok(ViewDefinition {
4217            name,
4218            columns,
4219            query,
4220        })
4221    }
4222
4223    fn parse_create_materialized_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4224        let mut if_exists = if self.parse_keyword(OR) {
4225            self.expect_keyword(REPLACE)?;
4226            IfExistsBehavior::Replace
4227        } else {
4228            IfExistsBehavior::Error
4229        };
4230        let replacement = self.parse_keyword(REPLACEMENT);
4231        self.expect_keywords(&[MATERIALIZED, VIEW])?;
4232        if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4233            if_exists = IfExistsBehavior::Skip;
4234        }
4235
4236        let name = self.parse_item_name()?;
4237        let columns = self.parse_parenthesized_column_list(Optional)?;
4238        let replacement_for = if replacement {
4239            self.expect_keyword(FOR)?;
4240            Some(self.parse_raw_name()?)
4241        } else {
4242            None
4243        };
4244        let (in_cluster, in_cluster_replica) = if self.parse_keywords(&[IN, CLUSTER]) {
4245            let cluster = self.parse_raw_ident()?;
4246            let replica = if self.parse_keyword(REPLICA) {
4247                Some(self.parse_identifier()?)
4248            } else {
4249                None
4250            };
4251            (Some(cluster), replica)
4252        } else if self.parse_keywords(&[IN, REPLICA]) {
4253            let replica = self.parse_identifier()?;
4254            (None, Some(replica))
4255        } else {
4256            (None, None)
4257        };
4258
4259        let with_options = if self.parse_keyword(WITH) {
4260            self.expect_token(&Token::LParen)?;
4261            let options = self.parse_comma_separated(Parser::parse_materialized_view_option)?;
4262            self.expect_token(&Token::RParen)?;
4263            options
4264        } else {
4265            vec![]
4266        };
4267
4268        self.expect_keyword(AS)?;
4269        let query = self.parse_query()?;
4270        let as_of = self.parse_optional_internal_as_of()?;
4271
4272        Ok(Statement::CreateMaterializedView(
4273            CreateMaterializedViewStatement {
4274                if_exists,
4275                name,
4276                columns,
4277                replacement_for,
4278                in_cluster,
4279                in_cluster_replica,
4280                query,
4281                as_of,
4282                with_options,
4283            },
4284        ))
4285    }
4286
4287    fn parse_materialized_view_option_name(
4288        &mut self,
4289    ) -> Result<MaterializedViewOptionName, ParserError> {
4290        let option = self.expect_one_of_keywords(&[ASSERT, PARTITION, RETAIN, REFRESH])?;
4291        let name = match option {
4292            ASSERT => {
4293                self.expect_keywords(&[NOT, NULL])?;
4294                MaterializedViewOptionName::AssertNotNull
4295            }
4296            PARTITION => {
4297                self.expect_keyword(BY)?;
4298                MaterializedViewOptionName::PartitionBy
4299            }
4300            RETAIN => {
4301                self.expect_keyword(HISTORY)?;
4302                MaterializedViewOptionName::RetainHistory
4303            }
4304            REFRESH => MaterializedViewOptionName::Refresh,
4305            _ => unreachable!(),
4306        };
4307        Ok(name)
4308    }
4309
4310    fn parse_materialized_view_option(
4311        &mut self,
4312    ) -> Result<MaterializedViewOption<Raw>, ParserError> {
4313        let name = self.parse_materialized_view_option_name()?;
4314        let value = match name {
4315            MaterializedViewOptionName::RetainHistory => self.parse_option_retain_history()?,
4316            MaterializedViewOptionName::Refresh => {
4317                Some(self.parse_materialized_view_refresh_option_value()?)
4318            }
4319            _ => self.parse_optional_option_value()?,
4320        };
4321        Ok(MaterializedViewOption { name, value })
4322    }
4323
4324    fn parse_option_retain_history(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
4325        Ok(Some(self.parse_retain_history()?))
4326    }
4327
4328    fn parse_retain_history(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
4329        let _ = self.consume_token(&Token::Eq);
4330        self.expect_keyword(FOR)?;
4331        let value = self.parse_value()?;
4332        Ok(WithOptionValue::RetainHistoryFor(value))
4333    }
4334
4335    fn parse_materialized_view_refresh_option_value(
4336        &mut self,
4337    ) -> Result<WithOptionValue<Raw>, ParserError> {
4338        let _ = self.consume_token(&Token::Eq);
4339
4340        match self.expect_one_of_keywords(&[ON, AT, EVERY])? {
4341            ON => {
4342                self.expect_keyword(COMMIT)?;
4343                Ok(WithOptionValue::Refresh(RefreshOptionValue::OnCommit))
4344            }
4345            AT => {
4346                if self.parse_keyword(CREATION) {
4347                    Ok(WithOptionValue::Refresh(RefreshOptionValue::AtCreation))
4348                } else {
4349                    Ok(WithOptionValue::Refresh(RefreshOptionValue::At(
4350                        RefreshAtOptionValue {
4351                            time: self.parse_expr()?,
4352                        },
4353                    )))
4354                }
4355            }
4356            EVERY => {
4357                let interval = self.parse_interval_value()?;
4358                let aligned_to = if self.parse_keywords(&[ALIGNED, TO]) {
4359                    Some(self.parse_expr()?)
4360                } else {
4361                    None
4362                };
4363                Ok(WithOptionValue::Refresh(RefreshOptionValue::Every(
4364                    RefreshEveryOptionValue {
4365                        interval,
4366                        aligned_to,
4367                    },
4368                )))
4369            }
4370            _ => unreachable!(),
4371        }
4372    }
4373
4374    fn parse_create_index(&mut self) -> Result<Statement<Raw>, ParserError> {
4375        let default_index = self.parse_keyword(DEFAULT);
4376        self.expect_keyword(INDEX)?;
4377
4378        let if_not_exists = self.parse_if_not_exists()?;
4379        let name = if self.peek_keyword(IN) || self.peek_keyword(ON) {
4380            if if_not_exists && !default_index {
4381                return self.expected(self.peek_pos(), "index name", self.peek_token());
4382            }
4383            None
4384        } else {
4385            Some(self.parse_identifier()?)
4386        };
4387        let in_cluster = self.parse_optional_in_cluster()?;
4388        self.expect_keyword(ON)?;
4389        let on_name = self.parse_raw_name()?;
4390
4391        // Arrangements are the only index type we support, so we can just ignore this
4392        if self.parse_keyword(USING) {
4393            self.expect_keyword(ARRANGEMENT)?;
4394        }
4395
4396        let key_parts = if default_index {
4397            None
4398        } else {
4399            self.expect_token(&Token::LParen)?;
4400            if self.consume_token(&Token::RParen) {
4401                Some(vec![])
4402            } else {
4403                let key_parts = self
4404                    .parse_comma_separated(Parser::parse_order_by_expr)?
4405                    .into_iter()
4406                    .map(|x| x.expr)
4407                    .collect::<Vec<_>>();
4408                self.expect_token(&Token::RParen)?;
4409                Some(key_parts)
4410            }
4411        };
4412
4413        let with_options = if self.parse_keyword(WITH) {
4414            self.expect_token(&Token::LParen)?;
4415            let o = if matches!(self.peek_token(), Some(Token::RParen)) {
4416                vec![]
4417            } else {
4418                self.parse_comma_separated(Parser::parse_index_option)?
4419            };
4420            self.expect_token(&Token::RParen)?;
4421            o
4422        } else {
4423            vec![]
4424        };
4425
4426        Ok(Statement::CreateIndex(CreateIndexStatement {
4427            name,
4428            in_cluster,
4429            on_name,
4430            key_parts,
4431            with_options,
4432            if_not_exists,
4433        }))
4434    }
4435
4436    fn parse_table_option_name(&mut self) -> Result<TableOptionName, ParserError> {
4437        // this is only so we can test redacted values, of which no other
4438        // examples exist as of its introduction.
4439        if self.parse_keyword(REDACTED) {
4440            return Ok(TableOptionName::RedactedTest);
4441        }
4442        let name = match self.expect_one_of_keywords(&[PARTITION, RETAIN])? {
4443            PARTITION => {
4444                self.expect_keyword(BY)?;
4445                TableOptionName::PartitionBy
4446            }
4447            RETAIN => {
4448                self.expect_keyword(HISTORY)?;
4449                TableOptionName::RetainHistory
4450            }
4451            _ => unreachable!(),
4452        };
4453        Ok(name)
4454    }
4455
4456    fn parse_table_option(&mut self) -> Result<TableOption<Raw>, ParserError> {
4457        let name = self.parse_table_option_name()?;
4458        let value = match name {
4459            TableOptionName::PartitionBy => self.parse_optional_option_value(),
4460            TableOptionName::RetainHistory => self.parse_option_retain_history(),
4461            TableOptionName::RedactedTest => self.parse_optional_option_value(),
4462        }?;
4463        Ok(TableOption { name, value })
4464    }
4465
4466    fn parse_index_option_name(&mut self) -> Result<IndexOptionName, ParserError> {
4467        self.expect_keywords(&[RETAIN, HISTORY])?;
4468        Ok(IndexOptionName::RetainHistory)
4469    }
4470
4471    fn parse_index_option(&mut self) -> Result<IndexOption<Raw>, ParserError> {
4472        let name = self.parse_index_option_name()?;
4473        let value = match name {
4474            IndexOptionName::RetainHistory => self.parse_option_retain_history(),
4475        }?;
4476        Ok(IndexOption { name, value })
4477    }
4478
4479    fn parse_raw_ident(&mut self) -> Result<RawClusterName, ParserError> {
4480        if self.consume_token(&Token::LBracket) {
4481            let id = self.parse_raw_ident_str()?;
4482            self.expect_token(&Token::RBracket)?;
4483            Ok(RawClusterName::Resolved(id))
4484        } else {
4485            Ok(RawClusterName::Unresolved(self.parse_identifier()?))
4486        }
4487    }
4488
4489    fn parse_raw_network_policy_name(&mut self) -> Result<RawNetworkPolicyName, ParserError> {
4490        if self.consume_token(&Token::LBracket) {
4491            let id = self.parse_raw_ident_str()?;
4492            self.expect_token(&Token::RBracket)?;
4493            Ok(RawNetworkPolicyName::Resolved(id))
4494        } else {
4495            Ok(RawNetworkPolicyName::Unresolved(self.parse_identifier()?))
4496        }
4497    }
4498
4499    fn parse_raw_ident_str(&mut self) -> Result<String, ParserError> {
4500        let id = match self.next_token() {
4501            Some(Token::Ident(id)) => id.into_inner(),
4502            Some(Token::Number(n)) => n,
4503            _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4504        };
4505        // A resolved name renders as `[id]`; an empty id (e.g. `[""]`) would
4506        // display as `[]` and fail to reparse. Reject it.
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                TIME => {
7356                    if self.parse_keyword(WITH) {
7357                        self.expect_keywords(&[TIME, ZONE])?;
7358                        other(ident!("timetz"))
7359                    } else {
7360                        if self.parse_keyword(WITHOUT) {
7361                            self.expect_keywords(&[TIME, ZONE])?;
7362                        }
7363                        other(ident!("time"))
7364                    }
7365                }
7366                TIMESTAMP => {
7367                    let typ_mod = self.parse_timestamp_precision()?;
7368                    if self.parse_keyword(WITH) {
7369                        self.expect_keywords(&[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 = match self.next_token() {
7545                Some(Token::Ident(id)) => id.into_inner(),
7546                _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7547            };
7548            self.expect_keyword(AS)?;
7549            let name = self.parse_item_name()?;
7550            // TODO(justin): is there a more idiomatic way to detect a fully-qualified name?
7551            if name.0.len() < 2 {
7552                return parser_err!(
7553                    self,
7554                    self.peek_prev_pos(),
7555                    "table name in square brackets must be fully qualified"
7556                );
7557            }
7558
7559            let version = if self.parse_keywords(&[VERSION]) {
7560                let version = self.parse_version()?;
7561                Some(version)
7562            } else {
7563                None
7564            };
7565
7566            self.expect_token(&Token::RBracket)?;
7567            Ok(RawItemName::Id(id, name, version))
7568        } else {
7569            Ok(RawItemName::Name(self.parse_item_name()?))
7570        }
7571    }
7572
7573    fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7574        let start = self.peek_pos();
7575        let mut item_name = self.parse_raw_name()?;
7576        let column_name = match &mut item_name {
7577            RawItemName::Name(UnresolvedItemName(identifiers)) => {
7578                if identifiers.len() < 2 {
7579                    return Err(ParserError::new(
7580                        start,
7581                        "need to specify an object and a column",
7582                    ));
7583                }
7584                identifiers.pop().unwrap()
7585            }
7586            RawItemName::Id(_, _, _) => {
7587                self.expect_token(&Token::Dot)?;
7588                self.parse_identifier()?
7589            }
7590        };
7591
7592        Ok(ColumnName {
7593            relation: item_name,
7594            column: column_name,
7595        })
7596    }
7597
7598    /// Parse a possibly quoted database identifier, e.g.
7599    /// `foo` or `"mydatabase"`
7600    fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7601        Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7602    }
7603
7604    /// Parse a possibly qualified, possibly quoted schema identifier, e.g.
7605    /// `foo` or `mydatabase."schema"`
7606    fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7607        Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7608    }
7609
7610    /// Parse a possibly qualified, possibly quoted object identifier, e.g.
7611    /// `foo` or `myschema."table"`
7612    fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7613        Ok(UnresolvedItemName(self.parse_identifiers()?))
7614    }
7615
7616    /// Parse an object name.
7617    fn parse_object_name(
7618        &mut self,
7619        object_type: ObjectType,
7620    ) -> Result<UnresolvedObjectName, ParserError> {
7621        Ok(match object_type {
7622            ObjectType::Table
7623            | ObjectType::View
7624            | ObjectType::MaterializedView
7625            | ObjectType::Source
7626            | ObjectType::Subsource
7627            | ObjectType::Sink
7628            | ObjectType::MetricSink
7629            | ObjectType::Index
7630            | ObjectType::Type
7631            | ObjectType::Secret
7632            | ObjectType::Connection
7633            | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7634            ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7635            ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7636            ObjectType::ClusterReplica => {
7637                UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7638            }
7639            ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7640            ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7641            ObjectType::NetworkPolicy => {
7642                UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7643            }
7644        })
7645    }
7646
7647    ///Parse one or more simple one-word identifiers separated by a '.'
7648    fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7649        let mut idents = vec![];
7650        loop {
7651            idents.push(self.parse_identifier()?);
7652            if !self.consume_token(&Token::Dot) {
7653                break;
7654            }
7655        }
7656        Ok(idents)
7657    }
7658
7659    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
7660    fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7661        match self.consume_identifier()? {
7662            Some(id) => {
7663                if id.as_str().is_empty() {
7664                    return parser_err!(
7665                        self,
7666                        self.peek_prev_pos(),
7667                        "zero-length delimited identifier",
7668                    );
7669                }
7670                Ok(id)
7671            }
7672            None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7673        }
7674    }
7675
7676    fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7677        match self.peek_token() {
7678            Some(Token::Keyword(kw)) => {
7679                self.next_token();
7680                Ok(Some(kw.into()))
7681            }
7682            Some(Token::Ident(id)) => {
7683                self.next_token();
7684                Ok(Some(self.new_identifier(id)?))
7685            }
7686            _ => Ok(None),
7687        }
7688    }
7689
7690    fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7691        let mut id_parts = vec![id];
7692        match self.peek_token() {
7693            Some(Token::LParen) | Some(Token::Dot) => {
7694                let mut ends_with_wildcard = false;
7695                while self.consume_token(&Token::Dot) {
7696                    match self.next_token() {
7697                        Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7698                        Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7699                        Some(Token::Star) => {
7700                            ends_with_wildcard = true;
7701                            break;
7702                        }
7703                        unexpected => {
7704                            return self.expected(
7705                                self.peek_prev_pos(),
7706                                "an identifier or a '*' after '.'",
7707                                unexpected,
7708                            );
7709                        }
7710                    }
7711                }
7712                if ends_with_wildcard {
7713                    Ok(Expr::QualifiedWildcard(id_parts))
7714                } else if self.peek_token() == Some(Token::LParen) {
7715                    let function =
7716                        self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7717                    Ok(Expr::Function(function))
7718                } else {
7719                    Ok(Expr::Identifier(id_parts))
7720                }
7721            }
7722            _ => Ok(Expr::Identifier(id_parts)),
7723        }
7724    }
7725
7726    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
7727    fn parse_parenthesized_column_list(
7728        &mut self,
7729        optional: IsOptional,
7730    ) -> Result<Vec<Ident>, ParserError> {
7731        if self.consume_token(&Token::LParen) {
7732            let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7733            self.expect_token(&Token::RParen)?;
7734            Ok(cols)
7735        } else if optional == Optional {
7736            Ok(vec![])
7737        } else {
7738            self.expected(
7739                self.peek_pos(),
7740                "a list of columns in parentheses",
7741                self.peek_token(),
7742            )
7743        }
7744    }
7745
7746    fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7747        if self.consume_token(&Token::LParen) {
7748            let n = self.parse_literal_uint()?;
7749            self.expect_token(&Token::RParen)?;
7750            Ok(Some(n))
7751        } else {
7752            Ok(None)
7753        }
7754    }
7755
7756    fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7757        self.expect_token(&Token::LBracket)?;
7758        let key_type = Box::new(self.parse_data_type()?);
7759        self.expect_token(&Token::Arrow)?;
7760        let value_type = Box::new(self.parse_data_type()?);
7761        self.expect_token(&Token::RBracket)?;
7762        Ok(RawDataType::Map {
7763            key_type,
7764            value_type,
7765        })
7766    }
7767
7768    fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7769        self.expect_keyword(FROM)?;
7770        let table_name = RawItemName::Name(self.parse_item_name()?);
7771        let alias = self.parse_optional_table_alias()?;
7772        let using = if self.parse_keyword(USING) {
7773            self.parse_comma_separated(Parser::parse_table_and_joins)?
7774        } else {
7775            vec![]
7776        };
7777        let selection = if self.parse_keyword(WHERE) {
7778            Some(self.parse_expr()?)
7779        } else {
7780            None
7781        };
7782
7783        Ok(Statement::Delete(DeleteStatement {
7784            table_name,
7785            alias,
7786            using,
7787            selection,
7788        }))
7789    }
7790
7791    /// Parses a SELECT (or WITH, VALUES, TABLE) statement with optional AS OF.
7792    fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7793        Ok(SelectStatement {
7794            query: self.parse_query()?,
7795            as_of: self.parse_optional_as_of()?,
7796        })
7797    }
7798
7799    /// Parse a query expression, i.e. a `SELECT` statement optionally
7800    /// preceded with some `WITH` CTE declarations and optionally followed
7801    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
7802    /// expect the initial keyword to be already consumed
7803    fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7804        self.checked_recur_mut(|parser| {
7805            let cte_block = if parser.parse_keyword(WITH) {
7806                if parser.parse_keyword(MUTUALLY) {
7807                    parser.expect_keyword(RECURSIVE)?;
7808                    let options = if parser.consume_token(&Token::LParen) {
7809                        let options =
7810                            parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7811                        parser.expect_token(&Token::RParen)?;
7812                        options
7813                    } else {
7814                        vec![]
7815                    };
7816                    CteBlock::MutuallyRecursive(MutRecBlock {
7817                        options,
7818                        ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7819                    })
7820                } else {
7821                    // TODO: optional RECURSIVE
7822                    CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7823                }
7824            } else {
7825                CteBlock::empty()
7826            };
7827
7828            let body = parser.parse_query_body(SetPrecedence::Zero)?;
7829
7830            parser.parse_query_tail(cte_block, body)
7831        })
7832    }
7833
7834    fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7835        match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7836            RECURSION => {
7837                self.expect_keyword(LIMIT)?;
7838                Ok(MutRecBlockOption {
7839                    name: MutRecBlockOptionName::RecursionLimit,
7840                    value: self.parse_optional_option_value()?,
7841                })
7842            }
7843            RETURN => {
7844                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7845                Ok(MutRecBlockOption {
7846                    name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7847                    value: self.parse_optional_option_value()?,
7848                })
7849            }
7850            ERROR => {
7851                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7852                Ok(MutRecBlockOption {
7853                    name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7854                    value: self.parse_optional_option_value()?,
7855                })
7856            }
7857            _ => unreachable!(),
7858        }
7859    }
7860
7861    fn parse_query_tail(
7862        &mut self,
7863        ctes: CteBlock<Raw>,
7864        body: SetExpr<Raw>,
7865    ) -> Result<Query<Raw>, ParserError> {
7866        let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7867            SetExpr::Query(query) => {
7868                let Query {
7869                    ctes,
7870                    body,
7871                    order_by,
7872                    limit,
7873                    offset,
7874                } = *query;
7875                (ctes, order_by, limit, offset, body)
7876            }
7877            _ => (CteBlock::empty(), vec![], None, None, body),
7878        };
7879
7880        let ctes = if ctes.is_empty() {
7881            inner_ctes
7882        } else if !inner_ctes.is_empty() {
7883            return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7884        } else {
7885            ctes
7886        };
7887
7888        let order_by = if self.parse_keywords(&[ORDER, BY]) {
7889            if !inner_order_by.is_empty() {
7890                return parser_err!(
7891                    self,
7892                    self.peek_prev_pos(),
7893                    "multiple ORDER BY clauses not allowed"
7894                );
7895            }
7896            self.parse_comma_separated(Parser::parse_order_by_expr)?
7897        } else {
7898            inner_order_by
7899        };
7900
7901        // Parse LIMIT, FETCH, OFFSET in any order, but:
7902        // - Only at most one of LIMIT or FETCH is allowed.
7903        // - Only at most one occurrence is allowed from each of these.
7904        let mut limit = inner_limit;
7905        let mut offset = inner_offset;
7906        while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7907            match parsed_keyword {
7908                LIMIT => {
7909                    if limit.is_some() {
7910                        return parser_err!(
7911                            self,
7912                            self.peek_prev_pos(),
7913                            "multiple LIMIT/FETCH clauses not allowed"
7914                        );
7915                    }
7916                    limit = if self.parse_keyword(ALL) {
7917                        None
7918                    } else {
7919                        Some(Limit {
7920                            with_ties: false,
7921                            quantity: self.parse_expr()?,
7922                        })
7923                    };
7924                }
7925                OFFSET => {
7926                    if offset.is_some() {
7927                        return parser_err!(
7928                            self,
7929                            self.peek_prev_pos(),
7930                            "multiple OFFSET clauses not allowed"
7931                        );
7932                    }
7933                    let value = self.parse_expr()?;
7934                    let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7935                    offset = Some(value);
7936                }
7937                FETCH => {
7938                    if limit.is_some() {
7939                        return parser_err!(
7940                            self,
7941                            self.peek_prev_pos(),
7942                            "multiple LIMIT/FETCH clauses not allowed"
7943                        );
7944                    }
7945                    self.expect_one_of_keywords(&[FIRST, NEXT])?;
7946                    let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7947                        Expr::Value(Value::Number('1'.into()))
7948                    } else {
7949                        let quantity = self.parse_expr()?;
7950                        self.expect_one_of_keywords(&[ROW, ROWS])?;
7951                        quantity
7952                    };
7953                    let with_ties = if self.parse_keyword(ONLY) {
7954                        false
7955                    } else if self.parse_keywords(&[WITH, TIES]) {
7956                        true
7957                    } else {
7958                        return self.expected(
7959                            self.peek_pos(),
7960                            "one of ONLY or WITH TIES",
7961                            self.peek_token(),
7962                        );
7963                    };
7964                    limit = Some(Limit {
7965                        with_ties,
7966                        quantity,
7967                    });
7968                }
7969                _ => unreachable!(),
7970            }
7971        }
7972
7973        Ok(Query {
7974            ctes,
7975            body,
7976            order_by,
7977            limit,
7978            offset,
7979        })
7980    }
7981
7982    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
7983    fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7984        let alias = TableAlias {
7985            name: self.parse_identifier()?,
7986            columns: self.parse_parenthesized_column_list(Optional)?,
7987            strict: false,
7988        };
7989        self.expect_keyword(AS)?;
7990        self.expect_token(&Token::LParen)?;
7991        let query = self.parse_query()?;
7992        self.expect_token(&Token::RParen)?;
7993        Ok(Cte {
7994            alias,
7995            query,
7996            id: (),
7997        })
7998    }
7999
8000    /// Parse a mutually recursive CTE (`alias ( col1: typ1, col2: typ2, ... ) AS (subquery)`).
8001    ///
8002    /// The main distinction from `parse_cte` is that the column names and types are mandatory.
8003    /// This is not how SQL works for `WITH RECURSIVE`, but we are doing it for now to make the
8004    /// query interpretation that much easier.
8005    fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
8006        let name = self.parse_identifier()?;
8007        self.expect_token(&Token::LParen)?;
8008        let columns = self.parse_comma_separated(|parser| {
8009            Ok(CteMutRecColumnDef {
8010                name: parser.parse_identifier()?,
8011                data_type: parser.parse_data_type()?,
8012            })
8013        })?;
8014        self.expect_token(&Token::RParen)?;
8015        self.expect_keyword(AS)?;
8016        self.expect_token(&Token::LParen)?;
8017        let query = self.parse_query()?;
8018        self.expect_token(&Token::RParen)?;
8019        Ok(CteMutRec {
8020            name,
8021            columns,
8022            query,
8023            id: (),
8024        })
8025    }
8026
8027    /// Parse a "query body", which is an expression with roughly the
8028    /// following grammar:
8029    /// ```text
8030    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
8031    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
8032    ///   subquery ::= query_body [ order_by_limit ]
8033    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
8034    /// ```
8035    fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
8036        // We parse the expression using a Pratt parser, as in `parse_expr()`.
8037        // Start by parsing a restricted SELECT or a `(subquery)`:
8038        let expr = if self.parse_keyword(SELECT) {
8039            SetExpr::Select(Box::new(self.parse_select()?))
8040        } else if self.consume_token(&Token::LParen) {
8041            // CTEs are not allowed here, but the parser currently accepts them
8042            let subquery = self.parse_query()?;
8043            self.expect_token(&Token::RParen)?;
8044            SetExpr::Query(Box::new(subquery))
8045        } else if self.parse_keyword(VALUES) {
8046            SetExpr::Values(self.parse_values()?)
8047        } else if self.parse_keyword(SHOW) {
8048            SetExpr::Show(self.parse_show()?)
8049        } else if self.parse_keyword(TABLE) {
8050            SetExpr::Table(self.parse_raw_name()?)
8051        } else {
8052            return self.expected(
8053                self.peek_pos(),
8054                "SELECT, VALUES, or a subquery in the query body",
8055                self.peek_token(),
8056            );
8057        };
8058
8059        self.parse_query_body_seeded(precedence, expr)
8060    }
8061
8062    fn parse_query_body_seeded(
8063        &mut self,
8064        precedence: SetPrecedence,
8065        mut expr: SetExpr<Raw>,
8066    ) -> Result<SetExpr<Raw>, ParserError> {
8067        loop {
8068            // The query can be optionally followed by a set operator:
8069            let next_token = self.peek_token();
8070            let op = self.parse_set_operator(&next_token);
8071            let next_precedence = match op {
8072                // UNION and EXCEPT have the same precedence and evaluate left-to-right
8073                Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
8074                // INTERSECT has higher precedence than UNION/EXCEPT
8075                Some(SetOperator::Intersect) => SetPrecedence::Intersect,
8076                // Unexpected token or EOF => stop parsing the query body
8077                None => break,
8078            };
8079            if precedence >= next_precedence {
8080                break;
8081            }
8082            self.next_token(); // skip past the set operator
8083
8084            let all = self.parse_keyword(ALL);
8085            let distinct = self.parse_keyword(DISTINCT);
8086            if all && distinct {
8087                return parser_err!(
8088                    self,
8089                    self.peek_prev_pos(),
8090                    "Cannot specify both ALL and DISTINCT in set operation"
8091                );
8092            }
8093            expr = SetExpr::SetOperation {
8094                left: Box::new(expr),
8095                op: op.unwrap(),
8096                all,
8097                right: Box::new(self.parse_query_body(next_precedence)?),
8098            };
8099        }
8100
8101        Ok(expr)
8102    }
8103
8104    fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
8105        match token {
8106            Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
8107            Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
8108            Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
8109            _ => None,
8110        }
8111    }
8112
8113    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
8114    /// assuming the initial `SELECT` was already consumed
8115    fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
8116        let all = self.parse_keyword(ALL);
8117        let distinct = self.parse_keyword(DISTINCT);
8118        if all && distinct {
8119            return parser_err!(
8120                self,
8121                self.peek_prev_pos(),
8122                "Cannot specify both ALL and DISTINCT in SELECT"
8123            );
8124        }
8125        let distinct = if distinct && self.parse_keyword(ON) {
8126            self.expect_token(&Token::LParen)?;
8127            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
8128            self.expect_token(&Token::RParen)?;
8129            Some(Distinct::On(exprs))
8130        } else if distinct {
8131            Some(Distinct::EntireRow)
8132        } else {
8133            None
8134        };
8135
8136        let projection = match self.peek_token() {
8137            // An empty target list is permissible to match PostgreSQL, which
8138            // permits these for symmetry with zero column tables. We need
8139            // to sniff out `AS` here specially to support `SELECT AS OF ...`.
8140            Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
8141            Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
8142            _ => {
8143                let mut projection = vec![];
8144                loop {
8145                    projection.push(self.parse_select_item()?);
8146                    if !self.consume_token(&Token::Comma) {
8147                        break;
8148                    }
8149                    if self.peek_keyword(FROM) {
8150                        return parser_err!(
8151                            self,
8152                            self.peek_prev_pos(),
8153                            "invalid trailing comma in SELECT list",
8154                        );
8155                    }
8156                }
8157                projection
8158            }
8159        };
8160
8161        // Note that for keywords to be properly handled here, they need to be
8162        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
8163        // otherwise they may be parsed as an alias as part of the `projection`
8164        // or `from`.
8165
8166        let from = if self.parse_keyword(FROM) {
8167            self.parse_comma_separated(Parser::parse_table_and_joins)?
8168        } else {
8169            vec![]
8170        };
8171
8172        let selection = if self.parse_keyword(WHERE) {
8173            Some(self.parse_expr()?)
8174        } else {
8175            None
8176        };
8177
8178        let group_by = if self.parse_keywords(&[GROUP, BY]) {
8179            self.parse_comma_separated(Parser::parse_expr)?
8180        } else {
8181            vec![]
8182        };
8183
8184        let having = if self.parse_keyword(HAVING) {
8185            Some(self.parse_expr()?)
8186        } else {
8187            None
8188        };
8189
8190        let qualify = if self.parse_keyword(QUALIFY) {
8191            Some(self.parse_expr()?)
8192        } else {
8193            None
8194        };
8195
8196        let options = if self.parse_keyword(OPTIONS) {
8197            self.expect_token(&Token::LParen)?;
8198            let options = self.parse_comma_separated(Self::parse_select_option)?;
8199            self.expect_token(&Token::RParen)?;
8200            options
8201        } else {
8202            vec![]
8203        };
8204
8205        Ok(Select {
8206            distinct,
8207            projection,
8208            from,
8209            selection,
8210            group_by,
8211            having,
8212            qualify,
8213            options,
8214        })
8215    }
8216
8217    fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
8218        let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
8219            EXPECTED => {
8220                self.expect_keywords(&[GROUP, SIZE])?;
8221                SelectOptionName::ExpectedGroupSize
8222            }
8223            AGGREGATE => {
8224                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8225                SelectOptionName::AggregateInputGroupSize
8226            }
8227            DISTINCT => {
8228                self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
8229                SelectOptionName::DistinctOnInputGroupSize
8230            }
8231            LIMIT => {
8232                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8233                SelectOptionName::LimitInputGroupSize
8234            }
8235            _ => unreachable!(),
8236        };
8237        Ok(SelectOption {
8238            name,
8239            value: self.parse_optional_option_value()?,
8240        })
8241    }
8242
8243    fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8244        let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
8245        let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
8246        let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8247        if !normal {
8248            match variable.as_str().parse() {
8249                Ok(TIME) => {
8250                    self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8251                    variable = ident!("timezone");
8252                    normal = true;
8253                }
8254                Ok(NAMES) => {
8255                    variable = ident!("client_encoding");
8256                    normal = true;
8257                }
8258                _ => {}
8259            }
8260        }
8261        if variable.as_str().parse() == Ok(SCHEMA) {
8262            variable = ident!("search_path");
8263            let to = self
8264                .parse_set_schema_to()
8265                .map_parser_err(StatementKind::SetVariable)?;
8266            Ok(Statement::SetVariable(SetVariableStatement {
8267                local: modifier == Some(LOCAL),
8268                variable,
8269                to,
8270            }))
8271        } else if normal {
8272            let to = self
8273                .parse_set_variable_to()
8274                .map_parser_err(StatementKind::SetVariable)?;
8275            Ok(Statement::SetVariable(SetVariableStatement {
8276                local: modifier == Some(LOCAL),
8277                variable,
8278                to,
8279            }))
8280        } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8281            // SET TRANSACTION transaction_mode
8282            Ok(Statement::SetTransaction(SetTransactionStatement {
8283                local: true,
8284                modes: self
8285                    .parse_transaction_modes(true)
8286                    .map_parser_err(StatementKind::SetTransaction)?,
8287            }))
8288        } else if modifier == Some(SESSION)
8289            && variable.as_str().parse() == Ok(CHARACTERISTICS)
8290            && self.parse_keywords(&[AS, TRANSACTION])
8291        {
8292            // SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
8293            Ok(Statement::SetTransaction(SetTransactionStatement {
8294                local: false,
8295                modes: self
8296                    .parse_transaction_modes(true)
8297                    .map_parser_err(StatementKind::SetTransaction)?,
8298            }))
8299        } else {
8300            self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8301                .map_no_statement_parser_err()
8302        }
8303    }
8304
8305    fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8306        if self.parse_keyword(DEFAULT) {
8307            Ok(SetVariableTo::Default)
8308        } else {
8309            let to = self.parse_set_variable_value()?;
8310            Ok(SetVariableTo::Values(vec![to]))
8311        }
8312    }
8313
8314    fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8315        if self.parse_keyword(DEFAULT) {
8316            Ok(SetVariableTo::Default)
8317        } else {
8318            Ok(SetVariableTo::Values(
8319                self.parse_comma_separated(Parser::parse_set_variable_value)?,
8320            ))
8321        }
8322    }
8323
8324    fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8325        if let Some(value) = self.maybe_parse(Parser::parse_value) {
8326            Ok(SetVariableValue::Literal(value))
8327        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8328            Ok(SetVariableValue::Ident(ident))
8329        } else {
8330            self.expected(self.peek_pos(), "variable value", self.peek_token())
8331        }
8332    }
8333
8334    fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8335        let mut variable = self.parse_identifier()?;
8336        if variable.as_str().parse() == Ok(SCHEMA) {
8337            variable = ident!("search_path");
8338        }
8339        Ok(Statement::ResetVariable(ResetVariableStatement {
8340            variable,
8341        }))
8342    }
8343
8344    fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8345        let redacted = self.parse_keyword(REDACTED);
8346        if redacted && !self.peek_keyword(CREATE) {
8347            return parser_err!(
8348                self,
8349                self.peek_pos(),
8350                "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8351            );
8352        }
8353        if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8354            self.parse_show_columns()
8355        } else if self.parse_keyword(OBJECTS) {
8356            let from = if self.parse_keywords(&[FROM]) {
8357                Some(self.parse_schema_name()?)
8358            } else {
8359                None
8360            };
8361            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8362                object_type: ShowObjectType::Object,
8363                from,
8364                filter: self.parse_show_statement_filter()?,
8365            }))
8366        } else if let Some(object_type) = self.parse_plural_object_type() {
8367            let from = if object_type.lives_in_schema() {
8368                if self.parse_keywords(&[FROM]) {
8369                    Some(self.parse_schema_name()?)
8370                } else {
8371                    None
8372                }
8373            } else {
8374                None
8375            };
8376
8377            let show_object_type = match object_type {
8378                ObjectType::Database => ShowObjectType::Database,
8379                ObjectType::Schema => {
8380                    let from = if self.parse_keyword(FROM) {
8381                        Some(self.parse_database_name()?)
8382                    } else {
8383                        None
8384                    };
8385                    ShowObjectType::Schema { from }
8386                }
8387                ObjectType::Table => {
8388                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8389                        Some(self.parse_raw_name()?)
8390                    } else {
8391                        None
8392                    };
8393                    ShowObjectType::Table { on_source }
8394                }
8395                ObjectType::View => ShowObjectType::View,
8396                ObjectType::Source => {
8397                    let in_cluster = self.parse_optional_in_cluster()?;
8398                    ShowObjectType::Source { in_cluster }
8399                }
8400                ObjectType::Subsource => {
8401                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8402                        Some(self.parse_raw_name()?)
8403                    } else {
8404                        None
8405                    };
8406
8407                    if from.is_some() && on_source.is_some() {
8408                        return parser_err!(
8409                            self,
8410                            self.peek_prev_pos(),
8411                            "Cannot specify both FROM and ON"
8412                        );
8413                    }
8414
8415                    ShowObjectType::Subsource { on_source }
8416                }
8417                ObjectType::Sink => {
8418                    let in_cluster = self.parse_optional_in_cluster()?;
8419                    ShowObjectType::Sink { in_cluster }
8420                }
8421                ObjectType::MetricSink => {
8422                    let in_cluster = self.parse_optional_in_cluster()?;
8423                    ShowObjectType::MetricSink { in_cluster }
8424                }
8425                ObjectType::Type => ShowObjectType::Type,
8426                ObjectType::Role => ShowObjectType::Role,
8427                ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8428                ObjectType::Secret => ShowObjectType::Secret,
8429                ObjectType::Connection => ShowObjectType::Connection,
8430                ObjectType::Cluster => ShowObjectType::Cluster,
8431                ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8432                ObjectType::MaterializedView => {
8433                    let in_cluster = self.parse_optional_in_cluster()?;
8434                    ShowObjectType::MaterializedView { in_cluster }
8435                }
8436                ObjectType::Index => {
8437                    let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8438                        Some(self.parse_raw_name()?)
8439                    } else {
8440                        None
8441                    };
8442
8443                    if from.is_some() && on_object.is_some() {
8444                        return parser_err!(
8445                            self,
8446                            self.peek_prev_pos(),
8447                            "Cannot specify both FROM and ON"
8448                        );
8449                    }
8450
8451                    let in_cluster = self.parse_optional_in_cluster()?;
8452                    ShowObjectType::Index {
8453                        in_cluster,
8454                        on_object,
8455                    }
8456                }
8457                ObjectType::Func => {
8458                    return parser_err!(
8459                        self,
8460                        self.peek_prev_pos(),
8461                        format!("Unsupported SHOW on {object_type}")
8462                    );
8463                }
8464            };
8465            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8466                object_type: show_object_type,
8467                from,
8468                filter: self.parse_show_statement_filter()?,
8469            }))
8470        } else if self.parse_keyword(CLUSTER) {
8471            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8472                variable: ident!("cluster"),
8473            }))
8474        } else if self.parse_keyword(PRIVILEGES) {
8475            self.parse_show_privileges()
8476        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8477            self.parse_show_default_privileges()
8478        } else if self.parse_keyword(ROLE) {
8479            self.expect_keyword(MEMBERSHIP)?;
8480            let role = if self.parse_keyword(FOR) {
8481                Some(self.parse_identifier()?)
8482            } else {
8483                None
8484            };
8485            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8486                object_type: ShowObjectType::RoleMembership { role },
8487                from: None,
8488                filter: self.parse_show_statement_filter()?,
8489            }))
8490        } else if self.parse_keywords(&[CREATE, VIEW]) {
8491            Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8492                view_name: self.parse_raw_name()?,
8493                redacted,
8494            }))
8495        } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8496            Ok(ShowStatement::ShowCreateMaterializedView(
8497                ShowCreateMaterializedViewStatement {
8498                    materialized_view_name: self.parse_raw_name()?,
8499                    redacted,
8500                },
8501            ))
8502        } else if self.parse_keywords(&[CREATE, SOURCE]) {
8503            Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8504                source_name: self.parse_raw_name()?,
8505                redacted,
8506            }))
8507        } else if self.parse_keywords(&[CREATE, TABLE]) {
8508            Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8509                table_name: self.parse_raw_name()?,
8510                redacted,
8511            }))
8512        } else if self.parse_keywords(&[CREATE, SINK]) {
8513            Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8514                sink_name: self.parse_raw_name()?,
8515                redacted,
8516            }))
8517        } else if self.parse_keywords(&[CREATE, METRIC, SINK]) {
8518            Ok(ShowStatement::ShowCreateMetricSink(
8519                ShowCreateMetricSinkStatement {
8520                    metric_sink_name: self.parse_raw_name()?,
8521                    redacted,
8522                },
8523            ))
8524        } else if self.parse_keywords(&[CREATE, INDEX]) {
8525            Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8526                index_name: self.parse_raw_name()?,
8527                redacted,
8528            }))
8529        } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8530            Ok(ShowStatement::ShowCreateConnection(
8531                ShowCreateConnectionStatement {
8532                    connection_name: self.parse_raw_name()?,
8533                    redacted,
8534                },
8535            ))
8536        } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8537            if redacted {
8538                return parser_err!(
8539                    self,
8540                    self.peek_prev_pos(),
8541                    "SHOW REDACTED CREATE CLUSTER is not supported"
8542                );
8543            }
8544            Ok(ShowStatement::ShowCreateCluster(
8545                ShowCreateClusterStatement {
8546                    cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8547                },
8548            ))
8549        } else if self.parse_keywords(&[CREATE, TYPE]) {
8550            Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8551                type_name: self.parse_data_type()?,
8552                redacted,
8553            }))
8554        } else {
8555            let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8556                ident!("transaction_isolation")
8557            } else if self.parse_keywords(&[TIME, ZONE]) {
8558                ident!("timezone")
8559            } else {
8560                self.parse_identifier()?
8561            };
8562            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8563                variable,
8564            }))
8565        }
8566    }
8567
8568    fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8569        self.expect_one_of_keywords(&[FROM, IN])?;
8570        let table_name = self.parse_raw_name()?;
8571        // MySQL also supports FROM <database> here. In other words, MySQL
8572        // allows both FROM <table> FROM <database> and FROM <database>.<table>,
8573        // while we only support the latter for now.
8574        let filter = self.parse_show_statement_filter()?;
8575        Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8576            table_name,
8577            filter,
8578        }))
8579    }
8580
8581    fn parse_show_statement_filter(
8582        &mut self,
8583    ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8584        if self.parse_keyword(LIKE) {
8585            Ok(Some(ShowStatementFilter::Like(
8586                self.parse_literal_string()?,
8587            )))
8588        } else if self.parse_keyword(WHERE) {
8589            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8590        } else {
8591            Ok(None)
8592        }
8593    }
8594
8595    fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8596        let object_type = if self.parse_keyword(ON) {
8597            Some(self.expect_plural_system_object_type_for_privileges()?)
8598        } else {
8599            None
8600        };
8601        let role = if self.parse_keyword(FOR) {
8602            Some(self.parse_identifier()?)
8603        } else {
8604            None
8605        };
8606        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8607            object_type: ShowObjectType::Privileges { object_type, role },
8608            from: None,
8609            filter: self.parse_show_statement_filter()?,
8610        }))
8611    }
8612
8613    fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8614        let object_type = if self.parse_keyword(ON) {
8615            Some(self.expect_plural_object_type_for_privileges()?)
8616        } else {
8617            None
8618        };
8619        let role = if self.parse_keyword(FOR) {
8620            Some(self.parse_identifier()?)
8621        } else {
8622            None
8623        };
8624        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8625            object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8626            from: None,
8627            filter: self.parse_show_statement_filter()?,
8628        }))
8629    }
8630
8631    fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8632        self.expect_keyword(SHARD)?;
8633        let id = self.parse_literal_string()?;
8634        Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8635    }
8636
8637    fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8638        let relation = self.parse_table_factor()?;
8639
8640        // Note that for keywords to be properly handled here, they need to be
8641        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
8642        // a table alias.
8643        let mut joins = vec![];
8644        loop {
8645            let join = if self.parse_keyword(CROSS) {
8646                self.expect_keyword(JOIN)?;
8647                Join {
8648                    relation: self.parse_table_factor()?,
8649                    join_operator: JoinOperator::CrossJoin,
8650                }
8651            } else {
8652                let natural = self.parse_keyword(NATURAL);
8653                let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8654                    Some(kw)
8655                } else {
8656                    None
8657                };
8658
8659                let join_operator_type = match peek_keyword {
8660                    Some(INNER) | Some(JOIN) => {
8661                        let _ = self.parse_keyword(INNER);
8662                        self.expect_keyword(JOIN)?;
8663                        JoinOperator::Inner
8664                    }
8665                    Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8666                        let _ = self.next_token();
8667                        let _ = self.parse_keyword(OUTER);
8668                        self.expect_keyword(JOIN)?;
8669                        match kw {
8670                            LEFT => JoinOperator::LeftOuter,
8671                            RIGHT => JoinOperator::RightOuter,
8672                            FULL => JoinOperator::FullOuter,
8673                            _ => unreachable!(),
8674                        }
8675                    }
8676                    Some(OUTER) => {
8677                        return self.expected(
8678                            self.peek_pos(),
8679                            "LEFT, RIGHT, or FULL",
8680                            self.peek_token(),
8681                        );
8682                    }
8683                    None if natural => {
8684                        return self.expected(
8685                            self.peek_pos(),
8686                            "a join type after NATURAL",
8687                            self.peek_token(),
8688                        );
8689                    }
8690                    _ => break,
8691                };
8692                let relation = self.parse_table_factor()?;
8693                let join_constraint = self.parse_join_constraint(natural)?;
8694                Join {
8695                    relation,
8696                    join_operator: join_operator_type(join_constraint),
8697                }
8698            };
8699            joins.push(join);
8700        }
8701        Ok(TableWithJoins { relation, joins })
8702    }
8703
8704    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
8705    fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8706        // Guard the nested table-factor recursion. `FROM ((((…` descends
8707        // parse_table_factor -> parse_table_and_joins -> parse_table_factor,
8708        // and the inner `parse_query` recursion guard doesn't stop it because
8709        // the derived-table `maybe_parse` below swallows its
8710        // `RecursionLimitError`. Without this, deeply nested parens overflow
8711        // the stack (and the try-both backtracking balloons memory).
8712        self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8713    }
8714
8715    fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8716        if self.parse_keyword(LATERAL) {
8717            // LATERAL must always be followed by a subquery or table function.
8718            if self.consume_token(&Token::LParen) {
8719                return self.parse_derived_table_factor(Lateral);
8720            } else if self.parse_keywords(&[ROWS, FROM]) {
8721                return self.parse_rows_from();
8722            } else {
8723                let name = self.parse_raw_name()?;
8724                self.expect_token(&Token::LParen)?;
8725                let args = self.parse_optional_args(false)?;
8726                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8727                return Ok(TableFactor::Function {
8728                    function: Function {
8729                        name,
8730                        args,
8731                        filter: None,
8732                        over: None,
8733                        distinct: false,
8734                    },
8735                    alias,
8736                    with_ordinality,
8737                });
8738            }
8739        }
8740
8741        if self.consume_token(&Token::LParen) {
8742            // A left paren introduces either a derived table (i.e., a subquery)
8743            // or a nested join. It's nearly impossible to determine ahead of
8744            // time which it is... so we just try to parse both.
8745            //
8746            // Here's an example that demonstrates the complexity:
8747            //                     /-------------------------------------------------------\
8748            //                     | /-----------------------------------\                 |
8749            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
8750            //                   ^ ^ ^ ^
8751            //                   | | | |
8752            //                   | | | |
8753            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
8754            //                   | | (3) starts a derived table (subquery)
8755            //                   | (2) starts a nested join
8756            //                   (1) an additional set of parens around a nested join
8757            //
8758
8759            // Check if the recently consumed '(' started a derived table, in
8760            // which case we've parsed the subquery, followed by the closing
8761            // ')', and the alias of the derived table. In the example above
8762            // this is case (3), and the next token would be `NATURAL`.
8763            maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8764
8765            // The '(' we've recently consumed does not start a derived table.
8766            // For valid input this can happen either when the token following
8767            // the paren can't start a query (e.g. `foo` in `FROM (foo NATURAL
8768            // JOIN bar)`, or when the '(' we've consumed is followed by another
8769            // '(' that starts a derived table, like (3), or another nested join
8770            // (2).
8771            //
8772            // Ignore the error and back up to where we were before. Either
8773            // we'll be able to parse a valid nested join, or we won't, and
8774            // we'll return that error instead.
8775            let table_and_joins = self.parse_table_and_joins()?;
8776            match table_and_joins.relation {
8777                TableFactor::NestedJoin { .. } => (),
8778                _ => {
8779                    if table_and_joins.joins.is_empty() {
8780                        // The SQL spec prohibits derived tables and bare
8781                        // tables from appearing alone in parentheses.
8782                        self.expected(self.peek_pos(), "joined table", self.peek_token())?
8783                    }
8784                }
8785            }
8786            self.expect_token(&Token::RParen)?;
8787            Ok(TableFactor::NestedJoin {
8788                join: Box::new(table_and_joins),
8789                alias: self.parse_optional_table_alias()?,
8790            })
8791        } else if self.parse_keywords(&[ROWS, FROM]) {
8792            Ok(self.parse_rows_from()?)
8793        } else {
8794            let name = self.parse_raw_name()?;
8795            if self.consume_token(&Token::LParen) {
8796                let args = self.parse_optional_args(false)?;
8797                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8798                Ok(TableFactor::Function {
8799                    function: Function {
8800                        name,
8801                        args,
8802                        filter: None,
8803                        over: None,
8804                        distinct: false,
8805                    },
8806                    alias,
8807                    with_ordinality,
8808                })
8809            } else {
8810                Ok(TableFactor::Table {
8811                    name,
8812                    alias: self.parse_optional_table_alias()?,
8813                })
8814            }
8815        }
8816    }
8817
8818    fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8819        self.expect_token(&Token::LParen)?;
8820        let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8821        self.expect_token(&Token::RParen)?;
8822        let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8823        Ok(TableFactor::RowsFrom {
8824            functions,
8825            alias,
8826            with_ordinality,
8827        })
8828    }
8829
8830    /// Parses the things that can come after the argument list of a table function call. These are
8831    /// - optional WITH ORDINALITY
8832    /// - optional table alias
8833    /// - optional WITH ORDINALITY again! This is allowed just to keep supporting our earlier buggy
8834    ///   order where we allowed WITH ORDINALITY only after the table alias. (Postgres and other
8835    ///   systems support it only before the table alias.)
8836    fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8837        let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8838        let alias = self.parse_optional_table_alias()?;
8839        let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8840        if with_ordinality_1 && with_ordinality_2 {
8841            return parser_err!(
8842                self,
8843                self.peek_prev_pos(),
8844                "WITH ORDINALITY specified twice"
8845            );
8846        }
8847        Ok((with_ordinality_1 || with_ordinality_2, alias))
8848    }
8849
8850    fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8851        let name = self.parse_raw_name()?;
8852        self.parse_function(name)
8853    }
8854
8855    /// Parses a function call in a position that only permits "windowless"
8856    /// function syntax (PostgreSQL's `func_expr_windowless`): DISTINCT,
8857    /// FILTER, and OVER are not part of the grammar here, which guarantees
8858    /// the planner's invariant that table functions never carry them.
8859    fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8860        let name = self.parse_raw_name()?;
8861        self.expect_token(&Token::LParen)?;
8862        let args = self.parse_optional_args(false)?;
8863        Ok(Function {
8864            name,
8865            args,
8866            filter: None,
8867            over: None,
8868            distinct: false,
8869        })
8870    }
8871
8872    fn parse_derived_table_factor(
8873        &mut self,
8874        lateral: IsLateral,
8875    ) -> Result<TableFactor<Raw>, ParserError> {
8876        let subquery = Box::new(self.parse_query()?);
8877        self.expect_token(&Token::RParen)?;
8878        let alias = self.parse_optional_table_alias()?;
8879        Ok(TableFactor::Derived {
8880            lateral: match lateral {
8881                Lateral => true,
8882                NotLateral => false,
8883            },
8884            subquery,
8885            alias,
8886        })
8887    }
8888
8889    fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8890        if natural {
8891            Ok(JoinConstraint::Natural)
8892        } else if self.parse_keyword(ON) {
8893            let constraint = self.parse_expr()?;
8894            Ok(JoinConstraint::On(constraint))
8895        } else if self.parse_keyword(USING) {
8896            let columns = self.parse_parenthesized_column_list(Mandatory)?;
8897            let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8898
8899            Ok(JoinConstraint::Using { columns, alias })
8900        } else {
8901            self.expected(
8902                self.peek_pos(),
8903                "ON, or USING after JOIN",
8904                self.peek_token(),
8905            )
8906        }
8907    }
8908
8909    /// Parse an INSERT statement
8910    fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8911        self.expect_keyword(INTO)?;
8912        let table_name = self.parse_raw_name()?;
8913        let columns = self.parse_parenthesized_column_list(Optional)?;
8914        let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8915            InsertSource::DefaultValues
8916        } else {
8917            InsertSource::Query(self.parse_query()?)
8918        };
8919        let returning = self.parse_returning()?;
8920        Ok(Statement::Insert(InsertStatement {
8921            table_name,
8922            columns,
8923            source,
8924            returning,
8925        }))
8926    }
8927
8928    fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8929        Ok(if self.parse_keyword(RETURNING) {
8930            self.parse_comma_separated(Parser::parse_select_item)?
8931        } else {
8932            Vec::new()
8933        })
8934    }
8935
8936    fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8937        let table_name = RawItemName::Name(self.parse_item_name()?);
8938        // The alias here doesn't support columns, so don't use parse_optional_table_alias.
8939        let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8940        let alias = alias.map(|name| TableAlias {
8941            name,
8942            columns: Vec::new(),
8943            strict: false,
8944        });
8945
8946        self.expect_keyword(SET)?;
8947        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8948        let selection = if self.parse_keyword(WHERE) {
8949            Some(self.parse_expr()?)
8950        } else {
8951            None
8952        };
8953
8954        Ok(Statement::Update(UpdateStatement {
8955            table_name,
8956            alias,
8957            assignments,
8958            selection,
8959        }))
8960    }
8961
8962    /// Parse a `var = expr` assignment, used in an UPDATE statement
8963    fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8964        let id = self.parse_identifier()?;
8965        self.expect_token(&Token::Eq)?;
8966        let value = self.parse_expr()?;
8967        Ok(Assignment { id, value })
8968    }
8969
8970    fn parse_optional_args(
8971        &mut self,
8972        allow_order_by: bool,
8973    ) -> Result<FunctionArgs<Raw>, ParserError> {
8974        if self.consume_token(&Token::Star) {
8975            self.expect_token(&Token::RParen)?;
8976            Ok(FunctionArgs::Star)
8977        } else if self.consume_token(&Token::RParen) {
8978            Ok(FunctionArgs::args(vec![]))
8979        } else {
8980            let args = self.parse_comma_separated(Parser::parse_expr)?;
8981            // ORDER BY can only appear after at least one argument, and not after a
8982            // star. We can ignore checking for it in the other branches. See:
8983            // https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES
8984            let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8985                self.parse_comma_separated(Parser::parse_order_by_expr)?
8986            } else {
8987                vec![]
8988            };
8989            self.expect_token(&Token::RParen)?;
8990            Ok(FunctionArgs::Args { args, order_by })
8991        }
8992    }
8993
8994    /// Parse `AS OF`, if present.
8995    fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8996        if self.parse_keyword(AS) {
8997            self.expect_keyword(OF)?;
8998            if self.parse_keywords(&[AT, LEAST]) {
8999                match self.parse_expr() {
9000                    Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
9001                    Err(e) => self.expected(
9002                        e.pos,
9003                        "a timestamp value after 'AS OF AT LEAST'",
9004                        self.peek_token(),
9005                    ),
9006                }
9007            } else {
9008                match self.parse_expr() {
9009                    Ok(expr) => Ok(Some(AsOf::At(expr))),
9010                    Err(e) => {
9011                        self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
9012                    }
9013                }
9014            }
9015        } else {
9016            Ok(None)
9017        }
9018    }
9019
9020    /// Parse `UP TO`, if present
9021    fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
9022        if self.parse_keyword(UP) {
9023            self.expect_keyword(TO)?;
9024            self.parse_expr().map(Some)
9025        } else {
9026            Ok(None)
9027        }
9028    }
9029
9030    /// Parse `AS OF`, if present.
9031    ///
9032    /// In contrast to `parse_optional_as_of`, this parser only supports `AS OF <time>` syntax and
9033    /// directly returns an `u64`. It is only meant to be used for internal SQL syntax.
9034    fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
9035        fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
9036            let value = parser.parse_value().ok()?;
9037            let Value::Number(s) = value else { return None };
9038            s.parse().ok()
9039        }
9040
9041        if self.parse_keywords(&[AS, OF]) {
9042            match try_parse_u64(self) {
9043                Some(time) => Ok(Some(time)),
9044                None => {
9045                    self.prev_token();
9046                    self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
9047                }
9048            }
9049        } else {
9050            Ok(None)
9051        }
9052    }
9053
9054    /// Parse a comma-delimited list of projections after SELECT
9055    fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
9056        if self.consume_token(&Token::Star) {
9057            return Ok(SelectItem::Wildcard);
9058        }
9059        Ok(SelectItem::Expr {
9060            expr: self.parse_expr()?,
9061            alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
9062        })
9063    }
9064
9065    /// Parse an expression, optionally followed by ASC or DESC,
9066    /// and then `[NULLS { FIRST | LAST }]` (used in ORDER BY)
9067    fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
9068        let expr = self.parse_expr()?;
9069
9070        let asc = if self.parse_keyword(ASC) {
9071            Some(true)
9072        } else if self.parse_keyword(DESC) {
9073            Some(false)
9074        } else {
9075            None
9076        };
9077
9078        let nulls_last = if self.parse_keyword(NULLS) {
9079            let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
9080            Some(last)
9081        } else {
9082            None
9083        };
9084
9085        Ok(OrderByExpr {
9086            expr,
9087            asc,
9088            nulls_last,
9089        })
9090    }
9091
9092    fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
9093        let values = self.parse_comma_separated(|parser| {
9094            parser.expect_token(&Token::LParen)?;
9095            let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
9096            parser.expect_token(&Token::RParen)?;
9097            Ok(exprs)
9098        })?;
9099        Ok(Values(values))
9100    }
9101
9102    fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
9103        self.expect_keyword(TRANSACTION)?;
9104        Ok(Statement::StartTransaction(StartTransactionStatement {
9105            modes: self.parse_transaction_modes(false)?,
9106        }))
9107    }
9108
9109    fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
9110        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9111        Ok(Statement::StartTransaction(StartTransactionStatement {
9112            modes: self.parse_transaction_modes(false)?,
9113        }))
9114    }
9115
9116    fn parse_transaction_modes(
9117        &mut self,
9118        mut required: bool,
9119    ) -> Result<Vec<TransactionMode>, ParserError> {
9120        let mut modes = vec![];
9121        loop {
9122            let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
9123                let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
9124                    TransactionIsolationLevel::ReadUncommitted
9125                } else if self.parse_keywords(&[READ, COMMITTED]) {
9126                    TransactionIsolationLevel::ReadCommitted
9127                } else if self.parse_keywords(&[REPEATABLE, READ]) {
9128                    TransactionIsolationLevel::RepeatableRead
9129                } else if self.parse_keyword(SERIALIZABLE) {
9130                    TransactionIsolationLevel::Serializable
9131                } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
9132                    TransactionIsolationLevel::StrongSessionSerializable
9133                } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
9134                    TransactionIsolationLevel::StrictSerializable
9135                } else {
9136                    self.expected(self.peek_pos(), "isolation level", self.peek_token())?
9137                };
9138                TransactionMode::IsolationLevel(iso_level)
9139            } else if self.parse_keywords(&[READ, ONLY]) {
9140                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
9141            } else if self.parse_keywords(&[READ, WRITE]) {
9142                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
9143            } else if required {
9144                self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
9145            } else {
9146                break;
9147            };
9148            modes.push(mode);
9149            // ANSI requires a comma after each transaction mode, but
9150            // PostgreSQL, for historical reasons, does not. We follow
9151            // PostgreSQL in making the comma optional, since that is strictly
9152            // more general.
9153            required = self.consume_token(&Token::Comma);
9154        }
9155        Ok(modes)
9156    }
9157
9158    fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
9159        Ok(Statement::Commit(CommitStatement {
9160            chain: self.parse_commit_rollback_chain()?,
9161        }))
9162    }
9163
9164    fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
9165        Ok(Statement::Rollback(RollbackStatement {
9166            chain: self.parse_commit_rollback_chain()?,
9167        }))
9168    }
9169
9170    fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
9171        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9172        if self.parse_keyword(AND) {
9173            let chain = !self.parse_keyword(NO);
9174            self.expect_keyword(CHAIN)?;
9175            Ok(chain)
9176        } else {
9177            Ok(false)
9178        }
9179    }
9180
9181    fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
9182        parser_err!(
9183            self,
9184            self.peek_prev_pos(),
9185            "TAIL has been renamed to SUBSCRIBE"
9186        )
9187    }
9188
9189    fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
9190        let _ = self.parse_keyword(TO);
9191        let relation = if self.consume_token(&Token::LParen) {
9192            let query = self.parse_query()?;
9193            self.expect_token(&Token::RParen)?;
9194            SubscribeRelation::Query(query)
9195        } else {
9196            SubscribeRelation::Name(self.parse_raw_name()?)
9197        };
9198        let mut output = self.parse_subscribe_output()?;
9199        let options = if self.parse_keyword(WITH) {
9200            self.expect_token(&Token::LParen)?;
9201            let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
9202            self.expect_token(&Token::RParen)?;
9203            options
9204        } else {
9205            vec![]
9206        };
9207        let as_of = self.parse_optional_as_of()?;
9208        let up_to = self.parse_optional_up_to()?;
9209        // For backwards compatibility, we allow parsing output options
9210        // (`ENVELOPE`, `WITHIN TIMESTAMP ORDER BY`) at the end of the
9211        // statement, if they haven't already been specified where we prefer
9212        // them, before the `WITH` options and before the `AS OF`/`UP TO`
9213        // options. Our preferred syntax better aligns with the option ordering
9214        // for `CREATE SINK` and `SELECT`.
9215        if output == SubscribeOutput::Diffs {
9216            output = self.parse_subscribe_output()?;
9217        }
9218        Ok(Statement::Subscribe(SubscribeStatement {
9219            relation,
9220            options,
9221            as_of,
9222            up_to,
9223            output,
9224        }))
9225    }
9226
9227    fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
9228        let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
9229            PROGRESS => SubscribeOptionName::Progress,
9230            SNAPSHOT => SubscribeOptionName::Snapshot,
9231            _ => unreachable!(),
9232        };
9233        Ok(SubscribeOption {
9234            name,
9235            value: self.parse_optional_option_value()?,
9236        })
9237    }
9238
9239    fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
9240        if self.parse_keywords(&[ENVELOPE]) {
9241            let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
9242            self.expect_token(&Token::LParen)?;
9243            self.expect_keyword(KEY)?;
9244            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
9245            let output = match keyword {
9246                UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
9247                DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
9248                _ => unreachable!("no other keyword allowed"),
9249            };
9250            self.expect_token(&Token::RParen)?;
9251            Ok(output)
9252        } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
9253            Ok(SubscribeOutput::WithinTimestampOrderBy {
9254                order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
9255            })
9256        } else {
9257            Ok(SubscribeOutput::Diffs)
9258        }
9259    }
9260
9261    /// Parse an `EXPLAIN` statement, assuming that the `EXPLAIN` token
9262    /// has already been consumed.
9263    fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9264        if self.parse_keyword(TIMESTAMP) {
9265            self.parse_explain_timestamp()
9266                .map_parser_err(StatementKind::ExplainTimestamp)
9267        } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9268            self.parse_explain_pushdown()
9269                .map_parser_err(StatementKind::ExplainPushdown)
9270        } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9271            self.parse_explain_analyze()
9272                .map_parser_err(StatementKind::ExplainAnalyzeObject)
9273        } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9274            self.parse_explain_schema()
9275                .map_parser_err(StatementKind::ExplainSinkSchema)
9276        } else {
9277            self.parse_explain_plan()
9278                .map_parser_err(StatementKind::ExplainPlan)
9279        }
9280    }
9281
9282    fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9283        let explainee = if self.parse_keyword(VIEW) {
9284            // Parse: `VIEW name`
9285            Explainee::View(self.parse_raw_name()?)
9286        } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9287            // Parse: `MATERIALIZED VIEW name`
9288            Explainee::MaterializedView(self.parse_raw_name()?)
9289        } else if self.parse_keyword(INDEX) {
9290            // Parse: `INDEX name`
9291            Explainee::Index(self.parse_raw_name()?)
9292        } else if self.parse_keywords(&[REPLAN, VIEW]) {
9293            // Parse: `REPLAN VIEW name`
9294            Explainee::ReplanView(self.parse_raw_name()?)
9295        } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9296            // Parse: `REPLAN MATERIALIZED VIEW name`
9297            Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9298        } else if self.parse_keywords(&[REPLAN, INDEX]) {
9299            // Parse: `REPLAN INDEX name`
9300            Explainee::ReplanIndex(self.parse_raw_name()?)
9301        } else {
9302            let broken = self.parse_keyword(BROKEN);
9303
9304            if self.peek_keywords(&[CREATE, VIEW])
9305                || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9306            {
9307                // Parse: `BROKEN? CREATE [OR REPLACE] VIEW ...`
9308                let _ = self.parse_keyword(CREATE); // consume CREATE token
9309                let stmt = match self.parse_create_view()? {
9310                    Statement::CreateView(stmt) => stmt,
9311                    _ => panic!("Unexpected statement type return after parsing"),
9312                };
9313
9314                Explainee::CreateView(Box::new(stmt), broken)
9315            } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9316                || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9317            {
9318                // Parse: `BROKEN? CREATE [OR REPLACE] MATERIALIZED VIEW ...`
9319                let _ = self.parse_keyword(CREATE); // consume CREATE token
9320                let stmt = match self.parse_create_materialized_view()? {
9321                    Statement::CreateMaterializedView(stmt) => stmt,
9322                    _ => panic!("Unexpected statement type return after parsing"),
9323                };
9324
9325                Explainee::CreateMaterializedView(Box::new(stmt), broken)
9326            } else if self.peek_keywords(&[CREATE, INDEX])
9327                || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9328            {
9329                // Parse: `BROKEN? CREATE INDEX ...`
9330                let _ = self.parse_keyword(CREATE); // consume CREATE token
9331                let stmt = match self.parse_create_index()? {
9332                    Statement::CreateIndex(stmt) => stmt,
9333                    _ => panic!("Unexpected statement type return after parsing"),
9334                };
9335
9336                Explainee::CreateIndex(Box::new(stmt), broken)
9337            } else if self.peek_keyword(SUBSCRIBE) {
9338                // Parse: `BROKEN? SUBSCRIBE ...`
9339                let _ = self.parse_keyword(SUBSCRIBE); // consume SUBSCRIBE token
9340                let stmt = match self.parse_subscribe()? {
9341                    Statement::Subscribe(stmt) => stmt,
9342                    _ => panic!("Unexpected statement type return after parsing"),
9343                };
9344                Explainee::Subscribe(Box::new(stmt), broken)
9345            } else {
9346                // Parse: `BROKEN? query`
9347                let query = self.parse_select_statement()?;
9348                Explainee::Select(Box::new(query), broken)
9349            }
9350        };
9351        Ok(explainee)
9352    }
9353
9354    /// Parse an `EXPLAIN ... PLAN` statement, assuming that the `EXPLAIN` token
9355    /// has already been consumed.
9356    fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9357        let start = self.peek_pos();
9358        let (has_stage, stage) = match self.parse_one_of_keywords(&[
9359            RAW,
9360            DECORRELATED,
9361            LOCALLY,
9362            OPTIMIZED,
9363            PHYSICAL,
9364            OPTIMIZER,
9365            PLAN,
9366        ]) {
9367            Some(RAW) => {
9368                self.expect_keyword(PLAN)?;
9369                (true, Some(ExplainStage::RawPlan))
9370            }
9371            Some(DECORRELATED) => {
9372                self.expect_keyword(PLAN)?;
9373                (true, Some(ExplainStage::DecorrelatedPlan))
9374            }
9375            Some(LOCALLY) => {
9376                self.expect_keywords(&[OPTIMIZED, PLAN])?;
9377                (true, Some(ExplainStage::LocalPlan))
9378            }
9379            Some(OPTIMIZED) => {
9380                self.expect_keyword(PLAN)?;
9381                (true, Some(ExplainStage::GlobalPlan))
9382            }
9383            Some(PHYSICAL) => {
9384                self.expect_keyword(PLAN)?;
9385                (true, Some(ExplainStage::PhysicalPlan))
9386            }
9387            Some(OPTIMIZER) => {
9388                self.expect_keyword(TRACE)?;
9389                (true, Some(ExplainStage::Trace))
9390            }
9391            Some(PLAN) => {
9392                if self.parse_keyword(INSIGHTS) {
9393                    (true, Some(ExplainStage::PlanInsights))
9394                } else {
9395                    // Use the default plan for the explainee.
9396                    (true, None)
9397                }
9398            }
9399            None => {
9400                // Use the default plan for the explainee.
9401                (false, None)
9402            }
9403            _ => unreachable!(),
9404        };
9405
9406        let with_options = if self.parse_keyword(WITH) {
9407            if self.consume_token(&Token::LParen) {
9408                let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9409                self.expect_token(&Token::RParen)?;
9410                options
9411            } else {
9412                self.prev_token(); // push back WITH in case it's actually a CTE
9413                vec![]
9414            }
9415        } else {
9416            vec![]
9417        };
9418
9419        let format = if self.parse_keyword(AS) {
9420            match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9421                Some(TEXT) => Some(ExplainFormat::Text),
9422                Some(JSON) => Some(ExplainFormat::Json),
9423                Some(DOT) => Some(ExplainFormat::Dot),
9424                Some(VERBOSE) => {
9425                    self.expect_keyword(TEXT)?;
9426                    Some(ExplainFormat::VerboseText)
9427                }
9428                None => return Err(ParserError::new(self.index, "expected a format")),
9429                _ => unreachable!(),
9430            }
9431        } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9432            // if EXPLAIN PHYSICAL PLAN is explicitly specified without AS, default to VERBOSE TEXT
9433            Some(ExplainFormat::VerboseText)
9434        } else {
9435            None
9436        };
9437
9438        if has_stage {
9439            self.expect_keyword(FOR)?;
9440        }
9441
9442        let explainee = self.parse_explainee()?;
9443
9444        // Explainees that represent a view only work in association with an
9445        // explicitly defined stage.
9446        if matches!((explainee.is_view(), &stage), (true, None)) {
9447            let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9448            return Err(self.error(start, msg));
9449        }
9450
9451        Ok(Statement::ExplainPlan(ExplainPlanStatement {
9452            stage,
9453            with_options,
9454            format,
9455            explainee,
9456        }))
9457    }
9458
9459    fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9460        Ok(ExplainPlanOption {
9461            name: self.parse_explain_plan_option_name()?,
9462            value: self.parse_optional_option_value()?,
9463        })
9464    }
9465
9466    /// Parse an `EXPLAIN FILTER PUSHDOWN` statement, assuming that the `EXPLAIN
9467    /// PUSHDOWN` tokens have already been consumed.
9468    fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9469        self.expect_keyword(FOR)?;
9470
9471        let explainee = self.parse_explainee()?;
9472
9473        Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9474            explainee,
9475        }))
9476    }
9477
9478    fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9479        // EXPLAIN ANALYZE CLUSTER (MEMORY | CPU) [WITH SKEW] [AS SQL]
9480        if self.parse_keyword(CLUSTER) {
9481            let properties = self.parse_explain_analyze_computation_properties()?;
9482            let as_sql = self.parse_keywords(&[AS, SQL]);
9483            return Ok(Statement::ExplainAnalyzeCluster(
9484                ExplainAnalyzeClusterStatement { properties, as_sql },
9485            ));
9486        }
9487
9488        // EXPLAIN ANALYZE ((MEMORY | CPU) [WITH SKEW] | HINTS) FOR (INDEX ... | MATERIALIZED VIEW ...) [AS SQL]
9489
9490        let properties = if self.parse_keyword(HINTS) {
9491            ExplainAnalyzeProperty::Hints
9492        } else {
9493            ExplainAnalyzeProperty::Computation(
9494                self.parse_explain_analyze_computation_properties()?,
9495            )
9496        };
9497
9498        self.expect_keyword(FOR)?;
9499
9500        let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9501            INDEX => Explainee::Index(self.parse_raw_name()?),
9502            MATERIALIZED => {
9503                self.expect_keyword(VIEW)?;
9504                Explainee::MaterializedView(self.parse_raw_name()?)
9505            }
9506            _ => unreachable!(),
9507        };
9508
9509        let as_sql = self.parse_keywords(&[AS, SQL]);
9510
9511        Ok(Statement::ExplainAnalyzeObject(
9512            ExplainAnalyzeObjectStatement {
9513                properties,
9514                explainee,
9515                as_sql,
9516            },
9517        ))
9518    }
9519
9520    fn parse_explain_analyze_computation_properties(
9521        &mut self,
9522    ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9523        let mut computation_properties = vec![CPU, MEMORY];
9524        let (kw, property) =
9525            self.parse_explain_analyze_computation_property(&computation_properties)?;
9526        let mut properties = vec![property];
9527        computation_properties.retain(|p| p != &kw);
9528
9529        while self.consume_token(&Token::Comma) {
9530            let (kw, property) =
9531                self.parse_explain_analyze_computation_property(&computation_properties)?;
9532            computation_properties.retain(|p| p != &kw);
9533            properties.push(property);
9534        }
9535
9536        let skew = self.parse_keywords(&[WITH, SKEW]);
9537
9538        Ok(ExplainAnalyzeComputationProperties { properties, skew })
9539    }
9540
9541    fn parse_explain_analyze_computation_property(
9542        &mut self,
9543        properties: &[Keyword],
9544    ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9545        if properties.is_empty() {
9546            return Err(ParserError::new(
9547                self.peek_pos(),
9548                "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9549            ));
9550        }
9551
9552        match self.expect_one_of_keywords(properties)? {
9553            CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9554            MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9555            _ => unreachable!(),
9556        }
9557    }
9558
9559    /// Parse an `EXPLAIN TIMESTAMP` statement, assuming that the `EXPLAIN
9560    /// TIMESTAMP` tokens have already been consumed.
9561    fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9562        let format = if self.parse_keyword(AS) {
9563            match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9564                Some(TEXT) => Some(ExplainFormat::Text),
9565                Some(JSON) => Some(ExplainFormat::Json),
9566                Some(DOT) => Some(ExplainFormat::Dot),
9567                None => return Err(ParserError::new(self.index, "expected a format")),
9568                _ => unreachable!(),
9569            }
9570        } else {
9571            None
9572        };
9573
9574        self.expect_keyword(FOR)?;
9575
9576        let query = self.parse_select_statement()?;
9577
9578        Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9579            format,
9580            select: query,
9581        }))
9582    }
9583    /// Parse an `EXPLAIN [KEY|VALUE] SCHEMA` statement assuming that the `EXPLAIN` token
9584    /// have already been consumed
9585    fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9586        let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9587            KEY => ExplainSinkSchemaFor::Key,
9588            VALUE => ExplainSinkSchemaFor::Value,
9589            _ => unreachable!(),
9590        };
9591
9592        self.expect_keyword(SCHEMA)?;
9593
9594        let format = if self.parse_keyword(AS) {
9595            // only json format is supported
9596            self.expect_keyword(JSON)?;
9597            Some(ExplainFormat::Json)
9598        } else {
9599            None
9600        };
9601
9602        self.expect_keywords(&[FOR, CREATE])?;
9603
9604        if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9605            Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9606                schema_for,
9607                format,
9608                statement,
9609            }))
9610        } else {
9611            unreachable!("only create sink can be returned here");
9612        }
9613    }
9614
9615    /// Parse a `DECLARE` statement, assuming that the `DECLARE` token
9616    /// has already been consumed.
9617    fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9618        let name = self
9619            .parse_identifier()
9620            .map_parser_err(StatementKind::Declare)?;
9621        self.expect_keyword(CURSOR)
9622            .map_parser_err(StatementKind::Declare)?;
9623        if self.parse_keyword(WITH) {
9624            let err = parser_err!(
9625                self,
9626                self.peek_prev_pos(),
9627                "WITH HOLD is unsupported for cursors"
9628            )
9629            .map_parser_err(StatementKind::Declare);
9630            self.expect_keyword(HOLD)
9631                .map_parser_err(StatementKind::Declare)?;
9632            return err;
9633        }
9634        // WITHOUT HOLD is optional and the default behavior so we can ignore it.
9635        let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9636        self.expect_keyword(FOR)
9637            .map_parser_err(StatementKind::Declare)?;
9638        let StatementParseResult { ast, sql } = self.parse_statement()?;
9639        Ok(Statement::Declare(DeclareStatement {
9640            name,
9641            stmt: Box::new(ast),
9642            sql: sql.to_string(),
9643        }))
9644    }
9645
9646    /// Parse a `CLOSE` statement, assuming that the `CLOSE` token
9647    /// has already been consumed.
9648    fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9649        let name = self.parse_identifier()?;
9650        Ok(Statement::Close(CloseStatement { name }))
9651    }
9652
9653    /// Parse a `PREPARE` statement, assuming that the `PREPARE` token
9654    /// has already been consumed.
9655    fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9656        let name = self
9657            .parse_identifier()
9658            .map_parser_err(StatementKind::Prepare)?;
9659        self.expect_keyword(AS)
9660            .map_parser_err(StatementKind::Prepare)?;
9661        let pos = self.peek_pos();
9662        //
9663        let StatementParseResult { ast, sql } = self.parse_statement()?;
9664        if !matches!(
9665            ast,
9666            Statement::Select(_)
9667                | Statement::Insert(_)
9668                | Statement::Delete(_)
9669                | Statement::Update(_)
9670                | Statement::Fetch(_),
9671        ) {
9672            return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9673        }
9674        Ok(Statement::Prepare(PrepareStatement {
9675            name,
9676            stmt: Box::new(ast),
9677            sql: sql.to_string(),
9678        }))
9679    }
9680
9681    /// Parse a `EXECUTE` statement, assuming that the `EXECUTE` token
9682    /// has already been consumed.
9683    fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9684        // Check if this is EXECUTE UNIT TEST
9685        if self.parse_keywords(&[UNIT, TEST]) {
9686            return self.parse_execute_unit_test();
9687        }
9688
9689        // Otherwise parse as regular EXECUTE (prepared statement)
9690        let name = self.parse_identifier()?;
9691        let params = if self.consume_token(&Token::LParen) {
9692            let params = self.parse_comma_separated(Parser::parse_expr)?;
9693            self.expect_token(&Token::RParen)?;
9694            params
9695        } else {
9696            Vec::new()
9697        };
9698        Ok(Statement::Execute(ExecuteStatement { name, params }))
9699    }
9700
9701    /// Parse an `EXECUTE UNIT TEST` statement, assuming that the
9702    /// `EXECUTE UNIT TEST` tokens have already been consumed.
9703    fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9704        // Parse test name
9705        let name = self.parse_identifier()?;
9706
9707        // Expect FOR keyword
9708        self.expect_keyword(FOR)?;
9709
9710        // Parse target view name
9711        let target = self.parse_raw_name()?;
9712
9713        // Parse optional AT TIME clause
9714        let at_time = if self.parse_keywords(&[AT, TIME]) {
9715            Some(self.parse_expr()?)
9716        } else {
9717            None
9718        };
9719
9720        // Parse MOCK definitions (0 or more). Like CTEs, MOCK clauses are
9721        // comma-separated; no comma appears before the trailing `EXPECTED`
9722        // clause.
9723        let mut mocks = Vec::new();
9724        if self.parse_keyword(MOCK) {
9725            mocks.push(self.parse_mock_view_def()?);
9726            while self.consume_token(&Token::Comma) {
9727                self.expect_keyword(MOCK)?;
9728                mocks.push(self.parse_mock_view_def()?);
9729            }
9730        }
9731
9732        self.expect_keyword(EXPECTED)?;
9733
9734        self.expect_token(&Token::LParen)?;
9735        let expected_columns = self.parse_comma_separated(|parser| {
9736            Ok(ColumnDef {
9737                name: parser.parse_identifier()?,
9738                data_type: parser.parse_data_type()?,
9739                collation: None,
9740                options: vec![],
9741            })
9742        })?;
9743        self.expect_token(&Token::RParen)?;
9744
9745        self.expect_keyword(AS)?;
9746        self.expect_token(&Token::LParen)?;
9747        let expected_query = self.parse_query()?;
9748        self.expect_token(&Token::RParen)?;
9749
9750        let expected = ExpectedResultDef {
9751            columns: expected_columns,
9752            query: expected_query,
9753        };
9754
9755        Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9756            name,
9757            target,
9758            at_time,
9759            mocks,
9760            expected,
9761        }))
9762    }
9763
9764    /// Parse a single `MOCK <name> (<cols>) AS (<query>)` definition,
9765    /// assuming the leading `MOCK` keyword has already been consumed.
9766    fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9767        let name = self.parse_raw_name()?;
9768
9769        self.expect_token(&Token::LParen)?;
9770        let columns = self.parse_comma_separated(|parser| {
9771            Ok(ColumnDef {
9772                name: parser.parse_identifier()?,
9773                data_type: parser.parse_data_type()?,
9774                collation: None,
9775                options: vec![],
9776            })
9777        })?;
9778        self.expect_token(&Token::RParen)?;
9779
9780        self.expect_keyword(AS)?;
9781        self.expect_token(&Token::LParen)?;
9782        let query = self.parse_query()?;
9783        self.expect_token(&Token::RParen)?;
9784
9785        Ok(MockViewDef {
9786            name,
9787            columns,
9788            query,
9789        })
9790    }
9791
9792    /// Parse a `DEALLOCATE` statement, assuming that the `DEALLOCATE` token
9793    /// has already been consumed.
9794    fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9795        let _ = self.parse_keyword(PREPARE);
9796        let name = if self.parse_keyword(ALL) {
9797            None
9798        } else {
9799            Some(self.parse_identifier()?)
9800        };
9801        Ok(Statement::Deallocate(DeallocateStatement { name }))
9802    }
9803
9804    /// Parse a `FETCH` statement, assuming that the `FETCH` token
9805    /// has already been consumed.
9806    fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9807        let _ = self.parse_keyword(FORWARD);
9808        let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9809            Some(FetchDirection::ForwardCount(count))
9810        } else if self.parse_keyword(ALL) {
9811            Some(FetchDirection::ForwardAll)
9812        } else {
9813            None
9814        };
9815        let _ = self.parse_keyword(FROM);
9816        let name = self.parse_identifier()?;
9817        let options = if self.parse_keyword(WITH) {
9818            self.expect_token(&Token::LParen)?;
9819            let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9820            self.expect_token(&Token::RParen)?;
9821            options
9822        } else {
9823            vec![]
9824        };
9825        Ok(Statement::Fetch(FetchStatement {
9826            name,
9827            count,
9828            options,
9829        }))
9830    }
9831
9832    fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9833        self.expect_keyword(TIMEOUT)?;
9834        Ok(FetchOption {
9835            name: FetchOptionName::Timeout,
9836            value: self.parse_optional_option_value()?,
9837        })
9838    }
9839
9840    /// Parse a `RAISE` statement, assuming that the `RAISE` token
9841    /// has already been consumed.
9842    fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9843        let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9844            Some(DEBUG) => NoticeSeverity::Debug,
9845            Some(INFO) => NoticeSeverity::Info,
9846            Some(LOG) => NoticeSeverity::Log,
9847            Some(NOTICE) => NoticeSeverity::Notice,
9848            Some(WARNING) => NoticeSeverity::Warning,
9849            Some(_) => unreachable!(),
9850            None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9851        };
9852
9853        Ok(Statement::Raise(RaiseStatement { severity }))
9854    }
9855
9856    /// Parse a `GRANT` statement, assuming that the `GRANT` token
9857    /// has already been consumed.
9858    fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9859        match self.parse_privilege_specification() {
9860            Some(privileges) => self
9861                .parse_grant_privilege(privileges)
9862                .map_parser_err(StatementKind::GrantPrivileges),
9863            None => self
9864                .parse_grant_role()
9865                .map_parser_err(StatementKind::GrantRole),
9866        }
9867    }
9868
9869    /// Parse a `GRANT PRIVILEGE` statement, assuming that the `GRANT` token
9870    /// and all privileges have already been consumed.
9871    fn parse_grant_privilege(
9872        &mut self,
9873        privileges: PrivilegeSpecification,
9874    ) -> Result<Statement<Raw>, ParserError> {
9875        self.expect_keyword(ON)?;
9876        let target = self.expect_grant_target_specification("GRANT")?;
9877        self.expect_keyword(TO)?;
9878        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9879        Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9880            privileges,
9881            target,
9882            roles,
9883        }))
9884    }
9885
9886    /// Parse a `GRANT ROLE` statement, assuming that the `GRANT` token
9887    /// has already been consumed.
9888    fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9889        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9890        self.expect_keyword(TO)?;
9891        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9892        Ok(Statement::GrantRole(GrantRoleStatement {
9893            role_names,
9894            member_names,
9895        }))
9896    }
9897
9898    /// Parse a `REVOKE` statement, assuming that the `REVOKE` token
9899    /// has already been consumed.
9900    fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9901        match self.parse_privilege_specification() {
9902            Some(privileges) => self
9903                .parse_revoke_privilege(privileges)
9904                .map_parser_err(StatementKind::RevokePrivileges),
9905            None => self
9906                .parse_revoke_role()
9907                .map_parser_err(StatementKind::RevokeRole),
9908        }
9909    }
9910
9911    /// Parse a `REVOKE PRIVILEGE` statement, assuming that the `REVOKE` token
9912    /// and all privileges have already been consumed.
9913    fn parse_revoke_privilege(
9914        &mut self,
9915        privileges: PrivilegeSpecification,
9916    ) -> Result<Statement<Raw>, ParserError> {
9917        self.expect_keyword(ON)?;
9918        let target = self.expect_grant_target_specification("REVOKE")?;
9919        self.expect_keyword(FROM)?;
9920        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9921        Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9922            privileges,
9923            target,
9924            roles,
9925        }))
9926    }
9927
9928    /// Parse a `REVOKE ROLE` statement, assuming that the `REVOKE` token
9929    /// has already been consumed.
9930    fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9931        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9932        self.expect_keyword(FROM)?;
9933        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9934        Ok(Statement::RevokeRole(RevokeRoleStatement {
9935            role_names,
9936            member_names,
9937        }))
9938    }
9939
9940    fn expect_grant_target_specification(
9941        &mut self,
9942        statement_type: &str,
9943    ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9944        if self.parse_keyword(SYSTEM) {
9945            return Ok(GrantTargetSpecification::System);
9946        }
9947
9948        let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9949            let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9950            let object_spec_inner = if self.parse_keyword(IN) {
9951                if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9952                    return parser_err!(
9953                        self,
9954                        self.peek_prev_pos(),
9955                        format!("IN invalid for {object_type}S")
9956                    );
9957                }
9958                match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9959                    DATABASE => GrantTargetSpecificationInner::All(
9960                        GrantTargetAllSpecification::AllDatabases {
9961                            databases: self.parse_comma_separated(Parser::parse_database_name)?,
9962                        },
9963                    ),
9964                    SCHEMA => {
9965                        if object_type == ObjectType::Schema {
9966                            self.prev_token();
9967                            self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9968                        }
9969                        GrantTargetSpecificationInner::All(
9970                            GrantTargetAllSpecification::AllSchemas {
9971                                schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9972                            },
9973                        )
9974                    }
9975                    _ => unreachable!(),
9976                }
9977            } else {
9978                GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9979            };
9980            (object_type, object_spec_inner)
9981        } else {
9982            let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9983            let object_spec_inner = GrantTargetSpecificationInner::Objects {
9984                names: self
9985                    .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9986            };
9987            (object_type, object_spec_inner)
9988        };
9989
9990        Ok(GrantTargetSpecification::Object {
9991            object_type,
9992            object_spec_inner,
9993        })
9994    }
9995
9996    /// Bail out if the current token is not an object type suitable for a GRANT/REVOKE, or consume
9997    /// and return it if it is.
9998    fn expect_grant_revoke_object_type(
9999        &mut self,
10000        statement_type: &str,
10001    ) -> Result<ObjectType, ParserError> {
10002        // If the object type is omitted, then it is assumed to be a table.
10003        let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
10004        self.expect_grant_revoke_object_type_inner(statement_type, object_type)
10005    }
10006
10007    /// Bail out if the current token is not a plural object type suitable for a GRANT/REVOKE, or consume
10008    /// and return it if it is.
10009    fn expect_grant_revoke_plural_object_type(
10010        &mut self,
10011        statement_type: &str,
10012    ) -> Result<ObjectType, ParserError> {
10013        let object_type = self.expect_plural_object_type().map_err(|_| {
10014            // Limit the error message to allowed object types.
10015            self.expected::<_, ObjectType>(
10016                self.peek_pos(),
10017                "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
10018                self.peek_token(),
10019            )
10020                .unwrap_err()
10021        })?;
10022        self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
10023        Ok(object_type)
10024    }
10025
10026    fn expect_grant_revoke_object_type_inner(
10027        &self,
10028        statement_type: &str,
10029        object_type: ObjectType,
10030    ) -> Result<ObjectType, ParserError> {
10031        match object_type {
10032            ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
10033                parser_err!(
10034                    self,
10035                    self.peek_prev_pos(),
10036                    format!(
10037                        "For object type {object_type}, you must specify 'TABLE' or omit the object type"
10038                    )
10039                )
10040            }
10041            ObjectType::Sink
10042            | ObjectType::MetricSink
10043            | ObjectType::Index
10044            | ObjectType::ClusterReplica
10045            | ObjectType::Role
10046            | ObjectType::Func
10047            | ObjectType::Subsource => {
10048                parser_err!(
10049                    self,
10050                    self.peek_prev_pos(),
10051                    format!("Unsupported {statement_type} on {object_type}")
10052                )
10053            }
10054            ObjectType::Table
10055            | ObjectType::Type
10056            | ObjectType::Cluster
10057            | ObjectType::Secret
10058            | ObjectType::Connection
10059            | ObjectType::Database
10060            | ObjectType::Schema
10061            | ObjectType::NetworkPolicy => Ok(object_type),
10062        }
10063    }
10064
10065    /// Bail out if the current token is not an object type, or consume and return it if it is.
10066    fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
10067        Ok(
10068            match self.expect_one_of_keywords(&[
10069                TABLE,
10070                VIEW,
10071                MATERIALIZED,
10072                SOURCE,
10073                SINK,
10074                METRIC,
10075                INDEX,
10076                TYPE,
10077                ROLE,
10078                USER,
10079                CLUSTER,
10080                SECRET,
10081                CONNECTION,
10082                DATABASE,
10083                SCHEMA,
10084                FUNCTION,
10085                NETWORK,
10086            ])? {
10087                TABLE => ObjectType::Table,
10088                VIEW => ObjectType::View,
10089                MATERIALIZED => {
10090                    if let Err(e) = self.expect_keyword(VIEW) {
10091                        self.prev_token();
10092                        return Err(e);
10093                    }
10094                    ObjectType::MaterializedView
10095                }
10096                SOURCE => ObjectType::Source,
10097                SINK => ObjectType::Sink,
10098                METRIC => {
10099                    if let Err(e) = self.expect_keyword(SINK) {
10100                        self.prev_token();
10101                        return Err(e);
10102                    }
10103                    ObjectType::MetricSink
10104                }
10105                INDEX => ObjectType::Index,
10106                TYPE => ObjectType::Type,
10107                ROLE | USER => ObjectType::Role,
10108                CLUSTER => {
10109                    if self.parse_keyword(REPLICA) {
10110                        ObjectType::ClusterReplica
10111                    } else {
10112                        ObjectType::Cluster
10113                    }
10114                }
10115                SECRET => ObjectType::Secret,
10116                CONNECTION => ObjectType::Connection,
10117                DATABASE => ObjectType::Database,
10118                SCHEMA => ObjectType::Schema,
10119                FUNCTION => ObjectType::Func,
10120                NETWORK => {
10121                    if let Err(e) = self.expect_keyword(POLICY) {
10122                        self.prev_token();
10123                        return Err(e);
10124                    }
10125                    ObjectType::NetworkPolicy
10126                }
10127                _ => unreachable!(),
10128            },
10129        )
10130    }
10131
10132    /// Look for an object type and return it if it matches.
10133    fn parse_object_type(&mut self) -> Option<ObjectType> {
10134        Some(
10135            match self.parse_one_of_keywords(&[
10136                TABLE,
10137                VIEW,
10138                MATERIALIZED,
10139                SOURCE,
10140                SINK,
10141                METRIC,
10142                INDEX,
10143                TYPE,
10144                ROLE,
10145                USER,
10146                CLUSTER,
10147                SECRET,
10148                CONNECTION,
10149                DATABASE,
10150                SCHEMA,
10151                FUNCTION,
10152                NETWORK,
10153            ])? {
10154                TABLE => ObjectType::Table,
10155                VIEW => ObjectType::View,
10156                MATERIALIZED => {
10157                    if self.parse_keyword(VIEW) {
10158                        ObjectType::MaterializedView
10159                    } else {
10160                        self.prev_token();
10161                        return None;
10162                    }
10163                }
10164                SOURCE => ObjectType::Source,
10165                SINK => ObjectType::Sink,
10166                METRIC => {
10167                    if self.parse_keyword(SINK) {
10168                        ObjectType::MetricSink
10169                    } else {
10170                        self.prev_token();
10171                        return None;
10172                    }
10173                }
10174                INDEX => ObjectType::Index,
10175                TYPE => ObjectType::Type,
10176                ROLE | USER => ObjectType::Role,
10177                CLUSTER => {
10178                    if self.parse_keyword(REPLICA) {
10179                        ObjectType::ClusterReplica
10180                    } else {
10181                        ObjectType::Cluster
10182                    }
10183                }
10184                SECRET => ObjectType::Secret,
10185                CONNECTION => ObjectType::Connection,
10186                DATABASE => ObjectType::Database,
10187                SCHEMA => ObjectType::Schema,
10188                FUNCTION => ObjectType::Func,
10189                NETWORK => {
10190                    if self.parse_keyword(POLICY) {
10191                        ObjectType::NetworkPolicy
10192                    } else {
10193                        self.prev_token();
10194                        return None;
10195                    }
10196                }
10197                _ => unreachable!(),
10198            },
10199        )
10200    }
10201
10202    /// Bail out if the current token is not an object type in the plural form, or consume and return it if it is.
10203    fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
10204        Ok(
10205            match self.expect_one_of_keywords(&[
10206                TABLES,
10207                VIEWS,
10208                MATERIALIZED,
10209                SOURCES,
10210                SINKS,
10211                INDEXES,
10212                TYPES,
10213                ROLES,
10214                USERS,
10215                CLUSTER,
10216                CLUSTERS,
10217                SECRETS,
10218                CONNECTIONS,
10219                DATABASES,
10220                SCHEMAS,
10221                POLICIES,
10222            ])? {
10223                TABLES => ObjectType::Table,
10224                VIEWS => ObjectType::View,
10225                MATERIALIZED => {
10226                    if let Err(e) = self.expect_keyword(VIEWS) {
10227                        self.prev_token();
10228                        return Err(e);
10229                    }
10230                    ObjectType::MaterializedView
10231                }
10232                SOURCES => ObjectType::Source,
10233                SINKS => ObjectType::Sink,
10234                INDEXES => ObjectType::Index,
10235                TYPES => ObjectType::Type,
10236                ROLES | USERS => ObjectType::Role,
10237                CLUSTER => {
10238                    if let Err(e) = self.expect_keyword(REPLICAS) {
10239                        self.prev_token();
10240                        return Err(e);
10241                    }
10242                    ObjectType::ClusterReplica
10243                }
10244                CLUSTERS => ObjectType::Cluster,
10245                SECRETS => ObjectType::Secret,
10246                CONNECTIONS => ObjectType::Connection,
10247                DATABASES => ObjectType::Database,
10248                SCHEMAS => ObjectType::Schema,
10249                POLICIES => ObjectType::NetworkPolicy,
10250                _ => unreachable!(),
10251            },
10252        )
10253    }
10254
10255    /// Look for an object type in the plural form and return it if it matches.
10256    fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
10257        Some(
10258            match self.parse_one_of_keywords(&[
10259                TABLES,
10260                VIEWS,
10261                MATERIALIZED,
10262                SOURCES,
10263                SINKS,
10264                METRIC,
10265                INDEXES,
10266                TYPES,
10267                ROLES,
10268                USERS,
10269                CLUSTER,
10270                CLUSTERS,
10271                SECRETS,
10272                CONNECTIONS,
10273                DATABASES,
10274                SCHEMAS,
10275                SUBSOURCES,
10276                NETWORK,
10277            ])? {
10278                TABLES => ObjectType::Table,
10279                VIEWS => ObjectType::View,
10280                MATERIALIZED => {
10281                    if self.parse_keyword(VIEWS) {
10282                        ObjectType::MaterializedView
10283                    } else {
10284                        self.prev_token();
10285                        return None;
10286                    }
10287                }
10288                SOURCES => ObjectType::Source,
10289                SINKS => ObjectType::Sink,
10290                METRIC => {
10291                    if self.parse_keyword(SINKS) {
10292                        ObjectType::MetricSink
10293                    } else {
10294                        self.prev_token();
10295                        return None;
10296                    }
10297                }
10298                INDEXES => ObjectType::Index,
10299                TYPES => ObjectType::Type,
10300                ROLES | USERS => ObjectType::Role,
10301                CLUSTER => {
10302                    if self.parse_keyword(REPLICAS) {
10303                        ObjectType::ClusterReplica
10304                    } else {
10305                        self.prev_token();
10306                        return None;
10307                    }
10308                }
10309                CLUSTERS => ObjectType::Cluster,
10310                SECRETS => ObjectType::Secret,
10311                CONNECTIONS => ObjectType::Connection,
10312                DATABASES => ObjectType::Database,
10313                SCHEMAS => ObjectType::Schema,
10314                SUBSOURCES => ObjectType::Subsource,
10315                NETWORK => {
10316                    if self.parse_keyword(POLICIES) {
10317                        ObjectType::NetworkPolicy
10318                    } else {
10319                        self.prev_token();
10320                        return None;
10321                    }
10322                }
10323                _ => unreachable!(),
10324            },
10325        )
10326    }
10327
10328    /// Bail out if the current token is not a privilege object type, or consume and
10329    /// return it if it is.
10330    fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10331        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10332            return parser_err!(
10333                self,
10334                self.peek_prev_pos(),
10335                format!("For object type {object_type}, you must specify 'TABLES'")
10336            );
10337        }
10338        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10339            self.prev_token();
10340            return parser_err!(
10341                self,
10342                self.peek_prev_pos(),
10343                "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10344            );
10345        }
10346
10347        Ok(
10348            match self.expect_one_of_keywords(&[
10349                TABLES,
10350                TYPES,
10351                CLUSTERS,
10352                SECRETS,
10353                CONNECTIONS,
10354                DATABASES,
10355                SCHEMAS,
10356            ])? {
10357                TABLES => ObjectType::Table,
10358                TYPES => ObjectType::Type,
10359                CLUSTERS => ObjectType::Cluster,
10360                SECRETS => ObjectType::Secret,
10361                CONNECTIONS => ObjectType::Connection,
10362                DATABASES => ObjectType::Database,
10363                SCHEMAS => ObjectType::Schema,
10364                _ => unreachable!(),
10365            },
10366        )
10367    }
10368
10369    /// Bail out if the current token is not a privilege object type in the plural form, or consume and
10370    /// return it if it is.
10371    fn expect_plural_system_object_type_for_privileges(
10372        &mut self,
10373    ) -> Result<SystemObjectType, ParserError> {
10374        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10375            return parser_err!(
10376                self,
10377                self.peek_prev_pos(),
10378                format!("For object type {object_type}, you must specify 'TABLES'")
10379            );
10380        }
10381        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10382            self.prev_token();
10383            return parser_err!(
10384                self,
10385                self.peek_prev_pos(),
10386                "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10387            );
10388        }
10389
10390        Ok(
10391            match self.expect_one_of_keywords(&[
10392                SYSTEM,
10393                TABLES,
10394                TYPES,
10395                CLUSTERS,
10396                SECRETS,
10397                CONNECTIONS,
10398                DATABASES,
10399                SCHEMAS,
10400            ])? {
10401                SYSTEM => SystemObjectType::System,
10402                TABLES => SystemObjectType::Object(ObjectType::Table),
10403                TYPES => SystemObjectType::Object(ObjectType::Type),
10404                CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10405                SECRETS => SystemObjectType::Object(ObjectType::Secret),
10406                CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10407                DATABASES => SystemObjectType::Object(ObjectType::Database),
10408                SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10409                _ => unreachable!(),
10410            },
10411        )
10412    }
10413
10414    /// Look for a privilege and return it if it matches.
10415    fn parse_privilege(&mut self) -> Option<Privilege> {
10416        Some(
10417            match self.parse_one_of_keywords(&[
10418                INSERT,
10419                SELECT,
10420                UPDATE,
10421                DELETE,
10422                USAGE,
10423                CREATE,
10424                CREATEROLE,
10425                CREATEDB,
10426                CREATECLUSTER,
10427                CREATENETWORKPOLICY,
10428            ])? {
10429                INSERT => Privilege::INSERT,
10430                SELECT => Privilege::SELECT,
10431                UPDATE => Privilege::UPDATE,
10432                DELETE => Privilege::DELETE,
10433                USAGE => Privilege::USAGE,
10434                CREATE => Privilege::CREATE,
10435                CREATEROLE => Privilege::CREATEROLE,
10436                CREATEDB => Privilege::CREATEDB,
10437                CREATECLUSTER => Privilege::CREATECLUSTER,
10438                CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10439                _ => unreachable!(),
10440            },
10441        )
10442    }
10443
10444    /// Parse one or more privileges separated by a ','.
10445    fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10446        if self.parse_keyword(ALL) {
10447            let _ = self.parse_keyword(PRIVILEGES);
10448            return Some(PrivilegeSpecification::All);
10449        }
10450
10451        let mut privileges = Vec::new();
10452        while let Some(privilege) = self.parse_privilege() {
10453            privileges.push(privilege);
10454            if !self.consume_token(&Token::Comma) {
10455                break;
10456            }
10457        }
10458
10459        if privileges.is_empty() {
10460            None
10461        } else {
10462            Some(PrivilegeSpecification::Privileges(privileges))
10463        }
10464    }
10465
10466    /// Bail out if the current token is not a role specification, or consume and return it if it is.
10467    fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10468        let _ = self.parse_keyword(GROUP);
10469        self.parse_identifier()
10470    }
10471
10472    /// Parse a `REASSIGN OWNED` statement, assuming that the `REASSIGN` token
10473    /// has already been consumed.
10474    fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10475        self.expect_keywords(&[OWNED, BY])?;
10476        let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10477        self.expect_keyword(TO)?;
10478        let new_role = self.parse_identifier()?;
10479        Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10480            old_roles,
10481            new_role,
10482        }))
10483    }
10484
10485    fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10486        self.expect_keyword(ON)?;
10487
10488        let object = match self.expect_one_of_keywords(&[
10489            TABLE,
10490            VIEW,
10491            COLUMN,
10492            MATERIALIZED,
10493            SOURCE,
10494            SINK,
10495            INDEX,
10496            FUNCTION,
10497            CONNECTION,
10498            TYPE,
10499            SECRET,
10500            ROLE,
10501            DATABASE,
10502            SCHEMA,
10503            CLUSTER,
10504            NETWORK,
10505        ])? {
10506            TABLE => {
10507                let name = self.parse_raw_name()?;
10508                CommentObjectType::Table { name }
10509            }
10510            VIEW => {
10511                let name = self.parse_raw_name()?;
10512                CommentObjectType::View { name }
10513            }
10514            MATERIALIZED => {
10515                self.expect_keyword(VIEW)?;
10516                let name = self.parse_raw_name()?;
10517                CommentObjectType::MaterializedView { name }
10518            }
10519            SOURCE => {
10520                let name = self.parse_raw_name()?;
10521                CommentObjectType::Source { name }
10522            }
10523            SINK => {
10524                let name = self.parse_raw_name()?;
10525                CommentObjectType::Sink { name }
10526            }
10527            INDEX => {
10528                let name = self.parse_raw_name()?;
10529                CommentObjectType::Index { name }
10530            }
10531            FUNCTION => {
10532                let name = self.parse_raw_name()?;
10533                CommentObjectType::Func { name }
10534            }
10535            CONNECTION => {
10536                let name = self.parse_raw_name()?;
10537                CommentObjectType::Connection { name }
10538            }
10539            TYPE => {
10540                let ty = self.parse_data_type()?;
10541                CommentObjectType::Type { ty }
10542            }
10543            SECRET => {
10544                let name = self.parse_raw_name()?;
10545                CommentObjectType::Secret { name }
10546            }
10547            ROLE => {
10548                let name = self.parse_identifier()?;
10549                CommentObjectType::Role { name }
10550            }
10551            DATABASE => {
10552                let name = self.parse_database_name()?;
10553                CommentObjectType::Database { name }
10554            }
10555            SCHEMA => {
10556                let name = self.parse_schema_name()?;
10557                CommentObjectType::Schema { name }
10558            }
10559            CLUSTER => {
10560                if self.parse_keyword(REPLICA) {
10561                    let name = self.parse_cluster_replica_name()?;
10562                    CommentObjectType::ClusterReplica { name }
10563                } else {
10564                    let name = self.parse_raw_ident()?;
10565                    CommentObjectType::Cluster { name }
10566                }
10567            }
10568            COLUMN => {
10569                let name = self.parse_column_name()?;
10570                CommentObjectType::Column { name }
10571            }
10572            NETWORK => {
10573                self.expect_keyword(POLICY)?;
10574                let name = self.parse_raw_network_policy_name()?;
10575                CommentObjectType::NetworkPolicy { name }
10576            }
10577            _ => unreachable!(),
10578        };
10579
10580        self.expect_keyword(IS)?;
10581        let comment = match self.next_token() {
10582            Some(Token::Keyword(NULL)) => None,
10583            Some(Token::String(s)) => Some(s),
10584            other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10585        };
10586
10587        Ok(Statement::Comment(CommentStatement { object, comment }))
10588    }
10589
10590    pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10591    where
10592        S: TryInto<IdentString>,
10593        <S as TryInto<IdentString>>::Error: fmt::Display,
10594    {
10595        Ident::new(s).map_err(|e| ParserError {
10596            pos: self.peek_prev_pos(),
10597            message: e.to_string(),
10598        })
10599    }
10600}
10601
10602impl CheckedRecursion for Parser<'_> {
10603    fn recursion_guard(&self) -> &RecursionGuard {
10604        &self.recursion_guard
10605    }
10606}
10607
10608/// Represents an expression or query (a "fragment") with parentheses around it,
10609/// when it is unknown whether the fragment belongs to a larger expression or
10610/// query.
10611enum ParenthesizedFragment {
10612    Query(Query<Raw>),
10613    Exprs(Vec<Expr<Raw>>),
10614}
10615
10616impl ParenthesizedFragment {
10617    /// Force the fragment into an expression.
10618    fn into_expr(self) -> Expr<Raw> {
10619        match self {
10620            ParenthesizedFragment::Exprs(exprs) => {
10621                // The `ParenthesizedFragment` represents that there were
10622                // parentheses surrounding `exprs`, so...
10623                if exprs.len() == 1 {
10624                    // ...if there was only one expression, the parentheses
10625                    // were simple nesting...
10626                    Expr::Nested(Box::new(exprs.into_element()))
10627                } else {
10628                    // ...and if there were multiple expressions, the
10629                    // parentheses formed an implicit row constructor.
10630                    Expr::Row { exprs }
10631                }
10632            }
10633            // Queries become subquery expressions.
10634            ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10635        }
10636    }
10637}
10638
10639// Include the `Parser::parse_~` implementations for simple options derived by
10640// the crate's build.rs script.
10641include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));