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            _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4503        };
4504        // Match `parse_identifier`, which rejects zero-length identifiers.
4505        if id.is_empty() {
4506            return parser_err!(self, self.peek_prev_pos(), "expected id");
4507        }
4508        Ok(id)
4509    }
4510
4511    fn parse_optional_in_cluster(&mut self) -> Result<Option<RawClusterName>, ParserError> {
4512        if self.parse_keywords(&[IN, CLUSTER]) {
4513            Ok(Some(self.parse_raw_ident()?))
4514        } else {
4515            Ok(None)
4516        }
4517    }
4518
4519    fn parse_create_role(&mut self) -> Result<Statement<Raw>, ParserError> {
4520        self.expect_keyword(ROLE)?;
4521        let name = self.parse_identifier()?;
4522        let _ = self.parse_keyword(WITH);
4523        let options = self.parse_role_attributes()?;
4524        Ok(Statement::CreateRole(CreateRoleStatement { name, options }))
4525    }
4526
4527    fn parse_role_attributes(&mut self) -> Result<Vec<RoleAttribute>, ParserError> {
4528        let mut options = vec![];
4529        loop {
4530            match self.parse_one_of_keywords(&[
4531                SUPERUSER,
4532                NOSUPERUSER,
4533                LOGIN,
4534                NOLOGIN,
4535                INHERIT,
4536                NOINHERIT,
4537                CREATECLUSTER,
4538                NOCREATECLUSTER,
4539                CREATEDB,
4540                NOCREATEDB,
4541                CREATEROLE,
4542                NOCREATEROLE,
4543                PASSWORD,
4544            ]) {
4545                None => break,
4546                Some(SUPERUSER) => options.push(RoleAttribute::SuperUser),
4547                Some(NOSUPERUSER) => options.push(RoleAttribute::NoSuperUser),
4548                Some(LOGIN) => options.push(RoleAttribute::Login),
4549                Some(NOLOGIN) => options.push(RoleAttribute::NoLogin),
4550                Some(INHERIT) => options.push(RoleAttribute::Inherit),
4551                Some(NOINHERIT) => options.push(RoleAttribute::NoInherit),
4552                Some(CREATECLUSTER) => options.push(RoleAttribute::CreateCluster),
4553                Some(NOCREATECLUSTER) => options.push(RoleAttribute::NoCreateCluster),
4554                Some(CREATEDB) => options.push(RoleAttribute::CreateDB),
4555                Some(NOCREATEDB) => options.push(RoleAttribute::NoCreateDB),
4556                Some(CREATEROLE) => options.push(RoleAttribute::CreateRole),
4557                Some(NOCREATEROLE) => options.push(RoleAttribute::NoCreateRole),
4558                Some(PASSWORD) => {
4559                    if self.parse_keyword(NULL) {
4560                        options.push(RoleAttribute::Password(None));
4561                        continue;
4562                    }
4563                    let password = self.parse_literal_string()?;
4564                    options.push(RoleAttribute::Password(Some(password)));
4565                }
4566                Some(_) => unreachable!(),
4567            }
4568        }
4569        Ok(options)
4570    }
4571
4572    fn parse_create_secret(&mut self) -> Result<Statement<Raw>, ParserError> {
4573        self.expect_keyword(SECRET)?;
4574        let if_not_exists = self.parse_if_not_exists()?;
4575        let name = self.parse_item_name()?;
4576        self.expect_keyword(AS)?;
4577        let value = self.parse_expr()?;
4578        Ok(Statement::CreateSecret(CreateSecretStatement {
4579            name,
4580            if_not_exists,
4581            value,
4582        }))
4583    }
4584
4585    fn parse_create_type(&mut self) -> Result<Statement<Raw>, ParserError> {
4586        self.expect_keyword(TYPE)?;
4587        let name = self.parse_item_name()?;
4588        self.expect_keyword(AS)?;
4589
4590        match self.parse_one_of_keywords(&[LIST, MAP]) {
4591            Some(LIST) => {
4592                self.expect_token(&Token::LParen)?;
4593                let options = self.parse_comma_separated(Parser::parse_create_type_list_option)?;
4594                self.expect_token(&Token::RParen)?;
4595                Ok(Statement::CreateType(CreateTypeStatement {
4596                    name,
4597                    as_type: CreateTypeAs::List { options },
4598                }))
4599            }
4600            Some(MAP) => {
4601                self.expect_token(&Token::LParen)?;
4602                let options = self.parse_comma_separated(Parser::parse_create_type_map_option)?;
4603                self.expect_token(&Token::RParen)?;
4604                Ok(Statement::CreateType(CreateTypeStatement {
4605                    name,
4606                    as_type: CreateTypeAs::Map { options },
4607                }))
4608            }
4609            None => {
4610                let column_defs = self.parse_composite_type_definition()?;
4611
4612                Ok(Statement::CreateType(CreateTypeStatement {
4613                    name,
4614                    as_type: CreateTypeAs::Record { column_defs },
4615                }))
4616            }
4617            _ => unreachable!(),
4618        }
4619    }
4620
4621    fn parse_create_type_list_option(&mut self) -> Result<CreateTypeListOption<Raw>, ParserError> {
4622        self.expect_keywords(&[ELEMENT, TYPE])?;
4623        let name = CreateTypeListOptionName::ElementType;
4624        Ok(CreateTypeListOption {
4625            name,
4626            value: Some(self.parse_data_type_option_value()?),
4627        })
4628    }
4629
4630    fn parse_create_type_map_option(&mut self) -> Result<CreateTypeMapOption<Raw>, ParserError> {
4631        let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
4632            KEY => {
4633                self.expect_keyword(TYPE)?;
4634                CreateTypeMapOptionName::KeyType
4635            }
4636            VALUE => {
4637                self.expect_keyword(TYPE)?;
4638                CreateTypeMapOptionName::ValueType
4639            }
4640            _ => unreachable!(),
4641        };
4642        Ok(CreateTypeMapOption {
4643            name,
4644            value: Some(self.parse_data_type_option_value()?),
4645        })
4646    }
4647
4648    fn parse_create_cluster(&mut self) -> Result<Statement<Raw>, ParserError> {
4649        let if_not_exists = self.parse_if_not_exists()?;
4650        let name = self.parse_identifier()?;
4651        // For historical reasons, the parentheses around the options can be
4652        // omitted.
4653        let paren = self.consume_token(&Token::LParen);
4654        let options = self.parse_comma_separated(Parser::parse_cluster_option)?;
4655        if paren {
4656            self.expect_token(&Token::RParen)?;
4657        }
4658
4659        let features = if self.parse_keywords(&[FEATURES]) {
4660            self.expect_token(&Token::LParen)?;
4661            let features = self.parse_comma_separated(Parser::parse_cluster_feature)?;
4662            self.expect_token(&Token::RParen)?;
4663            features
4664        } else {
4665            Vec::new()
4666        };
4667
4668        Ok(Statement::CreateCluster(CreateClusterStatement {
4669            name,
4670            options,
4671            features,
4672            if_not_exists,
4673        }))
4674    }
4675
4676    fn parse_cluster_option_name(&mut self) -> Result<ClusterOptionName, ParserError> {
4677        let option = self.expect_one_of_keywords(&[
4678            AUTO,
4679            AVAILABILITY,
4680            DISK,
4681            EXPERIMENTAL,
4682            INTROSPECTION,
4683            MANAGED,
4684            REPLICAS,
4685            REPLICATION,
4686            SIZE,
4687            SCHEDULE,
4688            WORKLOAD,
4689        ])?;
4690        let name = match option {
4691            AUTO => {
4692                self.expect_keywords(&[SCALING, STRATEGY])?;
4693                ClusterOptionName::AutoScalingStrategy
4694            }
4695            AVAILABILITY => {
4696                self.expect_keyword(ZONES)?;
4697                ClusterOptionName::AvailabilityZones
4698            }
4699            DISK => ClusterOptionName::Disk,
4700            EXPERIMENTAL => {
4701                self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4702                ClusterOptionName::ExperimentalArrangementCompression
4703            }
4704            INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4705                DEBUGGING => ClusterOptionName::IntrospectionDebugging,
4706                INTERVAL => ClusterOptionName::IntrospectionInterval,
4707                _ => unreachable!(),
4708            },
4709            MANAGED => ClusterOptionName::Managed,
4710            REPLICAS => ClusterOptionName::Replicas,
4711            REPLICATION => {
4712                self.expect_keyword(FACTOR)?;
4713                ClusterOptionName::ReplicationFactor
4714            }
4715            SIZE => ClusterOptionName::Size,
4716            SCHEDULE => ClusterOptionName::Schedule,
4717            WORKLOAD => {
4718                self.expect_keyword(CLASS)?;
4719                ClusterOptionName::WorkloadClass
4720            }
4721            _ => unreachable!(),
4722        };
4723        Ok(name)
4724    }
4725
4726    fn parse_cluster_option(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4727        let name = self.parse_cluster_option_name()?;
4728
4729        match name {
4730            ClusterOptionName::Replicas => self.parse_cluster_option_replicas(),
4731            ClusterOptionName::Schedule => self.parse_cluster_option_schedule(),
4732            ClusterOptionName::AutoScalingStrategy => {
4733                self.parse_cluster_option_auto_scaling_strategy()
4734            }
4735            _ => {
4736                let value = self.parse_optional_option_value()?;
4737                Ok(ClusterOption { name, value })
4738            }
4739        }
4740    }
4741
4742    fn parse_alter_cluster_option(&mut self) -> Result<ClusterAlterOption<Raw>, ParserError> {
4743        let (name, value) = match self.expect_one_of_keywords(&[WAIT])? {
4744            WAIT => {
4745                let _ = self.consume_token(&Token::Eq);
4746                let v = match self.expect_one_of_keywords(&[FOR, UNTIL])? {
4747                    FOR => Some(WithOptionValue::ClusterAlterStrategy(
4748                        ClusterAlterOptionValue::For(self.parse_value()?),
4749                    )),
4750                    UNTIL => {
4751                        self.expect_keyword(READY)?;
4752                        let _ = self.consume_token(&Token::Eq);
4753                        self.expect_token(&Token::LParen)?;
4754                        let opts = Some(WithOptionValue::ClusterAlterStrategy(
4755                            ClusterAlterOptionValue::UntilReady(self.parse_comma_separated(
4756                                Parser::parse_cluster_alter_until_ready_option,
4757                            )?),
4758                        ));
4759                        self.expect_token(&Token::RParen)?;
4760                        opts
4761                    }
4762                    _ => unreachable!(),
4763                };
4764                (ClusterAlterOptionName::Wait, v)
4765            }
4766            _ => unreachable!(),
4767        };
4768        Ok(ClusterAlterOption { name, value })
4769    }
4770
4771    fn parse_cluster_alter_until_ready_option(
4772        &mut self,
4773    ) -> Result<ClusterAlterUntilReadyOption<Raw>, ParserError> {
4774        let name = match self.expect_one_of_keywords(&[TIMEOUT, ON])? {
4775            ON => {
4776                self.expect_keywords(&[TIMEOUT])?;
4777                ClusterAlterUntilReadyOptionName::OnTimeout
4778            }
4779            TIMEOUT => ClusterAlterUntilReadyOptionName::Timeout,
4780            _ => unreachable!(),
4781        };
4782        let value = self.parse_optional_option_value()?;
4783        Ok(ClusterAlterUntilReadyOption { name, value })
4784    }
4785
4786    fn parse_cluster_option_replicas(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4787        let _ = self.consume_token(&Token::Eq);
4788        self.expect_token(&Token::LParen)?;
4789        let replicas = if self.consume_token(&Token::RParen) {
4790            vec![]
4791        } else {
4792            let replicas = self.parse_comma_separated(|parser| {
4793                let name = parser.parse_identifier()?;
4794                parser.expect_token(&Token::LParen)?;
4795                let options = parser.parse_comma_separated(Parser::parse_replica_option)?;
4796                parser.expect_token(&Token::RParen)?;
4797                Ok(ReplicaDefinition { name, options })
4798            })?;
4799            self.expect_token(&Token::RParen)?;
4800            replicas
4801        };
4802        Ok(ClusterOption {
4803            name: ClusterOptionName::Replicas,
4804            value: Some(WithOptionValue::ClusterReplicas(replicas)),
4805        })
4806    }
4807
4808    fn parse_cluster_option_schedule(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4809        let _ = self.consume_token(&Token::Eq);
4810        let kw = self.expect_one_of_keywords(&[MANUAL, ON])?;
4811        let value = match kw {
4812            MANUAL => ClusterScheduleOptionValue::Manual,
4813            ON => {
4814                self.expect_keyword(REFRESH)?;
4815                // Parse optional `(HYDRATION TIME ESTIMATE ...)`
4816                let hydration_time_estimate = if self.consume_token(&Token::LParen) {
4817                    self.expect_keywords(&[HYDRATION, TIME, ESTIMATE])?;
4818                    let _ = self.consume_token(&Token::Eq);
4819                    let interval = self.parse_interval_value()?;
4820                    self.expect_token(&Token::RParen)?;
4821                    Some(interval)
4822                } else {
4823                    None
4824                };
4825                ClusterScheduleOptionValue::Refresh {
4826                    hydration_time_estimate,
4827                }
4828            }
4829            _ => unreachable!(),
4830        };
4831        Ok(ClusterOption {
4832            name: ClusterOptionName::Schedule,
4833            value: Some(WithOptionValue::ClusterScheduleOptionValue(value)),
4834        })
4835    }
4836
4837    /// Parse the value of the `AUTO SCALING STRATEGY` cluster option: a
4838    /// paren-enclosed list of strategy sub-policies. v1 supports only
4839    /// `ON HYDRATION (HYDRATION SIZE = '...' [, LINGER DURATION = '...'])`. An
4840    /// empty list `()` disables autoscaling.
4841    fn parse_cluster_option_auto_scaling_strategy(
4842        &mut self,
4843    ) -> Result<ClusterOption<Raw>, ParserError> {
4844        let _ = self.consume_token(&Token::Eq);
4845        self.expect_token(&Token::LParen)?;
4846        let mut value = ClusterAutoScalingStrategyOptionValue { on_hydration: None };
4847        if !self.consume_token(&Token::RParen) {
4848            // The list is a comma-separated set of strategy sub-policies, each
4849            // named by a leading keyword. Only `ON HYDRATION` exists in v1.
4850            loop {
4851                self.expect_keywords(&[ON, HYDRATION])?;
4852                self.expect_token(&Token::LParen)?;
4853                self.expect_keywords(&[HYDRATION, SIZE])?;
4854                let _ = self.consume_token(&Token::Eq);
4855                let hydration_size = self.parse_value()?;
4856                let linger_duration = if self.consume_token(&Token::Comma) {
4857                    self.expect_keywords(&[LINGER, DURATION])?;
4858                    let _ = self.consume_token(&Token::Eq);
4859                    Some(self.parse_value()?)
4860                } else {
4861                    None
4862                };
4863                self.expect_token(&Token::RParen)?;
4864                // Each sub-policy may appear at most once; a repeated entry would
4865                // otherwise silently keep only the last.
4866                if value.on_hydration.is_some() {
4867                    return parser_err!(
4868                        self,
4869                        self.peek_prev_pos(),
4870                        "ON HYDRATION specified more than once"
4871                    );
4872                }
4873                value.on_hydration = Some(OnHydrationOptionValue {
4874                    hydration_size,
4875                    linger_duration,
4876                });
4877                if !self.consume_token(&Token::Comma) {
4878                    break;
4879                }
4880            }
4881            self.expect_token(&Token::RParen)?;
4882        }
4883        Ok(ClusterOption {
4884            name: ClusterOptionName::AutoScalingStrategy,
4885            value: Some(WithOptionValue::ClusterAutoScalingStrategyOptionValue(
4886                value,
4887            )),
4888        })
4889    }
4890
4891    fn parse_replica_option(&mut self) -> Result<ReplicaOption<Raw>, ParserError> {
4892        let name = match self.expect_one_of_keywords(&[
4893            AVAILABILITY,
4894            BILLED,
4895            COMPUTE,
4896            COMPUTECTL,
4897            DISK,
4898            EXPERIMENTAL,
4899            INTERNAL,
4900            INTROSPECTION,
4901            SIZE,
4902            STORAGE,
4903            STORAGECTL,
4904            WORKERS,
4905        ])? {
4906            AVAILABILITY => {
4907                self.expect_keyword(ZONE)?;
4908                ReplicaOptionName::AvailabilityZone
4909            }
4910            BILLED => {
4911                self.expect_keyword(AS)?;
4912                ReplicaOptionName::BilledAs
4913            }
4914            COMPUTE => {
4915                self.expect_keyword(ADDRESSES)?;
4916                ReplicaOptionName::ComputeAddresses
4917            }
4918            COMPUTECTL => {
4919                self.expect_keyword(ADDRESSES)?;
4920                ReplicaOptionName::ComputectlAddresses
4921            }
4922            DISK => ReplicaOptionName::Disk,
4923            EXPERIMENTAL => {
4924                self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4925                ReplicaOptionName::ExperimentalArrangementCompression
4926            }
4927            INTERNAL => ReplicaOptionName::Internal,
4928            INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4929                DEBUGGING => ReplicaOptionName::IntrospectionDebugging,
4930                INTERVAL => ReplicaOptionName::IntrospectionInterval,
4931                _ => unreachable!(),
4932            },
4933            SIZE => ReplicaOptionName::Size,
4934            STORAGE => {
4935                self.expect_keyword(ADDRESSES)?;
4936                ReplicaOptionName::StorageAddresses
4937            }
4938            STORAGECTL => {
4939                self.expect_keyword(ADDRESSES)?;
4940                ReplicaOptionName::StoragectlAddresses
4941            }
4942            WORKERS => ReplicaOptionName::Workers,
4943            _ => unreachable!(),
4944        };
4945        let value = self.parse_optional_option_value()?;
4946        Ok(ReplicaOption { name, value })
4947    }
4948
4949    fn parse_cluster_feature(&mut self) -> Result<ClusterFeature<Raw>, ParserError> {
4950        Ok(ClusterFeature {
4951            name: self.parse_cluster_feature_name()?,
4952            value: self.parse_optional_option_value()?,
4953        })
4954    }
4955
4956    fn parse_create_cluster_replica(&mut self) -> Result<Statement<Raw>, ParserError> {
4957        self.next_token();
4958        let if_not_exists = self.parse_if_not_exists()?;
4959        let of_cluster = self.parse_identifier()?;
4960        self.expect_token(&Token::Dot)?;
4961        let name = self.parse_identifier()?;
4962        // For historical reasons, the parentheses around the options can be
4963        // omitted.
4964        let paren = self.consume_token(&Token::LParen);
4965        let options = self.parse_comma_separated(Parser::parse_replica_option)?;
4966        if paren {
4967            let _ = self.consume_token(&Token::RParen);
4968        }
4969        Ok(Statement::CreateClusterReplica(
4970            CreateClusterReplicaStatement {
4971                of_cluster,
4972                definition: ReplicaDefinition { name, options },
4973                if_not_exists,
4974            },
4975        ))
4976    }
4977
4978    fn parse_if_exists(&mut self) -> Result<bool, ParserError> {
4979        if self.parse_keyword(IF) {
4980            self.expect_keyword(EXISTS)?;
4981            Ok(true)
4982        } else {
4983            Ok(false)
4984        }
4985    }
4986
4987    fn parse_if_not_exists(&mut self) -> Result<bool, ParserError> {
4988        if self.parse_keyword(IF) {
4989            self.expect_keywords(&[NOT, EXISTS])?;
4990            Ok(true)
4991        } else {
4992            Ok(false)
4993        }
4994    }
4995
4996    fn parse_alias(&mut self) -> Result<Option<Ident>, ParserError> {
4997        self.parse_keyword(AS)
4998            .then(|| self.parse_identifier())
4999            .transpose()
5000    }
5001
5002    fn parse_source_include_metadata(&mut self) -> Result<Vec<SourceIncludeMetadata>, ParserError> {
5003        if self.parse_keyword(INCLUDE) {
5004            self.parse_comma_separated(|parser| {
5005                let metadata = match parser
5006                    .expect_one_of_keywords(&[KEY, TIMESTAMP, PARTITION, OFFSET, HEADERS, HEADER])?
5007                {
5008                    KEY => SourceIncludeMetadata::Key {
5009                        alias: parser.parse_alias()?,
5010                    },
5011                    TIMESTAMP => SourceIncludeMetadata::Timestamp {
5012                        alias: parser.parse_alias()?,
5013                    },
5014                    PARTITION => SourceIncludeMetadata::Partition {
5015                        alias: parser.parse_alias()?,
5016                    },
5017                    OFFSET => SourceIncludeMetadata::Offset {
5018                        alias: parser.parse_alias()?,
5019                    },
5020                    HEADERS => SourceIncludeMetadata::Headers {
5021                        alias: parser.parse_alias()?,
5022                    },
5023                    HEADER => {
5024                        let key: String = parser.parse_literal_string()?;
5025                        parser.expect_keyword(AS)?;
5026                        let alias = parser.parse_identifier()?;
5027                        let use_bytes = parser.parse_keyword(BYTES);
5028                        SourceIncludeMetadata::Header {
5029                            alias,
5030                            key,
5031                            use_bytes,
5032                        }
5033                    }
5034                    _ => unreachable!("only explicitly allowed items can be parsed"),
5035                };
5036                Ok(metadata)
5037            })
5038        } else {
5039            Ok(vec![])
5040        }
5041    }
5042
5043    fn parse_discard(&mut self) -> Result<Statement<Raw>, ParserError> {
5044        let target = match self.expect_one_of_keywords(&[ALL, PLANS, SEQUENCES, TEMP, TEMPORARY])? {
5045            ALL => DiscardTarget::All,
5046            PLANS => DiscardTarget::Plans,
5047            SEQUENCES => DiscardTarget::Sequences,
5048            TEMP | TEMPORARY => DiscardTarget::Temp,
5049            _ => unreachable!(),
5050        };
5051        Ok(Statement::Discard(DiscardStatement { target }))
5052    }
5053
5054    fn parse_drop(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5055        if self.parse_keyword(OWNED) {
5056            self.parse_drop_owned()
5057                .map_parser_err(StatementKind::DropOwned)
5058        } else {
5059            self.parse_drop_objects()
5060                .map_parser_err(StatementKind::DropObjects)
5061        }
5062    }
5063
5064    fn parse_drop_objects(&mut self) -> Result<Statement<Raw>, ParserError> {
5065        let object_type = self.expect_object_type()?;
5066        let if_exists = self.parse_if_exists()?;
5067        match object_type {
5068            ObjectType::Database => {
5069                let name = UnresolvedObjectName::Database(self.parse_database_name()?);
5070                let restrict = matches!(
5071                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5072                    Some(RESTRICT),
5073                );
5074                Ok(Statement::DropObjects(DropObjectsStatement {
5075                    object_type: ObjectType::Database,
5076                    if_exists,
5077                    names: vec![name],
5078                    cascade: !restrict,
5079                }))
5080            }
5081            ObjectType::Schema => {
5082                let names = self.parse_comma_separated(|parser| {
5083                    Ok(UnresolvedObjectName::Schema(parser.parse_schema_name()?))
5084                })?;
5085
5086                let cascade = matches!(
5087                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5088                    Some(CASCADE),
5089                );
5090                Ok(Statement::DropObjects(DropObjectsStatement {
5091                    object_type: ObjectType::Schema,
5092                    if_exists,
5093                    names,
5094                    cascade,
5095                }))
5096            }
5097            ObjectType::Role => {
5098                let names = self.parse_comma_separated(|parser| {
5099                    Ok(UnresolvedObjectName::Role(parser.parse_identifier()?))
5100                })?;
5101                Ok(Statement::DropObjects(DropObjectsStatement {
5102                    object_type: ObjectType::Role,
5103                    if_exists,
5104                    names,
5105                    cascade: false,
5106                }))
5107            }
5108            ObjectType::NetworkPolicy => {
5109                let names = self.parse_comma_separated(|parser| {
5110                    Ok(UnresolvedObjectName::NetworkPolicy(
5111                        parser.parse_identifier()?,
5112                    ))
5113                })?;
5114                Ok(Statement::DropObjects(DropObjectsStatement {
5115                    object_type: ObjectType::NetworkPolicy,
5116                    if_exists,
5117                    names,
5118                    cascade: false,
5119                }))
5120            }
5121            ObjectType::Cluster => self.parse_drop_clusters(if_exists),
5122            ObjectType::ClusterReplica => self.parse_drop_cluster_replicas(if_exists),
5123            ObjectType::Table
5124            | ObjectType::View
5125            | ObjectType::MaterializedView
5126            | ObjectType::Source
5127            | ObjectType::Sink
5128            | ObjectType::MetricSink
5129            | ObjectType::Index
5130            | ObjectType::Type
5131            | ObjectType::Secret
5132            | ObjectType::Connection => {
5133                let names = self.parse_comma_separated(|parser| {
5134                    Ok(UnresolvedObjectName::Item(parser.parse_item_name()?))
5135                })?;
5136                let cascade = matches!(
5137                    self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5138                    Some(CASCADE),
5139                );
5140                Ok(Statement::DropObjects(DropObjectsStatement {
5141                    object_type,
5142                    if_exists,
5143                    names,
5144                    cascade,
5145                }))
5146            }
5147            ObjectType::Func | ObjectType::Subsource => parser_err!(
5148                self,
5149                self.peek_prev_pos(),
5150                format!("Unsupported DROP on {object_type}")
5151            ),
5152        }
5153    }
5154
5155    fn parse_drop_clusters(&mut self, if_exists: bool) -> Result<Statement<Raw>, ParserError> {
5156        let names = self.parse_comma_separated(|parser| {
5157            Ok(UnresolvedObjectName::Cluster(parser.parse_identifier()?))
5158        })?;
5159        let cascade = matches!(
5160            self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5161            Some(CASCADE),
5162        );
5163        Ok(Statement::DropObjects(DropObjectsStatement {
5164            object_type: ObjectType::Cluster,
5165            if_exists,
5166            names,
5167            cascade,
5168        }))
5169    }
5170
5171    fn parse_drop_cluster_replicas(
5172        &mut self,
5173        if_exists: bool,
5174    ) -> Result<Statement<Raw>, ParserError> {
5175        let names = self.parse_comma_separated(|p| {
5176            Ok(UnresolvedObjectName::ClusterReplica(
5177                p.parse_cluster_replica_name()?,
5178            ))
5179        })?;
5180        Ok(Statement::DropObjects(DropObjectsStatement {
5181            object_type: ObjectType::ClusterReplica,
5182            if_exists,
5183            names,
5184            cascade: false,
5185        }))
5186    }
5187
5188    fn parse_drop_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
5189        self.expect_keyword(BY)?;
5190        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
5191        let cascade = if self.parse_keyword(CASCADE) {
5192            Some(true)
5193        } else if self.parse_keyword(RESTRICT) {
5194            Some(false)
5195        } else {
5196            None
5197        };
5198        Ok(Statement::DropOwned(DropOwnedStatement {
5199            role_names,
5200            cascade,
5201        }))
5202    }
5203
5204    fn parse_cluster_replica_name(&mut self) -> Result<QualifiedReplica, ParserError> {
5205        let cluster = self.parse_identifier()?;
5206        self.expect_token(&Token::Dot)?;
5207        let replica = self.parse_identifier()?;
5208        Ok(QualifiedReplica { cluster, replica })
5209    }
5210
5211    fn parse_alter_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5212        let name = self.parse_identifier()?;
5213        self.expect_keyword(SET)?;
5214        self.expect_token(&Token::LParen)?;
5215        let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5216        self.expect_token(&Token::RParen)?;
5217        Ok(Statement::AlterNetworkPolicy(AlterNetworkPolicyStatement {
5218            name,
5219            options,
5220        }))
5221    }
5222
5223    fn parse_create_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5224        self.expect_keywords(&[NETWORK, POLICY])?;
5225        let name = self.parse_identifier()?;
5226        self.expect_token(&Token::LParen)?;
5227        let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5228        self.expect_token(&Token::RParen)?;
5229        Ok(Statement::CreateNetworkPolicy(
5230            CreateNetworkPolicyStatement { name, options },
5231        ))
5232    }
5233
5234    fn parse_network_policy_option(&mut self) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5235        let name = match self.expect_one_of_keywords(&[RULES])? {
5236            RULES => NetworkPolicyOptionName::Rules,
5237            v => panic!("found unreachable keyword {}", v),
5238        };
5239        match name {
5240            NetworkPolicyOptionName::Rules => self.parse_network_policy_option_rules(),
5241        }
5242    }
5243
5244    fn parse_network_policy_option_rules(
5245        &mut self,
5246    ) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5247        let _ = self.consume_token(&Token::Eq);
5248        self.expect_token(&Token::LParen)?;
5249        let rules = if self.consume_token(&Token::RParen) {
5250            vec![]
5251        } else {
5252            let rules = self.parse_comma_separated(|parser| {
5253                let name = parser.parse_identifier()?;
5254                parser.expect_token(&Token::LParen)?;
5255                let options =
5256                    parser.parse_comma_separated(Parser::parse_network_policy_rule_option)?;
5257                parser.expect_token(&Token::RParen)?;
5258                Ok(NetworkPolicyRuleDefinition { name, options })
5259            })?;
5260            self.expect_token(&Token::RParen)?;
5261            rules
5262        };
5263        Ok(NetworkPolicyOption {
5264            name: NetworkPolicyOptionName::Rules,
5265            value: Some(WithOptionValue::NetworkPolicyRules(rules)),
5266        })
5267    }
5268
5269    fn parse_network_policy_rule_option(
5270        &mut self,
5271    ) -> Result<NetworkPolicyRuleOption<Raw>, ParserError> {
5272        let name = match self.expect_one_of_keywords(&[ACTION, ADDRESS, DIRECTION])? {
5273            ACTION => NetworkPolicyRuleOptionName::Action,
5274            ADDRESS => NetworkPolicyRuleOptionName::Address,
5275            DIRECTION => NetworkPolicyRuleOptionName::Direction,
5276            v => panic!("found unreachable keyword {}", v),
5277        };
5278        let value = self.parse_optional_option_value()?;
5279        Ok(NetworkPolicyRuleOption { name, value })
5280    }
5281
5282    fn parse_create_table(&mut self) -> Result<Statement<Raw>, ParserError> {
5283        let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
5284        self.expect_keyword(TABLE)?;
5285        let if_not_exists = self.parse_if_not_exists()?;
5286        let table_name = self.parse_item_name()?;
5287        // parse optional column list (schema)
5288        let (columns, constraints) = self.parse_columns(Mandatory)?;
5289
5290        let with_options = if self.parse_keyword(WITH) {
5291            self.expect_token(&Token::LParen)?;
5292            let o = if matches!(self.peek_token(), Some(Token::RParen)) {
5293                vec![]
5294            } else {
5295                self.parse_comma_separated(Parser::parse_table_option)?
5296            };
5297            self.expect_token(&Token::RParen)?;
5298            o
5299        } else {
5300            vec![]
5301        };
5302
5303        Ok(Statement::CreateTable(CreateTableStatement {
5304            name: table_name,
5305            columns,
5306            constraints,
5307            if_not_exists,
5308            temporary,
5309            with_options,
5310        }))
5311    }
5312
5313    fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5314        if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5315            return parser_err!(
5316                self,
5317                self.peek_prev_pos(),
5318                "temporary tables FROM SOURCE are not supported"
5319            );
5320        }
5321        self.expect_keyword(TABLE)?;
5322        let if_not_exists = self.parse_if_not_exists()?;
5323        let table_name = self.parse_item_name()?;
5324
5325        if self.parse_keywords(&[FROM, WEBHOOK]) {
5326            // Webhook Source, which works differently than all other sources.
5327            return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5328        }
5329
5330        let (columns, constraints) = self.parse_table_from_source_columns()?;
5331
5332        self.expect_keywords(&[FROM, SOURCE])?;
5333
5334        let source = self.parse_raw_name()?;
5335
5336        let external_reference = if self.consume_token(&Token::LParen) {
5337            self.expect_keyword(REFERENCE)?;
5338            let _ = self.consume_token(&Token::Eq);
5339            let external_reference = self.parse_item_name()?;
5340            self.expect_token(&Token::RParen)?;
5341            Some(external_reference)
5342        } else {
5343            None
5344        };
5345
5346        let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5347            Some(KEY) => {
5348                self.expect_keyword(FORMAT)?;
5349                let key = self.parse_format()?;
5350                self.expect_keywords(&[VALUE, FORMAT])?;
5351                let value = self.parse_format()?;
5352                Some(FormatSpecifier::KeyValue { key, value })
5353            }
5354            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5355            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5356            None => None,
5357        };
5358        let include_metadata = self.parse_source_include_metadata()?;
5359
5360        let envelope = if self.parse_keyword(ENVELOPE) {
5361            Some(self.parse_source_envelope()?)
5362        } else {
5363            None
5364        };
5365
5366        let with_options = if self.parse_keyword(WITH) {
5367            self.expect_token(&Token::LParen)?;
5368            let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5369            self.expect_token(&Token::RParen)?;
5370            options
5371        } else {
5372            vec![]
5373        };
5374
5375        Ok(Statement::CreateTableFromSource(
5376            CreateTableFromSourceStatement {
5377                name: table_name,
5378                columns,
5379                constraints,
5380                if_not_exists,
5381                source,
5382                external_reference,
5383                format,
5384                include_metadata,
5385                envelope,
5386                with_options,
5387            },
5388        ))
5389    }
5390
5391    fn parse_table_from_source_option(
5392        &mut self,
5393    ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5394        let option = match self
5395            .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5396        {
5397            TEXT => {
5398                self.expect_keyword(COLUMNS)?;
5399
5400                let _ = self.consume_token(&Token::Eq);
5401
5402                let value = self
5403                    .parse_option_sequence(Parser::parse_identifier)?
5404                    .map(|inner| {
5405                        WithOptionValue::Sequence(
5406                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5407                        )
5408                    });
5409
5410                TableFromSourceOption {
5411                    name: TableFromSourceOptionName::TextColumns,
5412                    value,
5413                }
5414            }
5415            EXCLUDE => match self.expect_one_of_keywords(&[COLUMNS, CONSTRAINTS, ALL])? {
5416                COLUMNS => {
5417                    let _ = self.consume_token(&Token::Eq);
5418
5419                    let value =
5420                        self.parse_option_sequence(Parser::parse_identifier)?
5421                            .map(|inner| {
5422                                WithOptionValue::Sequence(
5423                                    inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5424                                )
5425                            });
5426
5427                    TableFromSourceOption {
5428                        name: TableFromSourceOptionName::ExcludeColumns,
5429                        value,
5430                    }
5431                }
5432                CONSTRAINTS => {
5433                    let _ = self.consume_token(&Token::Eq);
5434
5435                    // Constraint names are raw upstream identifiers whose case
5436                    // must be preserved exactly, so they are string literals
5437                    // rather than SQL identifiers.
5438                    let value = self
5439                        .parse_option_sequence(Parser::parse_literal_string)?
5440                        .map(|inner| {
5441                            WithOptionValue::Sequence(
5442                                inner
5443                                    .into_iter()
5444                                    .map(|s| WithOptionValue::Value(Value::String(s)))
5445                                    .collect_vec(),
5446                            )
5447                        });
5448
5449                    TableFromSourceOption {
5450                        name: TableFromSourceOptionName::ExcludeConstraints,
5451                        value,
5452                    }
5453                }
5454                ALL => {
5455                    let name = match self.expect_one_of_keywords(&[CONSTRAINTS, NOT])? {
5456                        CONSTRAINTS => TableFromSourceOptionName::ExcludeAllConstraints,
5457                        NOT => {
5458                            self.expect_keywords(&[NULL, CONSTRAINTS])?;
5459                            TableFromSourceOptionName::ExcludeAllNotNullConstraints
5460                        }
5461                        _ => unreachable!(),
5462                    };
5463                    TableFromSourceOption { name, value: None }
5464                }
5465                _ => unreachable!(),
5466            },
5467            DETAILS => TableFromSourceOption {
5468                name: TableFromSourceOptionName::Details,
5469                value: self.parse_optional_option_value()?,
5470            },
5471            IGNORE => {
5472                self.expect_keyword(COLUMNS)?;
5473                let _ = self.consume_token(&Token::Eq);
5474
5475                let value = self
5476                    .parse_option_sequence(Parser::parse_identifier)?
5477                    .map(|inner| {
5478                        WithOptionValue::Sequence(
5479                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5480                        )
5481                    });
5482                TableFromSourceOption {
5483                    // IGNORE is historical syntax for this option.
5484                    name: TableFromSourceOptionName::ExcludeColumns,
5485                    value,
5486                }
5487            }
5488            PARTITION => {
5489                self.expect_keyword(BY)?;
5490                TableFromSourceOption {
5491                    name: TableFromSourceOptionName::PartitionBy,
5492                    value: self.parse_optional_option_value()?,
5493                }
5494            }
5495            RETAIN => {
5496                self.expect_keyword(HISTORY)?;
5497                TableFromSourceOption {
5498                    name: TableFromSourceOptionName::RetainHistory,
5499                    value: self.parse_option_retain_history()?,
5500                }
5501            }
5502            _ => unreachable!(),
5503        };
5504        Ok(option)
5505    }
5506
5507    fn parse_table_from_source_columns(
5508        &mut self,
5509    ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5510        let mut constraints = vec![];
5511
5512        if !self.consume_token(&Token::LParen) {
5513            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5514        }
5515        if self.consume_token(&Token::RParen) {
5516            // Tables with zero columns are a PostgreSQL extension.
5517            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5518        }
5519
5520        let mut column_names = vec![];
5521        let mut column_defs = vec![];
5522        loop {
5523            if let Some(constraint) = self.parse_optional_table_constraint()? {
5524                constraints.push(constraint);
5525            } else if let Some(column_name) = self.consume_identifier()? {
5526                let next_token = self.peek_token();
5527                match next_token {
5528                    Some(Token::Comma) | Some(Token::RParen) => {
5529                        column_names.push(column_name);
5530                    }
5531                    _ => {
5532                        let data_type = self.parse_data_type()?;
5533                        let collation = if self.parse_keyword(COLLATE) {
5534                            Some(self.parse_item_name()?)
5535                        } else {
5536                            None
5537                        };
5538                        let mut options = vec![];
5539                        loop {
5540                            match self.peek_token() {
5541                                None | Some(Token::Comma) | Some(Token::RParen) => break,
5542                                _ => options.push(self.parse_column_option_def()?),
5543                            }
5544                        }
5545
5546                        column_defs.push(ColumnDef {
5547                            name: column_name,
5548                            data_type,
5549                            collation,
5550                            options,
5551                        });
5552                    }
5553                }
5554            } else {
5555                return self.expected(
5556                    self.peek_pos(),
5557                    "column name or constraint definition",
5558                    self.peek_token(),
5559                );
5560            }
5561            if self.consume_token(&Token::Comma) {
5562                // Continue.
5563            } else if self.consume_token(&Token::RParen) {
5564                break;
5565            } else {
5566                return self.expected(
5567                    self.peek_pos(),
5568                    "',' or ')' after column definition",
5569                    self.peek_token(),
5570                );
5571            }
5572        }
5573        if !column_defs.is_empty() && !column_names.is_empty() {
5574            return parser_err!(
5575                self,
5576                self.peek_prev_pos(),
5577                "cannot mix column definitions and column names"
5578            );
5579        }
5580
5581        let columns = match column_defs.is_empty() {
5582            true => match column_names.is_empty() {
5583                true => TableFromSourceColumns::NotSpecified,
5584                false => TableFromSourceColumns::Named(column_names),
5585            },
5586            false => TableFromSourceColumns::Defined(column_defs),
5587        };
5588
5589        Ok((columns, constraints))
5590    }
5591
5592    fn parse_columns(
5593        &mut self,
5594        optional: IsOptional,
5595    ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5596        let mut columns = vec![];
5597        let mut constraints = vec![];
5598
5599        if !self.consume_token(&Token::LParen) {
5600            if optional == Optional {
5601                return Ok((columns, constraints));
5602            } else {
5603                return self.expected(
5604                    self.peek_pos(),
5605                    "a list of columns in parentheses",
5606                    self.peek_token(),
5607                );
5608            }
5609        }
5610        if self.consume_token(&Token::RParen) {
5611            // Tables with zero columns are a PostgreSQL extension.
5612            return Ok((columns, constraints));
5613        }
5614
5615        loop {
5616            if let Some(constraint) = self.parse_optional_table_constraint()? {
5617                constraints.push(constraint);
5618            } else if let Some(column_name) = self.consume_identifier()? {
5619                let data_type = self.parse_data_type()?;
5620                let collation = if self.parse_keyword(COLLATE) {
5621                    Some(self.parse_item_name()?)
5622                } else {
5623                    None
5624                };
5625                let mut options = vec![];
5626                loop {
5627                    match self.peek_token() {
5628                        None | Some(Token::Comma) | Some(Token::RParen) => break,
5629                        _ => options.push(self.parse_column_option_def()?),
5630                    }
5631                }
5632
5633                columns.push(ColumnDef {
5634                    name: column_name,
5635                    data_type,
5636                    collation,
5637                    options,
5638                });
5639            } else {
5640                return self.expected(
5641                    self.peek_pos(),
5642                    "column name or constraint definition",
5643                    self.peek_token(),
5644                );
5645            }
5646            if self.consume_token(&Token::Comma) {
5647                // Continue.
5648            } else if self.consume_token(&Token::RParen) {
5649                break;
5650            } else {
5651                return self.expected(
5652                    self.peek_pos(),
5653                    "',' or ')' after column definition",
5654                    self.peek_token(),
5655                );
5656            }
5657        }
5658
5659        Ok((columns, constraints))
5660    }
5661
5662    fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5663        let name = if self.parse_keyword(CONSTRAINT) {
5664            Some(self.parse_identifier()?)
5665        } else {
5666            None
5667        };
5668
5669        let option = if self.parse_keywords(&[NOT, NULL]) {
5670            ColumnOption::NotNull
5671        } else if self.parse_keyword(NULL) {
5672            ColumnOption::Null
5673        } else if self.parse_keyword(DEFAULT) {
5674            ColumnOption::Default(self.parse_expr()?)
5675        } else if self.parse_keywords(&[PRIMARY, KEY]) {
5676            ColumnOption::Unique { is_primary: true }
5677        } else if self.parse_keyword(UNIQUE) {
5678            ColumnOption::Unique { is_primary: false }
5679        } else if self.parse_keyword(REFERENCES) {
5680            let foreign_table = self.parse_item_name()?;
5681            let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5682            ColumnOption::ForeignKey {
5683                foreign_table,
5684                referred_columns,
5685            }
5686        } else if self.parse_keyword(CHECK) {
5687            self.expect_token(&Token::LParen)?;
5688            let expr = self.parse_expr()?;
5689            self.expect_token(&Token::RParen)?;
5690            ColumnOption::Check(expr)
5691        } else if self.parse_keyword(VERSION) {
5692            self.expect_keyword(ADDED)?;
5693            let action = ColumnVersioned::Added;
5694            let version = self.parse_version()?;
5695
5696            ColumnOption::Versioned { action, version }
5697        } else {
5698            return self.expected(self.peek_pos(), "column option", self.peek_token());
5699        };
5700
5701        Ok(ColumnOptionDef { name, option })
5702    }
5703
5704    fn parse_optional_table_constraint(
5705        &mut self,
5706    ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5707        let name = if self.parse_keyword(CONSTRAINT) {
5708            Some(self.parse_identifier()?)
5709        } else {
5710            None
5711        };
5712        match self.next_token() {
5713            Some(Token::Keyword(PRIMARY)) => {
5714                self.expect_keyword(KEY)?;
5715                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5716                Ok(Some(TableConstraint::Unique {
5717                    name,
5718                    columns,
5719                    is_primary: true,
5720                    nulls_not_distinct: false,
5721                }))
5722            }
5723            Some(Token::Keyword(UNIQUE)) => {
5724                let nulls_not_distinct = if self.parse_keyword(NULLS) {
5725                    self.expect_keywords(&[NOT, DISTINCT])?;
5726                    true
5727                } else {
5728                    false
5729                };
5730
5731                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5732                Ok(Some(TableConstraint::Unique {
5733                    name,
5734                    columns,
5735                    is_primary: false,
5736                    nulls_not_distinct,
5737                }))
5738            }
5739            Some(Token::Keyword(FOREIGN)) => {
5740                self.expect_keyword(KEY)?;
5741                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5742                self.expect_keyword(REFERENCES)?;
5743                let foreign_table = self.parse_raw_name()?;
5744                let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5745                Ok(Some(TableConstraint::ForeignKey {
5746                    name,
5747                    columns,
5748                    foreign_table,
5749                    referred_columns,
5750                }))
5751            }
5752            Some(Token::Keyword(CHECK)) => {
5753                self.expect_token(&Token::LParen)?;
5754                let expr = Box::new(self.parse_expr()?);
5755                self.expect_token(&Token::RParen)?;
5756                Ok(Some(TableConstraint::Check { name, expr }))
5757            }
5758            unexpected => {
5759                if name.is_some() {
5760                    self.expected(
5761                        self.peek_prev_pos(),
5762                        "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5763                        unexpected,
5764                    )
5765                } else {
5766                    self.prev_token();
5767                    Ok(None)
5768                }
5769            }
5770        }
5771    }
5772
5773    fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5774        let _ = self.consume_token(&Token::Eq);
5775        Ok(WithOptionValue::Item(self.parse_raw_name()?))
5776    }
5777
5778    fn parse_optional_connection_credential_option_value(
5779        &mut self,
5780    ) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5781        match self.peek_token() {
5782            Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5783            _ => {
5784                let _ = self.consume_token(&Token::Eq);
5785                Ok(Some(self.parse_connection_credential_option_value()?))
5786            }
5787        }
5788    }
5789
5790    fn parse_connection_credential_option_value(
5791        &mut self,
5792    ) -> Result<WithOptionValue<Raw>, ParserError> {
5793        if self.parse_keyword(SECRET) {
5794            if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5795                Ok(WithOptionValue::Secret(secret))
5796            } else {
5797                Ok(WithOptionValue::Value(Value::String("secret".to_string())))
5798            }
5799        } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5800            Ok(WithOptionValue::Value(value))
5801        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
5802            Ok(WithOptionValue::Value(Value::String(ident.into_string())))
5803        } else {
5804            self.expected(
5805                self.peek_pos(),
5806                "connection credential value",
5807                self.peek_token(),
5808            )
5809        }
5810    }
5811
5812    fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5813        // The next token might be a value and might not. The only valid things
5814        // that indicate no value would be `)` for end-of-options , `,` for
5815        // another-option, or ';'/nothing for end-of-statement. Either of those
5816        // means there's no value, anything else means we expect a valid value.
5817        match self.peek_token() {
5818            Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5819            _ => {
5820                let _ = self.consume_token(&Token::Eq);
5821                Ok(Some(self.parse_option_value()?))
5822            }
5823        }
5824    }
5825
5826    fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5827    where
5828        F: FnMut(&mut Self) -> Result<T, ParserError>,
5829    {
5830        Ok(if self.consume_token(&Token::LParen) {
5831            let options = if self.consume_token(&Token::RParen) {
5832                vec![]
5833            } else {
5834                let options = self.parse_comma_separated(f)?;
5835                self.expect_token(&Token::RParen)?;
5836                options
5837            };
5838
5839            Some(options)
5840        } else if self.consume_token(&Token::LBracket) {
5841            let options = if self.consume_token(&Token::RBracket) {
5842                vec![]
5843            } else {
5844                let options = self.parse_comma_separated(f)?;
5845
5846                self.expect_token(&Token::RBracket)?;
5847                options
5848            };
5849
5850            Some(options)
5851        } else {
5852            None
5853        })
5854    }
5855
5856    fn parse_option_map(
5857        &mut self,
5858    ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5859        // `MAP` only begins a map literal when a `[` follows it. Committing on
5860        // the keyword alone makes a bare `map` in an option-value position a hard
5861        // error on the missing bracket, rather than falling through to the item
5862        // name it is: `TOPIC CONFIG = "map"` prints as `TOPIC CONFIG = map`,
5863        // since `map` is a legal bare identifier everywhere else, and that output
5864        // then failed to reparse.
5865        if !(self.peek_keyword(MAP) && self.peek_nth_token(1) == Some(Token::LBracket)) {
5866            return Ok(None);
5867        }
5868        Ok(if self.parse_keyword(MAP) {
5869            self.expect_token(&Token::LBracket)?;
5870            let mut map = BTreeMap::new();
5871            loop {
5872                if let Some(Token::RBracket) = self.peek_token() {
5873                    break;
5874                }
5875                let key = match self.next_token() {
5876                    Some(Token::String(s)) => s,
5877                    token => return self.expected(self.peek_pos(), "string", token),
5878                };
5879                self.expect_token(&Token::Arrow)?;
5880                let value = Parser::parse_option_value(self)?;
5881                map.insert(key, value);
5882                if !self.consume_token(&Token::Comma) {
5883                    break;
5884                }
5885            }
5886            self.expect_token(&Token::RBracket)?;
5887            Some(map)
5888        } else {
5889            None
5890        })
5891    }
5892
5893    fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5894        if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5895            Ok(WithOptionValue::Sequence(seq))
5896        } else if let Some(map) = self.parse_option_map()? {
5897            Ok(WithOptionValue::Map(map))
5898        } else if self.parse_keyword(SECRET) {
5899            if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5900                Ok(WithOptionValue::Secret(secret))
5901            } else {
5902                Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5903                    vec![ident!("secret")],
5904                )))
5905            }
5906        } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5907            Ok(WithOptionValue::Value(value))
5908        } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5909            Ok(WithOptionValue::UnresolvedItemName(item_name))
5910        } else {
5911            self.expected(self.peek_pos(), "option value", self.peek_token())
5912        }
5913    }
5914
5915    fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5916        let _ = self.consume_token(&Token::Eq);
5917        Ok(WithOptionValue::DataType(self.parse_data_type()?))
5918    }
5919
5920    fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5921        if self.parse_keyword(SYSTEM) {
5922            self.parse_alter_system()
5923        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5924            self.parse_alter_default_privileges()
5925                .map_parser_err(StatementKind::AlterDefaultPrivileges)
5926        } else {
5927            self.parse_alter_object()
5928        }
5929    }
5930
5931    fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5932        let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5933
5934        match object_type {
5935            ObjectType::Role => self
5936                .parse_alter_role()
5937                .map_parser_err(StatementKind::AlterRole),
5938            ObjectType::Sink => self.parse_alter_sink(),
5939            ObjectType::Source => self.parse_alter_source(),
5940            ObjectType::Index => self.parse_alter_index(),
5941            ObjectType::Secret => self.parse_alter_secret(),
5942            ObjectType::Connection => self.parse_alter_connection(),
5943            ObjectType::View | ObjectType::MaterializedView | ObjectType::Table => {
5944                self.parse_alter_views(object_type)
5945            }
5946            ObjectType::Type => {
5947                let if_exists = self
5948                    .parse_if_exists()
5949                    .map_parser_err(StatementKind::AlterOwner)?;
5950                let name = UnresolvedObjectName::Item(
5951                    self.parse_item_name()
5952                        .map_parser_err(StatementKind::AlterOwner)?,
5953                );
5954                self.expect_keywords(&[OWNER, TO])
5955                    .map_parser_err(StatementKind::AlterOwner)?;
5956                let new_owner = self
5957                    .parse_identifier()
5958                    .map_parser_err(StatementKind::AlterOwner)?;
5959                Ok(Statement::AlterOwner(AlterOwnerStatement {
5960                    object_type,
5961                    if_exists,
5962                    name,
5963                    new_owner,
5964                }))
5965            }
5966            ObjectType::Cluster => self.parse_alter_cluster(object_type),
5967            ObjectType::ClusterReplica => {
5968                let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5969                let name = UnresolvedObjectName::ClusterReplica(
5970                    self.parse_cluster_replica_name()
5971                        .map_no_statement_parser_err()?,
5972                );
5973                let action = self
5974                    .expect_one_of_keywords(&[OWNER, RENAME])
5975                    .map_no_statement_parser_err()?;
5976                self.expect_keyword(TO).map_no_statement_parser_err()?;
5977                match action {
5978                    OWNER => {
5979                        let new_owner = self
5980                            .parse_identifier()
5981                            .map_parser_err(StatementKind::AlterOwner)?;
5982                        Ok(Statement::AlterOwner(AlterOwnerStatement {
5983                            object_type,
5984                            if_exists,
5985                            name,
5986                            new_owner,
5987                        }))
5988                    }
5989                    RENAME => {
5990                        let to_item_name = self
5991                            .parse_identifier()
5992                            .map_parser_err(StatementKind::AlterObjectRename)?;
5993                        Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5994                            object_type,
5995                            if_exists,
5996                            name,
5997                            to_item_name,
5998                        }))
5999                    }
6000                    _ => unreachable!(),
6001                }
6002            }
6003            ObjectType::Database => {
6004                let if_exists = self
6005                    .parse_if_exists()
6006                    .map_parser_err(StatementKind::AlterOwner)?;
6007                let name = UnresolvedObjectName::Database(
6008                    self.parse_database_name()
6009                        .map_parser_err(StatementKind::AlterOwner)?,
6010                );
6011                self.expect_keywords(&[OWNER, TO])
6012                    .map_parser_err(StatementKind::AlterOwner)?;
6013                let new_owner = self
6014                    .parse_identifier()
6015                    .map_parser_err(StatementKind::AlterOwner)?;
6016                Ok(Statement::AlterOwner(AlterOwnerStatement {
6017                    object_type,
6018                    if_exists,
6019                    name,
6020                    new_owner,
6021                }))
6022            }
6023            ObjectType::Schema => self.parse_alter_schema(object_type),
6024            ObjectType::NetworkPolicy => self
6025                .parse_alter_network_policy()
6026                .map_parser_err(StatementKind::AlterNetworkPolicy),
6027            // Metric sinks are adapter-created and not a user surface, so they deliberately
6028            // support no ALTER at all, `RENAME TO` and `OWNER TO` included. REASSIGN OWNED
6029            // works off object ids and is unaffected.
6030            ObjectType::Func | ObjectType::Subsource | ObjectType::MetricSink => parser_err!(
6031                self,
6032                self.peek_prev_pos(),
6033                format!("Unsupported ALTER on {object_type}")
6034            )
6035            .map_no_statement_parser_err(),
6036        }
6037    }
6038
6039    fn parse_alter_cluster(
6040        &mut self,
6041        object_type: ObjectType,
6042    ) -> Result<Statement<Raw>, ParserStatementError> {
6043        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6044        let name = self.parse_identifier().map_no_statement_parser_err()?;
6045        let action = self
6046            .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
6047            .map_no_statement_parser_err()?;
6048        match action {
6049            OWNER => {
6050                self.expect_keyword(TO)
6051                    .map_parser_err(StatementKind::AlterOwner)?;
6052                let new_owner = self
6053                    .parse_identifier()
6054                    .map_parser_err(StatementKind::AlterOwner)?;
6055                let name = UnresolvedObjectName::Cluster(name);
6056                Ok(Statement::AlterOwner(AlterOwnerStatement {
6057                    object_type,
6058                    if_exists,
6059                    name,
6060                    new_owner,
6061                }))
6062            }
6063            RENAME => {
6064                self.expect_keyword(TO)
6065                    .map_parser_err(StatementKind::AlterObjectRename)?;
6066                let to_item_name = self
6067                    .parse_identifier()
6068                    .map_parser_err(StatementKind::AlterObjectRename)?;
6069                let name = UnresolvedObjectName::Cluster(name);
6070                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6071                    object_type,
6072                    if_exists,
6073                    name,
6074                    to_item_name,
6075                }))
6076            }
6077            RESET => {
6078                self.expect_token(&Token::LParen)
6079                    .map_parser_err(StatementKind::AlterCluster)?;
6080                let names = self
6081                    .parse_comma_separated(Parser::parse_cluster_option_name)
6082                    .map_parser_err(StatementKind::AlterCluster)?;
6083                self.expect_token(&Token::RParen)
6084                    .map_parser_err(StatementKind::AlterCluster)?;
6085                Ok(Statement::AlterCluster(AlterClusterStatement {
6086                    if_exists,
6087                    name,
6088                    action: AlterClusterAction::ResetOptions(names),
6089                }))
6090            }
6091            SET => {
6092                self.expect_token(&Token::LParen)
6093                    .map_parser_err(StatementKind::AlterCluster)?;
6094                let options = self
6095                    .parse_comma_separated(Parser::parse_cluster_option)
6096                    .map_parser_err(StatementKind::AlterCluster)?;
6097                self.expect_token(&Token::RParen)
6098                    .map_parser_err(StatementKind::AlterCluster)?;
6099                let with_options = if self.parse_keyword(WITH) {
6100                    self.expect_token(&Token::LParen)
6101                        .map_parser_err(StatementKind::AlterCluster)?;
6102                    let options = self
6103                        .parse_comma_separated(Parser::parse_alter_cluster_option)
6104                        .map_parser_err(StatementKind::AlterCluster)?;
6105                    self.expect_token(&Token::RParen)
6106                        .map_parser_err(StatementKind::AlterCluster)?;
6107                    options
6108                } else {
6109                    vec![]
6110                };
6111                Ok(Statement::AlterCluster(AlterClusterStatement {
6112                    if_exists,
6113                    name,
6114                    action: AlterClusterAction::SetOptions {
6115                        options,
6116                        with_options,
6117                    },
6118                }))
6119            }
6120            SWAP => {
6121                self.expect_keyword(WITH)
6122                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6123                let name_b = self
6124                    .parse_identifier()
6125                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6126
6127                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6128                    object_type,
6129                    if_exists,
6130                    name_a: UnresolvedObjectName::Cluster(name),
6131                    name_b,
6132                }))
6133            }
6134            _ => unreachable!(),
6135        }
6136    }
6137
6138    fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6139        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6140        let source_name = self.parse_item_name().map_no_statement_parser_err()?;
6141
6142        Ok(
6143            match self
6144                .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
6145                .map_no_statement_parser_err()?
6146            {
6147                ADD => {
6148                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6149                        .map_parser_err(StatementKind::AlterSource)?;
6150
6151                    // TODO: Add IF NOT EXISTS?
6152                    let subsources = self
6153                        .parse_comma_separated(Parser::parse_subsource_references)
6154                        .map_parser_err(StatementKind::AlterSource)?;
6155
6156                    let options = if self.parse_keyword(WITH) {
6157                        self.expect_token(&Token::LParen)
6158                            .map_parser_err(StatementKind::AlterSource)?;
6159                        let options = self
6160                            .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
6161                            .map_parser_err(StatementKind::AlterSource)?;
6162                        self.expect_token(&Token::RParen)
6163                            .map_parser_err(StatementKind::AlterSource)?;
6164                        options
6165                    } else {
6166                        vec![]
6167                    };
6168
6169                    Statement::AlterSource(AlterSourceStatement {
6170                        source_name,
6171                        if_exists,
6172                        action: AlterSourceAction::AddSubsources {
6173                            external_references: subsources,
6174                            options,
6175                        },
6176                    })
6177                }
6178                DROP => {
6179                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6180                        .map_parser_err(StatementKind::AlterSource)?;
6181
6182                    let if_exists_inner = self
6183                        .parse_if_exists()
6184                        .map_parser_err(StatementKind::AlterSource)?;
6185
6186                    let names = self
6187                        .parse_comma_separated(Parser::parse_item_name)
6188                        .map_parser_err(StatementKind::AlterSource)?;
6189
6190                    let cascade = matches!(
6191                        self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
6192                            .map_parser_err(StatementKind::AlterSource)?,
6193                        Some(CASCADE),
6194                    );
6195
6196                    Statement::AlterSource(AlterSourceStatement {
6197                        source_name,
6198                        if_exists,
6199                        action: AlterSourceAction::DropSubsources {
6200                            if_exists: if_exists_inner,
6201                            cascade,
6202                            names,
6203                        },
6204                    })
6205                }
6206                RESET => {
6207                    self.expect_token(&Token::LParen)
6208                        .map_parser_err(StatementKind::AlterSource)?;
6209                    let reset_options = self
6210                        .parse_comma_separated(Parser::parse_source_option_name)
6211                        .map_parser_err(StatementKind::AlterSource)?;
6212                    self.expect_token(&Token::RParen)
6213                        .map_parser_err(StatementKind::AlterSource)?;
6214
6215                    Statement::AlterSource(AlterSourceStatement {
6216                        source_name,
6217                        if_exists,
6218                        action: AlterSourceAction::ResetOptions(reset_options),
6219                    })
6220                }
6221                SET => {
6222                    if let Some(stmt) = self.maybe_parse_alter_set_cluster(
6223                        if_exists,
6224                        &source_name,
6225                        ObjectType::Source,
6226                    ) {
6227                        return stmt;
6228                    }
6229                    self.expect_token(&Token::LParen)
6230                        .map_parser_err(StatementKind::AlterSource)?;
6231                    let set_options = self
6232                        .parse_comma_separated(Parser::parse_source_option)
6233                        .map_parser_err(StatementKind::AlterSource)?;
6234                    self.expect_token(&Token::RParen)
6235                        .map_parser_err(StatementKind::AlterSource)?;
6236                    Statement::AlterSource(AlterSourceStatement {
6237                        source_name,
6238                        if_exists,
6239                        action: AlterSourceAction::SetOptions(set_options),
6240                    })
6241                }
6242                RENAME => {
6243                    self.expect_keyword(TO)
6244                        .map_parser_err(StatementKind::AlterObjectRename)?;
6245                    let to_item_name = self
6246                        .parse_identifier()
6247                        .map_parser_err(StatementKind::AlterObjectRename)?;
6248
6249                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6250                        object_type: ObjectType::Source,
6251                        if_exists,
6252                        name: UnresolvedObjectName::Item(source_name),
6253                        to_item_name,
6254                    })
6255                }
6256                OWNER => {
6257                    self.expect_keyword(TO)
6258                        .map_parser_err(StatementKind::AlterOwner)?;
6259                    let new_owner = self
6260                        .parse_identifier()
6261                        .map_parser_err(StatementKind::AlterOwner)?;
6262
6263                    Statement::AlterOwner(AlterOwnerStatement {
6264                        object_type: ObjectType::Source,
6265                        if_exists,
6266                        name: UnresolvedObjectName::Item(source_name),
6267                        new_owner,
6268                    })
6269                }
6270                REFRESH => {
6271                    self.expect_keyword(REFERENCES)
6272                        .map_parser_err(StatementKind::AlterSource)?;
6273                    Statement::AlterSource(AlterSourceStatement {
6274                        source_name,
6275                        if_exists,
6276                        action: AlterSourceAction::RefreshReferences,
6277                    })
6278                }
6279                _ => unreachable!(),
6280            },
6281        )
6282    }
6283
6284    fn parse_alter_source_add_subsource_option(
6285        &mut self,
6286    ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6287        match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6288            ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6289                self.expect_keyword(COLUMNS)?;
6290
6291                let _ = self.consume_token(&Token::Eq);
6292
6293                let value = self
6294                    .parse_option_sequence(Parser::parse_item_name)?
6295                    .map(|inner| {
6296                        WithOptionValue::Sequence(
6297                            inner
6298                                .into_iter()
6299                                .map(WithOptionValue::UnresolvedItemName)
6300                                .collect_vec(),
6301                        )
6302                    });
6303
6304                Ok(AlterSourceAddSubsourceOption {
6305                    name: match *keyword {
6306                        TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6307                        // IGNORE is historical syntax for this option.
6308                        EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6309                        _ => unreachable!(),
6310                    },
6311                    value,
6312                })
6313            }
6314            _ => unreachable!(),
6315        }
6316    }
6317
6318    fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6319        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6320        let name = self.parse_item_name().map_no_statement_parser_err()?;
6321
6322        Ok(
6323            match self
6324                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6325                .map_no_statement_parser_err()?
6326            {
6327                RESET => {
6328                    self.expect_token(&Token::LParen)
6329                        .map_parser_err(StatementKind::AlterIndex)?;
6330                    let reset_options = self
6331                        .parse_comma_separated(Parser::parse_index_option_name)
6332                        .map_parser_err(StatementKind::AlterIndex)?;
6333                    self.expect_token(&Token::RParen)
6334                        .map_parser_err(StatementKind::AlterIndex)?;
6335
6336                    Statement::AlterIndex(AlterIndexStatement {
6337                        index_name: name,
6338                        if_exists,
6339                        action: AlterIndexAction::ResetOptions(reset_options),
6340                    })
6341                }
6342                SET => {
6343                    self.expect_token(&Token::LParen)
6344                        .map_parser_err(StatementKind::AlterIndex)?;
6345                    let set_options = self
6346                        .parse_comma_separated(Parser::parse_index_option)
6347                        .map_parser_err(StatementKind::AlterIndex)?;
6348                    self.expect_token(&Token::RParen)
6349                        .map_parser_err(StatementKind::AlterIndex)?;
6350                    Statement::AlterIndex(AlterIndexStatement {
6351                        index_name: name,
6352                        if_exists,
6353                        action: AlterIndexAction::SetOptions(set_options),
6354                    })
6355                }
6356                RENAME => {
6357                    self.expect_keyword(TO)
6358                        .map_parser_err(StatementKind::AlterObjectRename)?;
6359                    let to_item_name = self
6360                        .parse_identifier()
6361                        .map_parser_err(StatementKind::AlterObjectRename)?;
6362
6363                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6364                        object_type: ObjectType::Index,
6365                        if_exists,
6366                        name: UnresolvedObjectName::Item(name),
6367                        to_item_name,
6368                    })
6369                }
6370                OWNER => {
6371                    self.expect_keyword(TO)
6372                        .map_parser_err(StatementKind::AlterOwner)?;
6373                    let new_owner = self
6374                        .parse_identifier()
6375                        .map_parser_err(StatementKind::AlterOwner)?;
6376
6377                    Statement::AlterOwner(AlterOwnerStatement {
6378                        object_type: ObjectType::Index,
6379                        if_exists,
6380                        name: UnresolvedObjectName::Item(name),
6381                        new_owner,
6382                    })
6383                }
6384                _ => unreachable!(),
6385            },
6386        )
6387    }
6388
6389    fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6390        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6391        let name = self.parse_item_name().map_no_statement_parser_err()?;
6392
6393        Ok(
6394            match self
6395                .expect_one_of_keywords(&[AS, RENAME, OWNER])
6396                .map_no_statement_parser_err()?
6397            {
6398                AS => {
6399                    let value = self
6400                        .parse_expr()
6401                        .map_parser_err(StatementKind::AlterSecret)?;
6402                    Statement::AlterSecret(AlterSecretStatement {
6403                        name,
6404                        if_exists,
6405                        value,
6406                    })
6407                }
6408                RENAME => {
6409                    self.expect_keyword(TO)
6410                        .map_parser_err(StatementKind::AlterObjectRename)?;
6411                    let to_item_name = self
6412                        .parse_identifier()
6413                        .map_parser_err(StatementKind::AlterObjectRename)?;
6414
6415                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6416                        object_type: ObjectType::Secret,
6417                        if_exists,
6418                        name: UnresolvedObjectName::Item(name),
6419                        to_item_name,
6420                    })
6421                }
6422                OWNER => {
6423                    self.expect_keyword(TO)
6424                        .map_parser_err(StatementKind::AlterOwner)?;
6425                    let new_owner = self
6426                        .parse_identifier()
6427                        .map_parser_err(StatementKind::AlterOwner)?;
6428
6429                    Statement::AlterOwner(AlterOwnerStatement {
6430                        object_type: ObjectType::Secret,
6431                        if_exists,
6432                        name: UnresolvedObjectName::Item(name),
6433                        new_owner,
6434                    })
6435                }
6436                _ => unreachable!(),
6437            },
6438        )
6439    }
6440
6441    /// Parse an ALTER SINK statement.
6442    fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6443        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6444        let name = self.parse_item_name().map_no_statement_parser_err()?;
6445
6446        Ok(
6447            match self
6448                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6449                .map_no_statement_parser_err()?
6450            {
6451                RESET => {
6452                    self.expect_token(&Token::LParen)
6453                        .map_parser_err(StatementKind::AlterSink)?;
6454                    let reset_options = self
6455                        .parse_comma_separated(Parser::parse_create_sink_option_name)
6456                        .map_parser_err(StatementKind::AlterSink)?;
6457                    self.expect_token(&Token::RParen)
6458                        .map_parser_err(StatementKind::AlterSink)?;
6459
6460                    Statement::AlterSink(AlterSinkStatement {
6461                        sink_name: name,
6462                        if_exists,
6463                        action: AlterSinkAction::ResetOptions(reset_options),
6464                    })
6465                }
6466                SET => {
6467                    if let Some(result) =
6468                        self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6469                    {
6470                        return result;
6471                    }
6472
6473                    if self.parse_keyword(FROM) {
6474                        let from = self
6475                            .parse_raw_name()
6476                            .map_parser_err(StatementKind::AlterSink)?;
6477
6478                        Statement::AlterSink(AlterSinkStatement {
6479                            sink_name: name,
6480                            if_exists,
6481                            action: AlterSinkAction::ChangeRelation(from),
6482                        })
6483                    } else {
6484                        self.expect_token(&Token::LParen)
6485                            .map_parser_err(StatementKind::AlterSink)?;
6486                        let set_options = self
6487                            .parse_comma_separated(Parser::parse_create_sink_option)
6488                            .map_parser_err(StatementKind::AlterSink)?;
6489                        self.expect_token(&Token::RParen)
6490                            .map_parser_err(StatementKind::AlterSink)?;
6491                        Statement::AlterSink(AlterSinkStatement {
6492                            sink_name: name,
6493                            if_exists,
6494                            action: AlterSinkAction::SetOptions(set_options),
6495                        })
6496                    }
6497                }
6498                RENAME => {
6499                    self.expect_keyword(TO)
6500                        .map_parser_err(StatementKind::AlterObjectRename)?;
6501                    let to_item_name = self
6502                        .parse_identifier()
6503                        .map_parser_err(StatementKind::AlterObjectRename)?;
6504
6505                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6506                        object_type: ObjectType::Sink,
6507                        if_exists,
6508                        name: UnresolvedObjectName::Item(name),
6509                        to_item_name,
6510                    })
6511                }
6512                OWNER => {
6513                    self.expect_keyword(TO)
6514                        .map_parser_err(StatementKind::AlterOwner)?;
6515                    let new_owner = self
6516                        .parse_identifier()
6517                        .map_parser_err(StatementKind::AlterOwner)?;
6518
6519                    Statement::AlterOwner(AlterOwnerStatement {
6520                        object_type: ObjectType::Sink,
6521                        if_exists,
6522                        name: UnresolvedObjectName::Item(name),
6523                        new_owner,
6524                    })
6525                }
6526                _ => unreachable!(),
6527            },
6528        )
6529    }
6530
6531    /// Parse an ALTER SYSTEM statement.
6532    fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6533        match self
6534            .expect_one_of_keywords(&[SET, RESET])
6535            .map_no_statement_parser_err()?
6536        {
6537            SET => {
6538                let name = self
6539                    .parse_identifier()
6540                    .map_parser_err(StatementKind::AlterSystemSet)?;
6541                self.expect_keyword_or_token(TO, &Token::Eq)
6542                    .map_parser_err(StatementKind::AlterSystemSet)?;
6543                let to = self
6544                    .parse_set_variable_to()
6545                    .map_parser_err(StatementKind::AlterSystemSet)?;
6546                Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6547                    name,
6548                    to,
6549                }))
6550            }
6551            RESET => {
6552                if self.parse_keyword(ALL) {
6553                    Ok(Statement::AlterSystemResetAll(
6554                        AlterSystemResetAllStatement {},
6555                    ))
6556                } else {
6557                    let name = self
6558                        .parse_identifier()
6559                        .map_parser_err(StatementKind::AlterSystemReset)?;
6560                    Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6561                        name,
6562                    }))
6563                }
6564            }
6565            _ => unreachable!(),
6566        }
6567    }
6568
6569    fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6570        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6571        let name = self.parse_item_name().map_no_statement_parser_err()?;
6572
6573        Ok(
6574            match self
6575                .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6576                .map_no_statement_parser_err()?
6577            {
6578                RENAME => {
6579                    self.expect_keyword(TO)
6580                        .map_parser_err(StatementKind::AlterObjectRename)?;
6581                    let to_item_name = self
6582                        .parse_identifier()
6583                        .map_parser_err(StatementKind::AlterObjectRename)?;
6584
6585                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6586                        object_type: ObjectType::Connection,
6587                        if_exists,
6588                        name: UnresolvedObjectName::Item(name),
6589                        to_item_name,
6590                    })
6591                }
6592                OWNER => {
6593                    self.expect_keyword(TO)
6594                        .map_parser_err(StatementKind::AlterOwner)?;
6595                    let new_owner = self
6596                        .parse_identifier()
6597                        .map_parser_err(StatementKind::AlterOwner)?;
6598
6599                    Statement::AlterOwner(AlterOwnerStatement {
6600                        object_type: ObjectType::Connection,
6601                        if_exists,
6602                        name: UnresolvedObjectName::Item(name),
6603                        new_owner,
6604                    })
6605                }
6606                _ => {
6607                    self.prev_token();
6608                    let actions = self
6609                        .parse_comma_separated(Parser::parse_alter_connection_action)
6610                        .map_parser_err(StatementKind::AlterConnection)?;
6611
6612                    let with_options = if self.parse_keyword(WITH) {
6613                        self.expect_token(&Token::LParen)
6614                            .map_parser_err(StatementKind::AlterConnection)?;
6615                        let options = self
6616                            .parse_comma_separated(Parser::parse_alter_connection_option)
6617                            .map_parser_err(StatementKind::AlterConnection)?;
6618                        self.expect_token(&Token::RParen)
6619                            .map_parser_err(StatementKind::AlterConnection)?;
6620                        options
6621                    } else {
6622                        vec![]
6623                    };
6624
6625                    Statement::AlterConnection(AlterConnectionStatement {
6626                        name,
6627                        if_exists,
6628                        actions,
6629                        with_options,
6630                    })
6631                }
6632            },
6633        )
6634    }
6635
6636    fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6637        let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6638            ROTATE => {
6639                self.expect_keyword(KEYS)?;
6640                AlterConnectionAction::RotateKeys
6641            }
6642            SET => {
6643                self.expect_token(&Token::LParen)?;
6644                let option = self.parse_connection_option_unified()?;
6645                self.expect_token(&Token::RParen)?;
6646                AlterConnectionAction::SetOption(option)
6647            }
6648            DROP | RESET => {
6649                self.expect_token(&Token::LParen)?;
6650                let option = self.parse_connection_option_name()?;
6651                self.expect_token(&Token::RParen)?;
6652                AlterConnectionAction::DropOption(option)
6653            }
6654            _ => unreachable!(),
6655        };
6656
6657        Ok(r)
6658    }
6659
6660    /// Parses a single valid option in the WITH block of a create source
6661    fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6662        let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6663            VALIDATE => AlterConnectionOptionName::Validate,
6664            _ => unreachable!(),
6665        };
6666
6667        Ok(AlterConnectionOption {
6668            name,
6669            value: self.parse_optional_option_value()?,
6670        })
6671    }
6672
6673    fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6674        let name = self.parse_identifier()?;
6675
6676        let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6677            Some(SET) => {
6678                let name = self.parse_identifier()?;
6679                self.expect_keyword_or_token(TO, &Token::Eq)?;
6680                let value = self.parse_set_variable_to()?;
6681                let var = SetRoleVar::Set { name, value };
6682                AlterRoleOption::Variable(var)
6683            }
6684            Some(RESET) => {
6685                let name = self.parse_identifier()?;
6686                let var = SetRoleVar::Reset { name };
6687                AlterRoleOption::Variable(var)
6688            }
6689            Some(WITH) | None => {
6690                let _ = self.parse_keyword(WITH);
6691                let attrs = self.parse_role_attributes()?;
6692                AlterRoleOption::Attributes(attrs)
6693            }
6694            Some(k) => unreachable!("unmatched keyword: {k}"),
6695        };
6696
6697        Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6698    }
6699
6700    fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6701        self.expect_keyword(FOR)?;
6702        let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6703            ROLE | USER => TargetRoleSpecification::Roles(
6704                self.parse_comma_separated(Parser::parse_identifier)?,
6705            ),
6706            ALL => {
6707                self.expect_keyword(ROLES)?;
6708                TargetRoleSpecification::AllRoles
6709            }
6710            _ => unreachable!(),
6711        };
6712        let target_objects = if self.parse_keyword(IN) {
6713            match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6714                SCHEMA => GrantTargetAllSpecification::AllSchemas {
6715                    schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6716                },
6717                DATABASE => GrantTargetAllSpecification::AllDatabases {
6718                    databases: self.parse_comma_separated(Parser::parse_database_name)?,
6719                },
6720                _ => unreachable!(),
6721            }
6722        } else {
6723            GrantTargetAllSpecification::All
6724        };
6725        let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6726        let privileges = self.parse_privilege_specification().ok_or_else(|| {
6727            self.expected::<_, PrivilegeSpecification>(
6728                self.peek_pos(),
6729                "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6730                self.peek_token(),
6731            )
6732            .expect_err("only returns errors")
6733        })?;
6734        self.expect_keyword(ON)?;
6735        let object_type =
6736            self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6737        if is_grant {
6738            self.expect_keyword(TO)?;
6739        } else {
6740            self.expect_keyword(FROM)?;
6741        }
6742        let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6743
6744        let grant_or_revoke = if is_grant {
6745            AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6746                privileges,
6747                object_type,
6748                grantees,
6749            })
6750        } else {
6751            AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6752                privileges,
6753                object_type,
6754                revokees: grantees,
6755            })
6756        };
6757
6758        Ok(Statement::AlterDefaultPrivileges(
6759            AlterDefaultPrivilegesStatement {
6760                target_roles,
6761                target_objects,
6762                grant_or_revoke,
6763            },
6764        ))
6765    }
6766
6767    fn parse_alter_views(
6768        &mut self,
6769        object_type: ObjectType,
6770    ) -> Result<Statement<Raw>, ParserStatementError> {
6771        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6772        let name = self.parse_item_name().map_no_statement_parser_err()?;
6773        let keywords: &[_] = match object_type {
6774            ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6775            ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6776            ObjectType::View => &[SET, RENAME, OWNER, RESET],
6777            ObjectType::Source
6778            | ObjectType::Sink
6779            | ObjectType::MetricSink
6780            | ObjectType::Index
6781            | ObjectType::Type
6782            | ObjectType::Role
6783            | ObjectType::Cluster
6784            | ObjectType::ClusterReplica
6785            | ObjectType::Secret
6786            | ObjectType::Connection
6787            | ObjectType::Database
6788            | ObjectType::Schema
6789            | ObjectType::Func
6790            | ObjectType::Subsource
6791            | ObjectType::NetworkPolicy => {
6792                unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6793            }
6794        };
6795
6796        let action = self
6797            .expect_one_of_keywords(keywords)
6798            .map_no_statement_parser_err()?;
6799        match action {
6800            RENAME => {
6801                self.expect_keyword(TO).map_no_statement_parser_err()?;
6802                let to_item_name = self
6803                    .parse_identifier()
6804                    .map_parser_err(StatementKind::AlterObjectRename)?;
6805                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6806                    object_type,
6807                    if_exists,
6808                    name: UnresolvedObjectName::Item(name),
6809                    to_item_name,
6810                }))
6811            }
6812            SET => {
6813                if self.parse_keyword(CLUSTER) {
6814                    self.parse_alter_set_cluster(if_exists, name, object_type)
6815                } else {
6816                    self.expect_token(&Token::LParen)
6817                        .map_no_statement_parser_err()?;
6818                    self.expect_keywords(&[RETAIN, HISTORY])
6819                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6820                    let history = self
6821                        .parse_retain_history()
6822                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6823                    self.expect_token(&Token::RParen)
6824                        .map_parser_err(StatementKind::AlterCluster)?;
6825                    Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6826                        object_type,
6827                        if_exists,
6828                        name: UnresolvedObjectName::Item(name),
6829                        history: Some(history),
6830                    }))
6831                }
6832            }
6833            RESET => {
6834                self.expect_token(&Token::LParen)
6835                    .map_no_statement_parser_err()?;
6836                self.expect_keywords(&[RETAIN, HISTORY])
6837                    .map_parser_err(StatementKind::AlterRetainHistory)?;
6838                self.expect_token(&Token::RParen)
6839                    .map_no_statement_parser_err()?;
6840                Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6841                    object_type,
6842                    if_exists,
6843                    name: UnresolvedObjectName::Item(name),
6844                    history: None,
6845                }))
6846            }
6847            OWNER => {
6848                self.expect_keyword(TO).map_no_statement_parser_err()?;
6849                let new_owner = self
6850                    .parse_identifier()
6851                    .map_parser_err(StatementKind::AlterOwner)?;
6852                Ok(Statement::AlterOwner(AlterOwnerStatement {
6853                    object_type,
6854                    if_exists,
6855                    name: UnresolvedObjectName::Item(name),
6856                    new_owner,
6857                }))
6858            }
6859            ADD => {
6860                assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6861
6862                self.expect_keyword(COLUMN)
6863                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6864                let if_col_not_exist = self
6865                    .parse_if_not_exists()
6866                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6867                let column_name = self
6868                    .parse_identifier()
6869                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6870                let data_type = self
6871                    .parse_data_type()
6872                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6873
6874                Ok(Statement::AlterTableAddColumn(
6875                    AlterTableAddColumnStatement {
6876                        if_exists,
6877                        name,
6878                        if_col_not_exist,
6879                        column_name,
6880                        data_type,
6881                    },
6882                ))
6883            }
6884            APPLY => {
6885                assert_eq!(
6886                    object_type,
6887                    ObjectType::MaterializedView,
6888                    "checked object_type above",
6889                );
6890
6891                self.expect_keyword(REPLACEMENT)
6892                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6893
6894                let replacement_name = self
6895                    .parse_item_name()
6896                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6897
6898                Ok(Statement::AlterMaterializedViewApplyReplacement(
6899                    AlterMaterializedViewApplyReplacementStatement {
6900                        if_exists,
6901                        name,
6902                        replacement_name,
6903                    },
6904                ))
6905            }
6906            _ => unreachable!(),
6907        }
6908    }
6909
6910    fn parse_alter_schema(
6911        &mut self,
6912        object_type: ObjectType,
6913    ) -> Result<Statement<Raw>, ParserStatementError> {
6914        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6915        let name = self.parse_schema_name().map_no_statement_parser_err()?;
6916        let name = UnresolvedObjectName::Schema(name);
6917        let action = self
6918            .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6919            .map_no_statement_parser_err()?;
6920
6921        match action {
6922            OWNER => {
6923                self.expect_keyword(TO)
6924                    .map_parser_err(StatementKind::AlterOwner)?;
6925                let new_owner = self
6926                    .parse_identifier()
6927                    .map_parser_err(StatementKind::AlterOwner)?;
6928
6929                Ok(Statement::AlterOwner(AlterOwnerStatement {
6930                    object_type,
6931                    if_exists,
6932                    name,
6933                    new_owner,
6934                }))
6935            }
6936            RENAME => {
6937                self.expect_keyword(TO)
6938                    .map_parser_err(StatementKind::AlterObjectRename)?;
6939                let to_item_name = self
6940                    .parse_identifier()
6941                    .map_parser_err(StatementKind::AlterObjectRename)?;
6942
6943                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6944                    object_type,
6945                    if_exists,
6946                    name,
6947                    to_item_name,
6948                }))
6949            }
6950            SWAP => {
6951                self.expect_keyword(WITH)
6952                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6953                let name_b = self
6954                    .parse_identifier()
6955                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6956
6957                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6958                    object_type,
6959                    if_exists,
6960                    name_a: name,
6961                    name_b,
6962                }))
6963            }
6964            k => unreachable!("programming error, unmatched {k}"),
6965        }
6966    }
6967
6968    /// Parses `CLUSTER name` fragments into a [`AlterSetClusterStatement`] if `CLUSTER` is found.
6969    fn maybe_parse_alter_set_cluster(
6970        &mut self,
6971        if_exists: bool,
6972        name: &UnresolvedItemName,
6973        object_type: ObjectType,
6974    ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6975        if self.parse_keyword(CLUSTER) {
6976            Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6977        } else {
6978            None
6979        }
6980    }
6981
6982    /// Parses `IN CLUSTER name` fragments into a [`AlterSetClusterStatement`].
6983    fn parse_alter_set_cluster(
6984        &mut self,
6985        if_exists: bool,
6986        name: UnresolvedItemName,
6987        object_type: ObjectType,
6988    ) -> Result<Statement<Raw>, ParserStatementError> {
6989        let set_cluster = self
6990            .parse_raw_ident()
6991            .map_parser_err(StatementKind::AlterSetCluster)?;
6992        Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6993            name,
6994            if_exists,
6995            set_cluster,
6996            object_type,
6997        }))
6998    }
6999
7000    /// Parse a copy statement
7001    fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
7002        // We support an optional "INTO" keyword for COPY INTO <table> FROM
7003        let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
7004            Some(self.peek_prev_pos())
7005        } else {
7006            None
7007        };
7008
7009        let relation = if self.consume_token(&Token::LParen) {
7010            let query = self.parse_statement()?.ast;
7011            self.expect_token(&Token::RParen)
7012                .map_parser_err(StatementKind::Copy)?;
7013            match query {
7014                Statement::Select(stmt) => CopyRelation::Select(stmt),
7015                Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
7016                _ => {
7017                    return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
7018                        .map_parser_err(StatementKind::Copy);
7019                }
7020            }
7021        } else {
7022            let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
7023            let columns = self
7024                .parse_parenthesized_column_list(Optional)
7025                .map_parser_err(StatementKind::Copy)?;
7026            CopyRelation::Named { name, columns }
7027        };
7028        let (direction, target) = match self
7029            .expect_one_of_keywords(&[FROM, TO])
7030            .map_parser_err(StatementKind::Copy)?
7031        {
7032            FROM => {
7033                if let CopyRelation::Named { .. } = relation {
7034                    // Ok.
7035                } else {
7036                    return parser_err!(
7037                        self,
7038                        self.peek_prev_pos(),
7039                        "queries not allowed in COPY FROM"
7040                    )
7041                    .map_no_statement_parser_err();
7042                }
7043                if self.parse_keyword(STDIN) {
7044                    (CopyDirection::From, CopyTarget::Stdin)
7045                } else {
7046                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
7047                    (CopyDirection::From, CopyTarget::Expr(url_expr))
7048                }
7049            }
7050            TO => {
7051                // We only support the INTO keyword for 'COPY FROM'.
7052                if let Some(into_pos) = maybe_into_pos {
7053                    return self
7054                        .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
7055                        .map_parser_err(StatementKind::Copy);
7056                }
7057
7058                if self.parse_keyword(STDOUT) {
7059                    (CopyDirection::To, CopyTarget::Stdout)
7060                } else {
7061                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
7062                    (CopyDirection::To, CopyTarget::Expr(url_expr))
7063                }
7064            }
7065            _ => unreachable!(),
7066        };
7067        // WITH must be followed by LParen. The WITH in COPY is optional for backward
7068        // compat with Postgres but is required elsewhere, which is why we don't use
7069        // parse_with_options here.
7070        let has_options = if self.parse_keyword(WITH) {
7071            self.expect_token(&Token::LParen)
7072                .map_parser_err(StatementKind::Copy)?;
7073            true
7074        } else {
7075            self.consume_token(&Token::LParen)
7076        };
7077        let options = if has_options {
7078            let o = self
7079                .parse_comma_separated(Parser::parse_copy_option)
7080                .map_parser_err(StatementKind::Copy)?;
7081            self.expect_token(&Token::RParen)
7082                .map_parser_err(StatementKind::Copy)?;
7083            o
7084        } else {
7085            vec![]
7086        };
7087        Ok(Statement::Copy(CopyStatement {
7088            relation,
7089            direction,
7090            target,
7091            options,
7092        }))
7093    }
7094
7095    fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
7096        let name = match self.expect_one_of_keywords(&[
7097            FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
7098        ])? {
7099            FORMAT => CopyOptionName::Format,
7100            DELIMITER => CopyOptionName::Delimiter,
7101            NULL => CopyOptionName::Null,
7102            ESCAPE => CopyOptionName::Escape,
7103            QUOTE => CopyOptionName::Quote,
7104            HEADER => CopyOptionName::Header,
7105            AWS => {
7106                self.expect_keyword(CONNECTION)?;
7107                return Ok(CopyOption {
7108                    name: CopyOptionName::AwsConnection,
7109                    value: Some(self.parse_object_option_value()?),
7110                });
7111            }
7112            MAX => {
7113                self.expect_keywords(&[FILE, SIZE])?;
7114                CopyOptionName::MaxFileSize
7115            }
7116            FILES => CopyOptionName::Files,
7117            PATTERN => CopyOptionName::Pattern,
7118            _ => unreachable!(),
7119        };
7120        Ok(CopyOption {
7121            name,
7122            value: self.parse_optional_option_value()?,
7123        })
7124    }
7125
7126    /// Parse a literal value (numbers, strings, date/time, booleans)
7127    fn parse_value(&mut self) -> Result<Value, ParserError> {
7128        match self.next_token() {
7129            Some(t) => match t {
7130                Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
7131                Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
7132                Token::Keyword(NULL) => Ok(Value::Null),
7133                Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
7134                Token::Keyword(kw) => {
7135                    parser_err!(
7136                        self,
7137                        self.peek_prev_pos(),
7138                        format!("No value parser for keyword {}", kw)
7139                    )
7140                }
7141                Token::Op(ref op) if op == "-" => match self.next_token() {
7142                    Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
7143                    other => self.expected(self.peek_prev_pos(), "literal int", other),
7144                },
7145                Token::Number(ref n) => Ok(Value::Number(n.to_string())),
7146                Token::String(ref s) => Ok(Value::String(s.to_string())),
7147                Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
7148                _ => parser_err!(
7149                    self,
7150                    self.peek_prev_pos(),
7151                    format!("Unsupported value: {:?}", t)
7152                ),
7153            },
7154            None => parser_err!(
7155                self,
7156                self.peek_prev_pos(),
7157                "Expecting a value, but found EOF"
7158            ),
7159        }
7160    }
7161
7162    fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
7163        if self.consume_token(&Token::LParen) {
7164            let subquery = self.parse_query()?;
7165            self.expect_token(&Token::RParen)?;
7166            Ok(Expr::ArraySubquery(Box::new(subquery)))
7167        } else {
7168            self.parse_sequence(Self::parse_array).map(Expr::Array)
7169        }
7170    }
7171
7172    fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
7173        if self.consume_token(&Token::LParen) {
7174            let subquery = self.parse_query()?;
7175            self.expect_token(&Token::RParen)?;
7176            Ok(Expr::ListSubquery(Box::new(subquery)))
7177        } else {
7178            self.parse_sequence(Self::parse_list).map(Expr::List)
7179        }
7180    }
7181
7182    fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
7183        if self.consume_token(&Token::LParen) {
7184            let subquery = self.parse_query()?;
7185            self.expect_token(&Token::RParen)?;
7186            return Ok(Expr::MapSubquery(Box::new(subquery)));
7187        }
7188
7189        self.expect_token(&Token::LBracket)?;
7190        let mut exprs = vec![];
7191        loop {
7192            if let Some(Token::RBracket) = self.peek_token() {
7193                break;
7194            }
7195            let key = self.parse_expr()?;
7196            self.expect_token(&Token::Arrow)?;
7197            let value = if let Some(Token::LBracket) = self.peek_token() {
7198                self.parse_map()?
7199            } else {
7200                self.parse_expr()?
7201            };
7202            exprs.push(MapEntry { key, value });
7203            if !self.consume_token(&Token::Comma) {
7204                break;
7205            }
7206        }
7207        self.expect_token(&Token::RBracket)?;
7208        Ok(Expr::Map(exprs))
7209    }
7210
7211    fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
7212    where
7213        F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
7214    {
7215        self.expect_token(&Token::LBracket)?;
7216        let mut exprs = vec![];
7217        loop {
7218            if let Some(Token::RBracket) = self.peek_token() {
7219                break;
7220            }
7221            let expr = if let Some(Token::LBracket) = self.peek_token() {
7222                f(self)?
7223            } else {
7224                self.parse_expr()?
7225            };
7226            exprs.push(expr);
7227            if !self.consume_token(&Token::Comma) {
7228                break;
7229            }
7230        }
7231        self.expect_token(&Token::RBracket)?;
7232        Ok(exprs)
7233    }
7234
7235    fn parse_number_value(&mut self) -> Result<Value, ParserError> {
7236        match self.parse_value()? {
7237            v @ Value::Number(_) => Ok(v),
7238            _ => {
7239                self.prev_token();
7240                self.expected(self.peek_pos(), "literal number", self.peek_token())
7241            }
7242        }
7243    }
7244
7245    fn parse_version(&mut self) -> Result<Version, ParserError> {
7246        let version = self.parse_literal_uint()?;
7247        Ok(Version(version))
7248    }
7249
7250    /// Parse a signed literal integer.
7251    fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
7252        let negative = self.consume_token(&Token::Op("-".into()));
7253        match self.next_token() {
7254            Some(Token::Number(s)) => {
7255                let n = s.parse::<i64>().map_err(|e| {
7256                    self.error(
7257                        self.peek_prev_pos(),
7258                        format!("Could not parse '{}' as i64: {}", s, e),
7259                    )
7260                })?;
7261                if negative {
7262                    n.checked_neg().ok_or_else(|| {
7263                        self.error(
7264                            self.peek_prev_pos(),
7265                            format!("Could not parse '{}' as i64: overflows i64", s),
7266                        )
7267                    })
7268                } else {
7269                    Ok(n)
7270                }
7271            }
7272            other => self.expected(self.peek_prev_pos(), "literal integer", other),
7273        }
7274    }
7275
7276    /// Parse an unsigned literal integer.
7277    fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7278        match self.next_token() {
7279            Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7280                self.error(
7281                    self.peek_prev_pos(),
7282                    format!("Could not parse '{}' as u64: {}", s, e),
7283                )
7284            }),
7285            other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7286        }
7287    }
7288
7289    /// Parse a literal string
7290    fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7291        match self.next_token() {
7292            Some(Token::String(ref s)) => Ok(s.clone()),
7293            other => self.expected(self.peek_prev_pos(), "literal string", other),
7294        }
7295    }
7296
7297    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
7298    fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7299        let other = |ident| RawDataType::Other {
7300            name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7301            typ_mod: vec![],
7302        };
7303
7304        let mut data_type = match self.next_token() {
7305            Some(Token::Keyword(kw)) => match kw {
7306                // Text-like types
7307                CHAR | CHARACTER => {
7308                    let name = if self.parse_keyword(VARYING) {
7309                        ident!("varchar")
7310                    } else {
7311                        ident!("bpchar")
7312                    };
7313                    RawDataType::Other {
7314                        name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7315                        typ_mod: self.parse_typ_mod()?,
7316                    }
7317                }
7318                BPCHAR => RawDataType::Other {
7319                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7320                    typ_mod: self.parse_typ_mod()?,
7321                },
7322                VARCHAR => RawDataType::Other {
7323                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7324                    typ_mod: self.parse_typ_mod()?,
7325                },
7326                STRING => other(ident!("text")),
7327
7328                // Number-like types
7329                BIGINT => other(ident!("int8")),
7330                SMALLINT => other(ident!("int2")),
7331                DEC | DECIMAL => RawDataType::Other {
7332                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7333                    typ_mod: self.parse_typ_mod()?,
7334                },
7335                DOUBLE => {
7336                    let _ = self.parse_keyword(PRECISION);
7337                    other(ident!("float8"))
7338                }
7339                FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7340                    v if v == 0 || v > 53 => {
7341                        return Err(self.error(
7342                            self.peek_prev_pos(),
7343                            "precision for type float must be within ([1-53])".into(),
7344                        ));
7345                    }
7346                    v if v < 25 => other(ident!("float4")),
7347                    _ => other(ident!("float8")),
7348                },
7349                INT | INTEGER => other(ident!("int4")),
7350                REAL => other(ident!("float4")),
7351
7352                // Time-like types
7353                // Take `WITH` only as part of `WITH TIME ZONE`. A cast can be followed by a
7354                // clause's `WITH`, e.g.  `COPY t FROM '...'::timestamp WITH (FORMAT CSV)`.
7355                TIME => {
7356                    if self.parse_keywords(&[WITH, TIME, ZONE]) {
7357                        other(ident!("timetz"))
7358                    } else {
7359                        if self.parse_keyword(WITHOUT) {
7360                            self.expect_keywords(&[TIME, ZONE])?;
7361                        }
7362                        other(ident!("time"))
7363                    }
7364                }
7365                TIMESTAMP => {
7366                    let typ_mod = self.parse_timestamp_precision()?;
7367                    if self.parse_keywords(&[WITH, TIME, ZONE]) {
7368                        RawDataType::Other {
7369                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7370                                "timestamptz"
7371                            ))),
7372                            typ_mod,
7373                        }
7374                    } else {
7375                        if self.parse_keyword(WITHOUT) {
7376                            self.expect_keywords(&[TIME, ZONE])?;
7377                        }
7378                        RawDataType::Other {
7379                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7380                                "timestamp"
7381                            ))),
7382                            typ_mod,
7383                        }
7384                    }
7385                }
7386                TIMESTAMPTZ => {
7387                    let typ_mod = self.parse_timestamp_precision()?;
7388                    RawDataType::Other {
7389                        name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7390                            "timestamptz"
7391                        ))),
7392                        typ_mod,
7393                    }
7394                }
7395
7396                // MZ "proprietary" types
7397                MAP => {
7398                    return self.parse_map_type();
7399                }
7400
7401                // Misc.
7402                BOOLEAN => other(ident!("bool")),
7403                BYTES => other(ident!("bytea")),
7404                JSON => other(ident!("jsonb")),
7405
7406                // We do not want any reserved keywords to be parsed as data type names,
7407                // eg "CASE 'foo' WHEN ... END" should not parse as "CAST 'foo' AS CASE"
7408                kw if kw.is_sometimes_reserved() => {
7409                    return self.expected(
7410                        self.peek_prev_pos(),
7411                        "a data type name",
7412                        Some(Token::Keyword(kw)),
7413                    );
7414                }
7415                _ => {
7416                    self.prev_token();
7417                    RawDataType::Other {
7418                        name: RawItemName::Name(self.parse_item_name()?),
7419                        typ_mod: self.parse_typ_mod()?,
7420                    }
7421                }
7422            },
7423            Some(Token::Ident(_) | Token::LBracket) => {
7424                self.prev_token();
7425                RawDataType::Other {
7426                    name: self.parse_raw_name()?,
7427                    typ_mod: self.parse_typ_mod()?,
7428                }
7429            }
7430            other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7431        };
7432
7433        loop {
7434            match self.peek_token() {
7435                Some(Token::Keyword(LIST)) => {
7436                    self.next_token();
7437                    data_type = RawDataType::List(Box::new(data_type));
7438                }
7439                Some(Token::LBracket) => {
7440                    // Handle array suffixes. Note that `int[]`, `int[][][]`,
7441                    // and `int[2][2]` all parse to the same "int array" type.
7442                    self.next_token();
7443                    let _ = self.maybe_parse(|parser| parser.parse_number_value());
7444                    self.expect_token(&Token::RBracket)?;
7445                    if !matches!(data_type, RawDataType::Array(_)) {
7446                        data_type = RawDataType::Array(Box::new(data_type));
7447                    }
7448                }
7449                _ => break,
7450            }
7451        }
7452        Ok(data_type)
7453    }
7454
7455    fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7456        if self.consume_token(&Token::LParen) {
7457            let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7458            self.expect_token(&Token::RParen)?;
7459            Ok(typ_mod)
7460        } else {
7461            Ok(vec![])
7462        }
7463    }
7464
7465    // parses the precision in timestamp(<precision>) and timestamptz(<precision>)
7466    fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7467        if self.consume_token(&Token::LParen) {
7468            let typ_mod = self.parse_literal_int()?;
7469            self.expect_token(&Token::RParen)?;
7470            Ok(vec![typ_mod])
7471        } else {
7472            Ok(vec![])
7473        }
7474    }
7475
7476    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
7477    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
7478    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
7479    fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7480    where
7481        F: FnOnce(Keyword) -> bool,
7482    {
7483        let after_as = self.parse_keyword(AS);
7484        match self.next_token() {
7485            // Do not accept `AS OF`, which is reserved for providing timestamp information
7486            // to queries.
7487            Some(Token::Keyword(OF)) => {
7488                self.prev_token();
7489                if after_as {
7490                    self.prev_token();
7491                }
7492                Ok(None)
7493            }
7494            // Accept any other identifier after `AS` (though many dialects have restrictions on
7495            // keywords that may appear here). If there's no `AS`: don't parse keywords,
7496            // which may start a construct allowed in this position, to be parsed as aliases.
7497            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
7498            // not an alias.)
7499            Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7500            Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7501            not_an_ident => {
7502                if after_as {
7503                    return self.expected(
7504                        self.peek_prev_pos(),
7505                        "an identifier after AS",
7506                        not_an_ident,
7507                    );
7508                }
7509                self.prev_token();
7510                Ok(None) // no alias found
7511            }
7512        }
7513    }
7514
7515    /// Parse `AS identifier` when the AS is describing a table-valued object,
7516    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
7517    /// the alias is allowed to optionally name the columns in the table, in
7518    /// addition to the table itself.
7519    fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7520        match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7521            Some(name) => {
7522                let columns = self.parse_parenthesized_column_list(Optional)?;
7523                Ok(Some(TableAlias {
7524                    name,
7525                    columns,
7526                    strict: false,
7527                }))
7528            }
7529            None => Ok(None),
7530        }
7531    }
7532
7533    fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7534        Ok(match self.parse_raw_name()? {
7535            named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7536            RawItemName::Name(name) => DeferredItemName::Deferred(name),
7537        })
7538    }
7539
7540    fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7541        if self.consume_token(&Token::LBracket) {
7542            let id = self.parse_raw_ident_str()?;
7543            self.expect_keyword(AS)?;
7544            let name = self.parse_item_name()?;
7545            // TODO(justin): is there a more idiomatic way to detect a fully-qualified name?
7546            if name.0.len() < 2 {
7547                return parser_err!(
7548                    self,
7549                    self.peek_prev_pos(),
7550                    "table name in square brackets must be fully qualified"
7551                );
7552            }
7553
7554            let version = if self.parse_keywords(&[VERSION]) {
7555                let version = self.parse_version()?;
7556                Some(version)
7557            } else {
7558                None
7559            };
7560
7561            self.expect_token(&Token::RBracket)?;
7562            Ok(RawItemName::Id(id, name, version))
7563        } else {
7564            Ok(RawItemName::Name(self.parse_item_name()?))
7565        }
7566    }
7567
7568    fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7569        let start = self.peek_pos();
7570        let mut item_name = self.parse_raw_name()?;
7571        let column_name = match &mut item_name {
7572            RawItemName::Name(UnresolvedItemName(identifiers)) => {
7573                if identifiers.len() < 2 {
7574                    return Err(ParserError::new(
7575                        start,
7576                        "need to specify an object and a column",
7577                    ));
7578                }
7579                identifiers.pop().unwrap()
7580            }
7581            RawItemName::Id(_, _, _) => {
7582                self.expect_token(&Token::Dot)?;
7583                self.parse_identifier()?
7584            }
7585        };
7586
7587        Ok(ColumnName {
7588            relation: item_name,
7589            column: column_name,
7590        })
7591    }
7592
7593    /// Parse a possibly quoted database identifier, e.g.
7594    /// `foo` or `"mydatabase"`
7595    fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7596        Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7597    }
7598
7599    /// Parse a possibly qualified, possibly quoted schema identifier, e.g.
7600    /// `foo` or `mydatabase."schema"`
7601    fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7602        Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7603    }
7604
7605    /// Parse a possibly qualified, possibly quoted object identifier, e.g.
7606    /// `foo` or `myschema."table"`
7607    fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7608        Ok(UnresolvedItemName(self.parse_identifiers()?))
7609    }
7610
7611    /// Parse an object name.
7612    fn parse_object_name(
7613        &mut self,
7614        object_type: ObjectType,
7615    ) -> Result<UnresolvedObjectName, ParserError> {
7616        Ok(match object_type {
7617            ObjectType::Table
7618            | ObjectType::View
7619            | ObjectType::MaterializedView
7620            | ObjectType::Source
7621            | ObjectType::Subsource
7622            | ObjectType::Sink
7623            | ObjectType::MetricSink
7624            | ObjectType::Index
7625            | ObjectType::Type
7626            | ObjectType::Secret
7627            | ObjectType::Connection
7628            | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7629            ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7630            ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7631            ObjectType::ClusterReplica => {
7632                UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7633            }
7634            ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7635            ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7636            ObjectType::NetworkPolicy => {
7637                UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7638            }
7639        })
7640    }
7641
7642    ///Parse one or more simple one-word identifiers separated by a '.'
7643    fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7644        let mut idents = vec![];
7645        loop {
7646            idents.push(self.parse_identifier()?);
7647            if !self.consume_token(&Token::Dot) {
7648                break;
7649            }
7650        }
7651        Ok(idents)
7652    }
7653
7654    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
7655    fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7656        match self.consume_identifier()? {
7657            Some(id) => {
7658                if id.as_str().is_empty() {
7659                    return parser_err!(
7660                        self,
7661                        self.peek_prev_pos(),
7662                        "zero-length delimited identifier",
7663                    );
7664                }
7665                Ok(id)
7666            }
7667            None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7668        }
7669    }
7670
7671    fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7672        match self.peek_token() {
7673            Some(Token::Keyword(kw)) => {
7674                self.next_token();
7675                Ok(Some(kw.into()))
7676            }
7677            Some(Token::Ident(id)) => {
7678                self.next_token();
7679                Ok(Some(self.new_identifier(id)?))
7680            }
7681            _ => Ok(None),
7682        }
7683    }
7684
7685    fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7686        let mut id_parts = vec![id];
7687        match self.peek_token() {
7688            Some(Token::LParen) | Some(Token::Dot) => {
7689                let mut ends_with_wildcard = false;
7690                while self.consume_token(&Token::Dot) {
7691                    match self.next_token() {
7692                        Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7693                        Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7694                        Some(Token::Star) => {
7695                            ends_with_wildcard = true;
7696                            break;
7697                        }
7698                        unexpected => {
7699                            return self.expected(
7700                                self.peek_prev_pos(),
7701                                "an identifier or a '*' after '.'",
7702                                unexpected,
7703                            );
7704                        }
7705                    }
7706                }
7707                if ends_with_wildcard {
7708                    Ok(Expr::QualifiedWildcard(id_parts))
7709                } else if self.peek_token() == Some(Token::LParen) {
7710                    let function =
7711                        self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7712                    Ok(Expr::Function(function))
7713                } else {
7714                    Ok(Expr::Identifier(id_parts))
7715                }
7716            }
7717            _ => Ok(Expr::Identifier(id_parts)),
7718        }
7719    }
7720
7721    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
7722    fn parse_parenthesized_column_list(
7723        &mut self,
7724        optional: IsOptional,
7725    ) -> Result<Vec<Ident>, ParserError> {
7726        if self.consume_token(&Token::LParen) {
7727            let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7728            self.expect_token(&Token::RParen)?;
7729            Ok(cols)
7730        } else if optional == Optional {
7731            Ok(vec![])
7732        } else {
7733            self.expected(
7734                self.peek_pos(),
7735                "a list of columns in parentheses",
7736                self.peek_token(),
7737            )
7738        }
7739    }
7740
7741    fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7742        if self.consume_token(&Token::LParen) {
7743            let n = self.parse_literal_uint()?;
7744            self.expect_token(&Token::RParen)?;
7745            Ok(Some(n))
7746        } else {
7747            Ok(None)
7748        }
7749    }
7750
7751    fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7752        self.expect_token(&Token::LBracket)?;
7753        let key_type = Box::new(self.parse_data_type()?);
7754        self.expect_token(&Token::Arrow)?;
7755        let value_type = Box::new(self.parse_data_type()?);
7756        self.expect_token(&Token::RBracket)?;
7757        Ok(RawDataType::Map {
7758            key_type,
7759            value_type,
7760        })
7761    }
7762
7763    fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7764        self.expect_keyword(FROM)?;
7765        let table_name = RawItemName::Name(self.parse_item_name()?);
7766        let alias = self.parse_optional_table_alias()?;
7767        let using = if self.parse_keyword(USING) {
7768            self.parse_comma_separated(Parser::parse_table_and_joins)?
7769        } else {
7770            vec![]
7771        };
7772        let selection = if self.parse_keyword(WHERE) {
7773            Some(self.parse_expr()?)
7774        } else {
7775            None
7776        };
7777
7778        Ok(Statement::Delete(DeleteStatement {
7779            table_name,
7780            alias,
7781            using,
7782            selection,
7783        }))
7784    }
7785
7786    /// Parses a SELECT (or WITH, VALUES, TABLE) statement with optional AS OF.
7787    fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7788        Ok(SelectStatement {
7789            query: self.parse_query()?,
7790            as_of: self.parse_optional_as_of()?,
7791        })
7792    }
7793
7794    /// Parse a query expression, i.e. a `SELECT` statement optionally
7795    /// preceded with some `WITH` CTE declarations and optionally followed
7796    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
7797    /// expect the initial keyword to be already consumed
7798    fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7799        self.checked_recur_mut(|parser| {
7800            let cte_block = if parser.parse_keyword(WITH) {
7801                if parser.parse_keyword(MUTUALLY) {
7802                    parser.expect_keyword(RECURSIVE)?;
7803                    let options = if parser.consume_token(&Token::LParen) {
7804                        let options =
7805                            parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7806                        parser.expect_token(&Token::RParen)?;
7807                        options
7808                    } else {
7809                        vec![]
7810                    };
7811                    CteBlock::MutuallyRecursive(MutRecBlock {
7812                        options,
7813                        ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7814                    })
7815                } else {
7816                    // TODO: optional RECURSIVE
7817                    CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7818                }
7819            } else {
7820                CteBlock::empty()
7821            };
7822
7823            let body = parser.parse_query_body(SetPrecedence::Zero)?;
7824
7825            parser.parse_query_tail(cte_block, body)
7826        })
7827    }
7828
7829    fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7830        match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7831            RECURSION => {
7832                self.expect_keyword(LIMIT)?;
7833                Ok(MutRecBlockOption {
7834                    name: MutRecBlockOptionName::RecursionLimit,
7835                    value: self.parse_optional_option_value()?,
7836                })
7837            }
7838            RETURN => {
7839                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7840                Ok(MutRecBlockOption {
7841                    name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7842                    value: self.parse_optional_option_value()?,
7843                })
7844            }
7845            ERROR => {
7846                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7847                Ok(MutRecBlockOption {
7848                    name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7849                    value: self.parse_optional_option_value()?,
7850                })
7851            }
7852            _ => unreachable!(),
7853        }
7854    }
7855
7856    fn parse_query_tail(
7857        &mut self,
7858        ctes: CteBlock<Raw>,
7859        body: SetExpr<Raw>,
7860    ) -> Result<Query<Raw>, ParserError> {
7861        let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7862            SetExpr::Query(query) => {
7863                let Query {
7864                    ctes,
7865                    body,
7866                    order_by,
7867                    limit,
7868                    offset,
7869                } = *query;
7870                (ctes, order_by, limit, offset, body)
7871            }
7872            _ => (CteBlock::empty(), vec![], None, None, body),
7873        };
7874
7875        let ctes = if ctes.is_empty() {
7876            inner_ctes
7877        } else if !inner_ctes.is_empty() {
7878            return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7879        } else {
7880            ctes
7881        };
7882
7883        let order_by = if self.parse_keywords(&[ORDER, BY]) {
7884            if !inner_order_by.is_empty() {
7885                return parser_err!(
7886                    self,
7887                    self.peek_prev_pos(),
7888                    "multiple ORDER BY clauses not allowed"
7889                );
7890            }
7891            self.parse_comma_separated(Parser::parse_order_by_expr)?
7892        } else {
7893            inner_order_by
7894        };
7895
7896        // Parse LIMIT, FETCH, OFFSET in any order, but:
7897        // - Only at most one of LIMIT or FETCH is allowed.
7898        // - Only at most one occurrence is allowed from each of these.
7899        let mut limit = inner_limit;
7900        let mut offset = inner_offset;
7901        while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7902            match parsed_keyword {
7903                LIMIT => {
7904                    if limit.is_some() {
7905                        return parser_err!(
7906                            self,
7907                            self.peek_prev_pos(),
7908                            "multiple LIMIT/FETCH clauses not allowed"
7909                        );
7910                    }
7911                    limit = if self.parse_keyword(ALL) {
7912                        None
7913                    } else {
7914                        Some(Limit {
7915                            with_ties: false,
7916                            quantity: self.parse_expr()?,
7917                        })
7918                    };
7919                }
7920                OFFSET => {
7921                    if offset.is_some() {
7922                        return parser_err!(
7923                            self,
7924                            self.peek_prev_pos(),
7925                            "multiple OFFSET clauses not allowed"
7926                        );
7927                    }
7928                    let value = self.parse_expr()?;
7929                    let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7930                    offset = Some(value);
7931                }
7932                FETCH => {
7933                    if limit.is_some() {
7934                        return parser_err!(
7935                            self,
7936                            self.peek_prev_pos(),
7937                            "multiple LIMIT/FETCH clauses not allowed"
7938                        );
7939                    }
7940                    self.expect_one_of_keywords(&[FIRST, NEXT])?;
7941                    let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7942                        Expr::Value(Value::Number('1'.into()))
7943                    } else {
7944                        let quantity = self.parse_expr()?;
7945                        self.expect_one_of_keywords(&[ROW, ROWS])?;
7946                        quantity
7947                    };
7948                    let with_ties = if self.parse_keyword(ONLY) {
7949                        false
7950                    } else if self.parse_keywords(&[WITH, TIES]) {
7951                        true
7952                    } else {
7953                        return self.expected(
7954                            self.peek_pos(),
7955                            "one of ONLY or WITH TIES",
7956                            self.peek_token(),
7957                        );
7958                    };
7959                    limit = Some(Limit {
7960                        with_ties,
7961                        quantity,
7962                    });
7963                }
7964                _ => unreachable!(),
7965            }
7966        }
7967
7968        Ok(Query {
7969            ctes,
7970            body,
7971            order_by,
7972            limit,
7973            offset,
7974        })
7975    }
7976
7977    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
7978    fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7979        let alias = TableAlias {
7980            name: self.parse_identifier()?,
7981            columns: self.parse_parenthesized_column_list(Optional)?,
7982            strict: false,
7983        };
7984        self.expect_keyword(AS)?;
7985        self.expect_token(&Token::LParen)?;
7986        let query = self.parse_query()?;
7987        self.expect_token(&Token::RParen)?;
7988        Ok(Cte {
7989            alias,
7990            query,
7991            id: (),
7992        })
7993    }
7994
7995    /// Parse a mutually recursive CTE (`alias ( col1: typ1, col2: typ2, ... ) AS (subquery)`).
7996    ///
7997    /// The main distinction from `parse_cte` is that the column names and types are mandatory.
7998    /// This is not how SQL works for `WITH RECURSIVE`, but we are doing it for now to make the
7999    /// query interpretation that much easier.
8000    fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
8001        let name = self.parse_identifier()?;
8002        self.expect_token(&Token::LParen)?;
8003        let columns = self.parse_comma_separated(|parser| {
8004            Ok(CteMutRecColumnDef {
8005                name: parser.parse_identifier()?,
8006                data_type: parser.parse_data_type()?,
8007            })
8008        })?;
8009        self.expect_token(&Token::RParen)?;
8010        self.expect_keyword(AS)?;
8011        self.expect_token(&Token::LParen)?;
8012        let query = self.parse_query()?;
8013        self.expect_token(&Token::RParen)?;
8014        Ok(CteMutRec {
8015            name,
8016            columns,
8017            query,
8018            id: (),
8019        })
8020    }
8021
8022    /// Parse a "query body", which is an expression with roughly the
8023    /// following grammar:
8024    /// ```text
8025    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
8026    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
8027    ///   subquery ::= query_body [ order_by_limit ]
8028    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
8029    /// ```
8030    fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
8031        // We parse the expression using a Pratt parser, as in `parse_expr()`.
8032        // Start by parsing a restricted SELECT or a `(subquery)`:
8033        let expr = if self.parse_keyword(SELECT) {
8034            SetExpr::Select(Box::new(self.parse_select()?))
8035        } else if self.consume_token(&Token::LParen) {
8036            // CTEs are not allowed here, but the parser currently accepts them
8037            let subquery = self.parse_query()?;
8038            self.expect_token(&Token::RParen)?;
8039            SetExpr::Query(Box::new(subquery))
8040        } else if self.parse_keyword(VALUES) {
8041            SetExpr::Values(self.parse_values()?)
8042        } else if self.parse_keyword(SHOW) {
8043            SetExpr::Show(self.parse_show()?)
8044        } else if self.parse_keyword(TABLE) {
8045            SetExpr::Table(self.parse_raw_name()?)
8046        } else {
8047            return self.expected(
8048                self.peek_pos(),
8049                "SELECT, VALUES, or a subquery in the query body",
8050                self.peek_token(),
8051            );
8052        };
8053
8054        self.parse_query_body_seeded(precedence, expr)
8055    }
8056
8057    fn parse_query_body_seeded(
8058        &mut self,
8059        precedence: SetPrecedence,
8060        mut expr: SetExpr<Raw>,
8061    ) -> Result<SetExpr<Raw>, ParserError> {
8062        loop {
8063            // The query can be optionally followed by a set operator:
8064            let next_token = self.peek_token();
8065            let op = self.parse_set_operator(&next_token);
8066            let next_precedence = match op {
8067                // UNION and EXCEPT have the same precedence and evaluate left-to-right
8068                Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
8069                // INTERSECT has higher precedence than UNION/EXCEPT
8070                Some(SetOperator::Intersect) => SetPrecedence::Intersect,
8071                // Unexpected token or EOF => stop parsing the query body
8072                None => break,
8073            };
8074            if precedence >= next_precedence {
8075                break;
8076            }
8077            self.next_token(); // skip past the set operator
8078
8079            let all = self.parse_keyword(ALL);
8080            let distinct = self.parse_keyword(DISTINCT);
8081            if all && distinct {
8082                return parser_err!(
8083                    self,
8084                    self.peek_prev_pos(),
8085                    "Cannot specify both ALL and DISTINCT in set operation"
8086                );
8087            }
8088            expr = SetExpr::SetOperation {
8089                left: Box::new(expr),
8090                op: op.unwrap(),
8091                all,
8092                right: Box::new(self.parse_query_body(next_precedence)?),
8093            };
8094        }
8095
8096        Ok(expr)
8097    }
8098
8099    fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
8100        match token {
8101            Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
8102            Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
8103            Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
8104            _ => None,
8105        }
8106    }
8107
8108    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
8109    /// assuming the initial `SELECT` was already consumed
8110    fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
8111        let all = self.parse_keyword(ALL);
8112        let distinct = self.parse_keyword(DISTINCT);
8113        if all && distinct {
8114            return parser_err!(
8115                self,
8116                self.peek_prev_pos(),
8117                "Cannot specify both ALL and DISTINCT in SELECT"
8118            );
8119        }
8120        let distinct = if distinct && self.parse_keyword(ON) {
8121            self.expect_token(&Token::LParen)?;
8122            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
8123            self.expect_token(&Token::RParen)?;
8124            Some(Distinct::On(exprs))
8125        } else if distinct {
8126            Some(Distinct::EntireRow)
8127        } else {
8128            None
8129        };
8130
8131        let projection = match self.peek_token() {
8132            // An empty target list is permissible to match PostgreSQL, which
8133            // permits these for symmetry with zero column tables. We need
8134            // to sniff out `AS` here specially to support `SELECT AS OF ...`.
8135            Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
8136            Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
8137            _ => {
8138                let mut projection = vec![];
8139                loop {
8140                    projection.push(self.parse_select_item()?);
8141                    if !self.consume_token(&Token::Comma) {
8142                        break;
8143                    }
8144                    if self.peek_keyword(FROM) {
8145                        return parser_err!(
8146                            self,
8147                            self.peek_prev_pos(),
8148                            "invalid trailing comma in SELECT list",
8149                        );
8150                    }
8151                }
8152                projection
8153            }
8154        };
8155
8156        // Note that for keywords to be properly handled here, they need to be
8157        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
8158        // otherwise they may be parsed as an alias as part of the `projection`
8159        // or `from`.
8160
8161        let from = if self.parse_keyword(FROM) {
8162            self.parse_comma_separated(Parser::parse_table_and_joins)?
8163        } else {
8164            vec![]
8165        };
8166
8167        let selection = if self.parse_keyword(WHERE) {
8168            Some(self.parse_expr()?)
8169        } else {
8170            None
8171        };
8172
8173        let group_by = if self.parse_keywords(&[GROUP, BY]) {
8174            self.parse_comma_separated(Parser::parse_expr)?
8175        } else {
8176            vec![]
8177        };
8178
8179        let having = if self.parse_keyword(HAVING) {
8180            Some(self.parse_expr()?)
8181        } else {
8182            None
8183        };
8184
8185        let qualify = if self.parse_keyword(QUALIFY) {
8186            Some(self.parse_expr()?)
8187        } else {
8188            None
8189        };
8190
8191        let options = if self.parse_keyword(OPTIONS) {
8192            self.expect_token(&Token::LParen)?;
8193            let options = self.parse_comma_separated(Self::parse_select_option)?;
8194            self.expect_token(&Token::RParen)?;
8195            options
8196        } else {
8197            vec![]
8198        };
8199
8200        Ok(Select {
8201            distinct,
8202            projection,
8203            from,
8204            selection,
8205            group_by,
8206            having,
8207            qualify,
8208            options,
8209        })
8210    }
8211
8212    fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
8213        let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
8214            EXPECTED => {
8215                self.expect_keywords(&[GROUP, SIZE])?;
8216                SelectOptionName::ExpectedGroupSize
8217            }
8218            AGGREGATE => {
8219                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8220                SelectOptionName::AggregateInputGroupSize
8221            }
8222            DISTINCT => {
8223                self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
8224                SelectOptionName::DistinctOnInputGroupSize
8225            }
8226            LIMIT => {
8227                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8228                SelectOptionName::LimitInputGroupSize
8229            }
8230            _ => unreachable!(),
8231        };
8232        Ok(SelectOption {
8233            name,
8234            value: self.parse_optional_option_value()?,
8235        })
8236    }
8237
8238    fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8239        let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
8240        let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
8241        let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8242        if !normal {
8243            match variable.as_str().parse() {
8244                Ok(TIME) => {
8245                    self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8246                    variable = ident!("timezone");
8247                    normal = true;
8248                }
8249                Ok(NAMES) => {
8250                    variable = ident!("client_encoding");
8251                    normal = true;
8252                }
8253                _ => {}
8254            }
8255        }
8256        if variable.as_str().parse() == Ok(SCHEMA) {
8257            variable = ident!("search_path");
8258            let to = self
8259                .parse_set_schema_to()
8260                .map_parser_err(StatementKind::SetVariable)?;
8261            Ok(Statement::SetVariable(SetVariableStatement {
8262                local: modifier == Some(LOCAL),
8263                variable,
8264                to,
8265            }))
8266        } else if normal {
8267            let to = self
8268                .parse_set_variable_to()
8269                .map_parser_err(StatementKind::SetVariable)?;
8270            Ok(Statement::SetVariable(SetVariableStatement {
8271                local: modifier == Some(LOCAL),
8272                variable,
8273                to,
8274            }))
8275        } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8276            // SET TRANSACTION transaction_mode
8277            Ok(Statement::SetTransaction(SetTransactionStatement {
8278                local: true,
8279                modes: self
8280                    .parse_transaction_modes(true)
8281                    .map_parser_err(StatementKind::SetTransaction)?,
8282            }))
8283        } else if modifier == Some(SESSION)
8284            && variable.as_str().parse() == Ok(CHARACTERISTICS)
8285            && self.parse_keywords(&[AS, TRANSACTION])
8286        {
8287            // SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
8288            Ok(Statement::SetTransaction(SetTransactionStatement {
8289                local: false,
8290                modes: self
8291                    .parse_transaction_modes(true)
8292                    .map_parser_err(StatementKind::SetTransaction)?,
8293            }))
8294        } else {
8295            self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8296                .map_no_statement_parser_err()
8297        }
8298    }
8299
8300    fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8301        if self.parse_keyword(DEFAULT) {
8302            Ok(SetVariableTo::Default)
8303        } else {
8304            let to = self.parse_set_variable_value()?;
8305            Ok(SetVariableTo::Values(vec![to]))
8306        }
8307    }
8308
8309    fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8310        if self.parse_keyword(DEFAULT) {
8311            Ok(SetVariableTo::Default)
8312        } else {
8313            Ok(SetVariableTo::Values(
8314                self.parse_comma_separated(Parser::parse_set_variable_value)?,
8315            ))
8316        }
8317    }
8318
8319    fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8320        if let Some(value) = self.maybe_parse(Parser::parse_value) {
8321            Ok(SetVariableValue::Literal(value))
8322        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8323            Ok(SetVariableValue::Ident(ident))
8324        } else {
8325            self.expected(self.peek_pos(), "variable value", self.peek_token())
8326        }
8327    }
8328
8329    fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8330        let mut variable = self.parse_identifier()?;
8331        if variable.as_str().parse() == Ok(SCHEMA) {
8332            variable = ident!("search_path");
8333        }
8334        Ok(Statement::ResetVariable(ResetVariableStatement {
8335            variable,
8336        }))
8337    }
8338
8339    fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8340        let redacted = self.parse_keyword(REDACTED);
8341        if redacted && !self.peek_keyword(CREATE) {
8342            return parser_err!(
8343                self,
8344                self.peek_pos(),
8345                "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8346            );
8347        }
8348        if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8349            self.parse_show_columns()
8350        } else if self.parse_keyword(OBJECTS) {
8351            let from = if self.parse_keywords(&[FROM]) {
8352                Some(self.parse_schema_name()?)
8353            } else {
8354                None
8355            };
8356            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8357                object_type: ShowObjectType::Object,
8358                from,
8359                filter: self.parse_show_statement_filter()?,
8360            }))
8361        } else if let Some(object_type) = self.parse_plural_object_type() {
8362            let from = if object_type.lives_in_schema() {
8363                if self.parse_keywords(&[FROM]) {
8364                    Some(self.parse_schema_name()?)
8365                } else {
8366                    None
8367                }
8368            } else {
8369                None
8370            };
8371
8372            let show_object_type = match object_type {
8373                ObjectType::Database => ShowObjectType::Database,
8374                ObjectType::Schema => {
8375                    let from = if self.parse_keyword(FROM) {
8376                        Some(self.parse_database_name()?)
8377                    } else {
8378                        None
8379                    };
8380                    ShowObjectType::Schema { from }
8381                }
8382                ObjectType::Table => {
8383                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8384                        Some(self.parse_raw_name()?)
8385                    } else {
8386                        None
8387                    };
8388                    ShowObjectType::Table { on_source }
8389                }
8390                ObjectType::View => ShowObjectType::View,
8391                ObjectType::Source => {
8392                    let in_cluster = self.parse_optional_in_cluster()?;
8393                    ShowObjectType::Source { in_cluster }
8394                }
8395                ObjectType::Subsource => {
8396                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8397                        Some(self.parse_raw_name()?)
8398                    } else {
8399                        None
8400                    };
8401
8402                    if from.is_some() && on_source.is_some() {
8403                        return parser_err!(
8404                            self,
8405                            self.peek_prev_pos(),
8406                            "Cannot specify both FROM and ON"
8407                        );
8408                    }
8409
8410                    ShowObjectType::Subsource { on_source }
8411                }
8412                ObjectType::Sink => {
8413                    let in_cluster = self.parse_optional_in_cluster()?;
8414                    ShowObjectType::Sink { in_cluster }
8415                }
8416                ObjectType::MetricSink => {
8417                    let in_cluster = self.parse_optional_in_cluster()?;
8418                    ShowObjectType::MetricSink { in_cluster }
8419                }
8420                ObjectType::Type => ShowObjectType::Type,
8421                ObjectType::Role => ShowObjectType::Role,
8422                ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8423                ObjectType::Secret => ShowObjectType::Secret,
8424                ObjectType::Connection => ShowObjectType::Connection,
8425                ObjectType::Cluster => ShowObjectType::Cluster,
8426                ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8427                ObjectType::MaterializedView => {
8428                    let in_cluster = self.parse_optional_in_cluster()?;
8429                    ShowObjectType::MaterializedView { in_cluster }
8430                }
8431                ObjectType::Index => {
8432                    let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8433                        Some(self.parse_raw_name()?)
8434                    } else {
8435                        None
8436                    };
8437
8438                    if from.is_some() && on_object.is_some() {
8439                        return parser_err!(
8440                            self,
8441                            self.peek_prev_pos(),
8442                            "Cannot specify both FROM and ON"
8443                        );
8444                    }
8445
8446                    let in_cluster = self.parse_optional_in_cluster()?;
8447                    ShowObjectType::Index {
8448                        in_cluster,
8449                        on_object,
8450                    }
8451                }
8452                ObjectType::Func => {
8453                    return parser_err!(
8454                        self,
8455                        self.peek_prev_pos(),
8456                        format!("Unsupported SHOW on {object_type}")
8457                    );
8458                }
8459            };
8460            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8461                object_type: show_object_type,
8462                from,
8463                filter: self.parse_show_statement_filter()?,
8464            }))
8465        } else if self.parse_keyword(CLUSTER) {
8466            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8467                variable: ident!("cluster"),
8468            }))
8469        } else if self.parse_keyword(PRIVILEGES) {
8470            self.parse_show_privileges()
8471        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8472            self.parse_show_default_privileges()
8473        } else if self.parse_keyword(ROLE) {
8474            self.expect_keyword(MEMBERSHIP)?;
8475            let role = if self.parse_keyword(FOR) {
8476                Some(self.parse_identifier()?)
8477            } else {
8478                None
8479            };
8480            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8481                object_type: ShowObjectType::RoleMembership { role },
8482                from: None,
8483                filter: self.parse_show_statement_filter()?,
8484            }))
8485        } else if self.parse_keywords(&[CREATE, VIEW]) {
8486            Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8487                view_name: self.parse_raw_name()?,
8488                redacted,
8489            }))
8490        } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8491            Ok(ShowStatement::ShowCreateMaterializedView(
8492                ShowCreateMaterializedViewStatement {
8493                    materialized_view_name: self.parse_raw_name()?,
8494                    redacted,
8495                },
8496            ))
8497        } else if self.parse_keywords(&[CREATE, SOURCE]) {
8498            Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8499                source_name: self.parse_raw_name()?,
8500                redacted,
8501            }))
8502        } else if self.parse_keywords(&[CREATE, TABLE]) {
8503            Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8504                table_name: self.parse_raw_name()?,
8505                redacted,
8506            }))
8507        } else if self.parse_keywords(&[CREATE, SINK]) {
8508            Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8509                sink_name: self.parse_raw_name()?,
8510                redacted,
8511            }))
8512        } else if self.parse_keywords(&[CREATE, METRIC, SINK]) {
8513            Ok(ShowStatement::ShowCreateMetricSink(
8514                ShowCreateMetricSinkStatement {
8515                    metric_sink_name: self.parse_raw_name()?,
8516                    redacted,
8517                },
8518            ))
8519        } else if self.parse_keywords(&[CREATE, INDEX]) {
8520            Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8521                index_name: self.parse_raw_name()?,
8522                redacted,
8523            }))
8524        } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8525            Ok(ShowStatement::ShowCreateConnection(
8526                ShowCreateConnectionStatement {
8527                    connection_name: self.parse_raw_name()?,
8528                    redacted,
8529                },
8530            ))
8531        } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8532            if redacted {
8533                return parser_err!(
8534                    self,
8535                    self.peek_prev_pos(),
8536                    "SHOW REDACTED CREATE CLUSTER is not supported"
8537                );
8538            }
8539            Ok(ShowStatement::ShowCreateCluster(
8540                ShowCreateClusterStatement {
8541                    cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8542                },
8543            ))
8544        } else if self.parse_keywords(&[CREATE, TYPE]) {
8545            Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8546                type_name: self.parse_data_type()?,
8547                redacted,
8548            }))
8549        } else {
8550            let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8551                ident!("transaction_isolation")
8552            } else if self.parse_keywords(&[TIME, ZONE]) {
8553                ident!("timezone")
8554            } else {
8555                self.parse_identifier()?
8556            };
8557            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8558                variable,
8559            }))
8560        }
8561    }
8562
8563    fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8564        self.expect_one_of_keywords(&[FROM, IN])?;
8565        let table_name = self.parse_raw_name()?;
8566        // MySQL also supports FROM <database> here. In other words, MySQL
8567        // allows both FROM <table> FROM <database> and FROM <database>.<table>,
8568        // while we only support the latter for now.
8569        let filter = self.parse_show_statement_filter()?;
8570        Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8571            table_name,
8572            filter,
8573        }))
8574    }
8575
8576    fn parse_show_statement_filter(
8577        &mut self,
8578    ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8579        if self.parse_keyword(LIKE) {
8580            Ok(Some(ShowStatementFilter::Like(
8581                self.parse_literal_string()?,
8582            )))
8583        } else if self.parse_keyword(WHERE) {
8584            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8585        } else {
8586            Ok(None)
8587        }
8588    }
8589
8590    fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8591        let object_type = if self.parse_keyword(ON) {
8592            Some(self.expect_plural_system_object_type_for_privileges()?)
8593        } else {
8594            None
8595        };
8596        let role = if self.parse_keyword(FOR) {
8597            Some(self.parse_identifier()?)
8598        } else {
8599            None
8600        };
8601        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8602            object_type: ShowObjectType::Privileges { object_type, role },
8603            from: None,
8604            filter: self.parse_show_statement_filter()?,
8605        }))
8606    }
8607
8608    fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8609        let object_type = if self.parse_keyword(ON) {
8610            Some(self.expect_plural_object_type_for_privileges()?)
8611        } else {
8612            None
8613        };
8614        let role = if self.parse_keyword(FOR) {
8615            Some(self.parse_identifier()?)
8616        } else {
8617            None
8618        };
8619        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8620            object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8621            from: None,
8622            filter: self.parse_show_statement_filter()?,
8623        }))
8624    }
8625
8626    fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8627        self.expect_keyword(SHARD)?;
8628        let id = self.parse_literal_string()?;
8629        Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8630    }
8631
8632    fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8633        let relation = self.parse_table_factor()?;
8634
8635        // Note that for keywords to be properly handled here, they need to be
8636        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
8637        // a table alias.
8638        let mut joins = vec![];
8639        loop {
8640            let join = if self.parse_keyword(CROSS) {
8641                self.expect_keyword(JOIN)?;
8642                Join {
8643                    relation: self.parse_table_factor()?,
8644                    join_operator: JoinOperator::CrossJoin,
8645                }
8646            } else {
8647                let natural = self.parse_keyword(NATURAL);
8648                let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8649                    Some(kw)
8650                } else {
8651                    None
8652                };
8653
8654                let join_operator_type = match peek_keyword {
8655                    Some(INNER) | Some(JOIN) => {
8656                        let _ = self.parse_keyword(INNER);
8657                        self.expect_keyword(JOIN)?;
8658                        JoinOperator::Inner
8659                    }
8660                    Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8661                        let _ = self.next_token();
8662                        let _ = self.parse_keyword(OUTER);
8663                        self.expect_keyword(JOIN)?;
8664                        match kw {
8665                            LEFT => JoinOperator::LeftOuter,
8666                            RIGHT => JoinOperator::RightOuter,
8667                            FULL => JoinOperator::FullOuter,
8668                            _ => unreachable!(),
8669                        }
8670                    }
8671                    Some(OUTER) => {
8672                        return self.expected(
8673                            self.peek_pos(),
8674                            "LEFT, RIGHT, or FULL",
8675                            self.peek_token(),
8676                        );
8677                    }
8678                    None if natural => {
8679                        return self.expected(
8680                            self.peek_pos(),
8681                            "a join type after NATURAL",
8682                            self.peek_token(),
8683                        );
8684                    }
8685                    _ => break,
8686                };
8687                let relation = self.parse_table_factor()?;
8688                let join_constraint = self.parse_join_constraint(natural)?;
8689                Join {
8690                    relation,
8691                    join_operator: join_operator_type(join_constraint),
8692                }
8693            };
8694            joins.push(join);
8695        }
8696        Ok(TableWithJoins { relation, joins })
8697    }
8698
8699    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
8700    fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8701        // Guard the nested table-factor recursion. `FROM ((((…` descends
8702        // parse_table_factor -> parse_table_and_joins -> parse_table_factor,
8703        // and the inner `parse_query` recursion guard doesn't stop it because
8704        // the derived-table `maybe_parse` below swallows its
8705        // `RecursionLimitError`. Without this, deeply nested parens overflow
8706        // the stack (and the try-both backtracking balloons memory).
8707        self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8708    }
8709
8710    fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8711        if self.parse_keyword(LATERAL) {
8712            // LATERAL must always be followed by a subquery or table function.
8713            if self.consume_token(&Token::LParen) {
8714                return self.parse_derived_table_factor(Lateral);
8715            } else if self.parse_keywords(&[ROWS, FROM]) {
8716                return self.parse_rows_from();
8717            } else {
8718                let name = self.parse_raw_name()?;
8719                self.expect_token(&Token::LParen)?;
8720                let args = self.parse_optional_args(false)?;
8721                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8722                return Ok(TableFactor::Function {
8723                    function: Function {
8724                        name,
8725                        args,
8726                        filter: None,
8727                        over: None,
8728                        distinct: false,
8729                    },
8730                    alias,
8731                    with_ordinality,
8732                });
8733            }
8734        }
8735
8736        if self.consume_token(&Token::LParen) {
8737            // A left paren introduces either a derived table (i.e., a subquery)
8738            // or a nested join. It's nearly impossible to determine ahead of
8739            // time which it is... so we just try to parse both.
8740            //
8741            // Here's an example that demonstrates the complexity:
8742            //                     /-------------------------------------------------------\
8743            //                     | /-----------------------------------\                 |
8744            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
8745            //                   ^ ^ ^ ^
8746            //                   | | | |
8747            //                   | | | |
8748            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
8749            //                   | | (3) starts a derived table (subquery)
8750            //                   | (2) starts a nested join
8751            //                   (1) an additional set of parens around a nested join
8752            //
8753
8754            // Check if the recently consumed '(' started a derived table, in
8755            // which case we've parsed the subquery, followed by the closing
8756            // ')', and the alias of the derived table. In the example above
8757            // this is case (3), and the next token would be `NATURAL`.
8758            maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8759
8760            // The '(' we've recently consumed does not start a derived table.
8761            // For valid input this can happen either when the token following
8762            // the paren can't start a query (e.g. `foo` in `FROM (foo NATURAL
8763            // JOIN bar)`, or when the '(' we've consumed is followed by another
8764            // '(' that starts a derived table, like (3), or another nested join
8765            // (2).
8766            //
8767            // Ignore the error and back up to where we were before. Either
8768            // we'll be able to parse a valid nested join, or we won't, and
8769            // we'll return that error instead.
8770            let table_and_joins = self.parse_table_and_joins()?;
8771            match table_and_joins.relation {
8772                TableFactor::NestedJoin { .. } => (),
8773                _ => {
8774                    if table_and_joins.joins.is_empty() {
8775                        // The SQL spec prohibits derived tables and bare
8776                        // tables from appearing alone in parentheses.
8777                        self.expected(self.peek_pos(), "joined table", self.peek_token())?
8778                    }
8779                }
8780            }
8781            self.expect_token(&Token::RParen)?;
8782            Ok(TableFactor::NestedJoin {
8783                join: Box::new(table_and_joins),
8784                alias: self.parse_optional_table_alias()?,
8785            })
8786        } else if self.parse_keywords(&[ROWS, FROM]) {
8787            Ok(self.parse_rows_from()?)
8788        } else {
8789            let name = self.parse_raw_name()?;
8790            if self.consume_token(&Token::LParen) {
8791                let args = self.parse_optional_args(false)?;
8792                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8793                Ok(TableFactor::Function {
8794                    function: Function {
8795                        name,
8796                        args,
8797                        filter: None,
8798                        over: None,
8799                        distinct: false,
8800                    },
8801                    alias,
8802                    with_ordinality,
8803                })
8804            } else {
8805                Ok(TableFactor::Table {
8806                    name,
8807                    alias: self.parse_optional_table_alias()?,
8808                })
8809            }
8810        }
8811    }
8812
8813    fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8814        self.expect_token(&Token::LParen)?;
8815        let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8816        self.expect_token(&Token::RParen)?;
8817        let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8818        Ok(TableFactor::RowsFrom {
8819            functions,
8820            alias,
8821            with_ordinality,
8822        })
8823    }
8824
8825    /// Parses the things that can come after the argument list of a table function call. These are
8826    /// - optional WITH ORDINALITY
8827    /// - optional table alias
8828    /// - optional WITH ORDINALITY again! This is allowed just to keep supporting our earlier buggy
8829    ///   order where we allowed WITH ORDINALITY only after the table alias. (Postgres and other
8830    ///   systems support it only before the table alias.)
8831    fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8832        let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8833        let alias = self.parse_optional_table_alias()?;
8834        let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8835        if with_ordinality_1 && with_ordinality_2 {
8836            return parser_err!(
8837                self,
8838                self.peek_prev_pos(),
8839                "WITH ORDINALITY specified twice"
8840            );
8841        }
8842        Ok((with_ordinality_1 || with_ordinality_2, alias))
8843    }
8844
8845    fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8846        let name = self.parse_raw_name()?;
8847        self.parse_function(name)
8848    }
8849
8850    /// Parses a function call in a position that only permits "windowless"
8851    /// function syntax (PostgreSQL's `func_expr_windowless`): DISTINCT,
8852    /// FILTER, and OVER are not part of the grammar here, which guarantees
8853    /// the planner's invariant that table functions never carry them.
8854    fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8855        let name = self.parse_raw_name()?;
8856        self.expect_token(&Token::LParen)?;
8857        let args = self.parse_optional_args(false)?;
8858        Ok(Function {
8859            name,
8860            args,
8861            filter: None,
8862            over: None,
8863            distinct: false,
8864        })
8865    }
8866
8867    fn parse_derived_table_factor(
8868        &mut self,
8869        lateral: IsLateral,
8870    ) -> Result<TableFactor<Raw>, ParserError> {
8871        let subquery = Box::new(self.parse_query()?);
8872        self.expect_token(&Token::RParen)?;
8873        let alias = self.parse_optional_table_alias()?;
8874        Ok(TableFactor::Derived {
8875            lateral: match lateral {
8876                Lateral => true,
8877                NotLateral => false,
8878            },
8879            subquery,
8880            alias,
8881        })
8882    }
8883
8884    fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8885        if natural {
8886            Ok(JoinConstraint::Natural)
8887        } else if self.parse_keyword(ON) {
8888            let constraint = self.parse_expr()?;
8889            Ok(JoinConstraint::On(constraint))
8890        } else if self.parse_keyword(USING) {
8891            let columns = self.parse_parenthesized_column_list(Mandatory)?;
8892            let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8893
8894            Ok(JoinConstraint::Using { columns, alias })
8895        } else {
8896            self.expected(
8897                self.peek_pos(),
8898                "ON, or USING after JOIN",
8899                self.peek_token(),
8900            )
8901        }
8902    }
8903
8904    /// Parse an INSERT statement
8905    fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8906        self.expect_keyword(INTO)?;
8907        let table_name = self.parse_raw_name()?;
8908        let columns = self.parse_parenthesized_column_list(Optional)?;
8909        let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8910            InsertSource::DefaultValues
8911        } else {
8912            InsertSource::Query(self.parse_query()?)
8913        };
8914        let returning = self.parse_returning()?;
8915        Ok(Statement::Insert(InsertStatement {
8916            table_name,
8917            columns,
8918            source,
8919            returning,
8920        }))
8921    }
8922
8923    fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8924        Ok(if self.parse_keyword(RETURNING) {
8925            self.parse_comma_separated(Parser::parse_select_item)?
8926        } else {
8927            Vec::new()
8928        })
8929    }
8930
8931    fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8932        let table_name = RawItemName::Name(self.parse_item_name()?);
8933        // The alias here doesn't support columns, so don't use parse_optional_table_alias.
8934        let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8935        let alias = alias.map(|name| TableAlias {
8936            name,
8937            columns: Vec::new(),
8938            strict: false,
8939        });
8940
8941        self.expect_keyword(SET)?;
8942        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8943        let selection = if self.parse_keyword(WHERE) {
8944            Some(self.parse_expr()?)
8945        } else {
8946            None
8947        };
8948
8949        Ok(Statement::Update(UpdateStatement {
8950            table_name,
8951            alias,
8952            assignments,
8953            selection,
8954        }))
8955    }
8956
8957    /// Parse a `var = expr` assignment, used in an UPDATE statement
8958    fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8959        let id = self.parse_identifier()?;
8960        self.expect_token(&Token::Eq)?;
8961        let value = self.parse_expr()?;
8962        Ok(Assignment { id, value })
8963    }
8964
8965    fn parse_optional_args(
8966        &mut self,
8967        allow_order_by: bool,
8968    ) -> Result<FunctionArgs<Raw>, ParserError> {
8969        if self.consume_token(&Token::Star) {
8970            self.expect_token(&Token::RParen)?;
8971            Ok(FunctionArgs::Star)
8972        } else if self.consume_token(&Token::RParen) {
8973            Ok(FunctionArgs::args(vec![]))
8974        } else {
8975            let args = self.parse_comma_separated(Parser::parse_expr)?;
8976            // ORDER BY can only appear after at least one argument, and not after a
8977            // star. We can ignore checking for it in the other branches. See:
8978            // https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES
8979            let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8980                self.parse_comma_separated(Parser::parse_order_by_expr)?
8981            } else {
8982                vec![]
8983            };
8984            self.expect_token(&Token::RParen)?;
8985            Ok(FunctionArgs::Args { args, order_by })
8986        }
8987    }
8988
8989    /// Parse `AS OF`, if present.
8990    fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8991        if self.parse_keyword(AS) {
8992            self.expect_keyword(OF)?;
8993            if self.parse_keywords(&[AT, LEAST]) {
8994                match self.parse_expr() {
8995                    Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8996                    Err(e) => self.expected(
8997                        e.pos,
8998                        "a timestamp value after 'AS OF AT LEAST'",
8999                        self.peek_token(),
9000                    ),
9001                }
9002            } else {
9003                match self.parse_expr() {
9004                    Ok(expr) => Ok(Some(AsOf::At(expr))),
9005                    Err(e) => {
9006                        self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
9007                    }
9008                }
9009            }
9010        } else {
9011            Ok(None)
9012        }
9013    }
9014
9015    /// Parse `UP TO`, if present
9016    fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
9017        if self.parse_keyword(UP) {
9018            self.expect_keyword(TO)?;
9019            self.parse_expr().map(Some)
9020        } else {
9021            Ok(None)
9022        }
9023    }
9024
9025    /// Parse `AS OF`, if present.
9026    ///
9027    /// In contrast to `parse_optional_as_of`, this parser only supports `AS OF <time>` syntax and
9028    /// directly returns an `u64`. It is only meant to be used for internal SQL syntax.
9029    fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
9030        fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
9031            let value = parser.parse_value().ok()?;
9032            let Value::Number(s) = value else { return None };
9033            s.parse().ok()
9034        }
9035
9036        if self.parse_keywords(&[AS, OF]) {
9037            match try_parse_u64(self) {
9038                Some(time) => Ok(Some(time)),
9039                None => {
9040                    self.prev_token();
9041                    self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
9042                }
9043            }
9044        } else {
9045            Ok(None)
9046        }
9047    }
9048
9049    /// Parse a comma-delimited list of projections after SELECT
9050    fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
9051        if self.consume_token(&Token::Star) {
9052            return Ok(SelectItem::Wildcard);
9053        }
9054        Ok(SelectItem::Expr {
9055            expr: self.parse_expr()?,
9056            alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
9057        })
9058    }
9059
9060    /// Parse an expression, optionally followed by ASC or DESC,
9061    /// and then `[NULLS { FIRST | LAST }]` (used in ORDER BY)
9062    fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
9063        let expr = self.parse_expr()?;
9064
9065        let asc = if self.parse_keyword(ASC) {
9066            Some(true)
9067        } else if self.parse_keyword(DESC) {
9068            Some(false)
9069        } else {
9070            None
9071        };
9072
9073        let nulls_last = if self.parse_keyword(NULLS) {
9074            let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
9075            Some(last)
9076        } else {
9077            None
9078        };
9079
9080        Ok(OrderByExpr {
9081            expr,
9082            asc,
9083            nulls_last,
9084        })
9085    }
9086
9087    fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
9088        let values = self.parse_comma_separated(|parser| {
9089            parser.expect_token(&Token::LParen)?;
9090            let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
9091            parser.expect_token(&Token::RParen)?;
9092            Ok(exprs)
9093        })?;
9094        Ok(Values(values))
9095    }
9096
9097    fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
9098        self.expect_keyword(TRANSACTION)?;
9099        Ok(Statement::StartTransaction(StartTransactionStatement {
9100            modes: self.parse_transaction_modes(false)?,
9101        }))
9102    }
9103
9104    fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
9105        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9106        Ok(Statement::StartTransaction(StartTransactionStatement {
9107            modes: self.parse_transaction_modes(false)?,
9108        }))
9109    }
9110
9111    fn parse_transaction_modes(
9112        &mut self,
9113        mut required: bool,
9114    ) -> Result<Vec<TransactionMode>, ParserError> {
9115        let mut modes = vec![];
9116        loop {
9117            let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
9118                let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
9119                    TransactionIsolationLevel::ReadUncommitted
9120                } else if self.parse_keywords(&[READ, COMMITTED]) {
9121                    TransactionIsolationLevel::ReadCommitted
9122                } else if self.parse_keywords(&[REPEATABLE, READ]) {
9123                    TransactionIsolationLevel::RepeatableRead
9124                } else if self.parse_keyword(SERIALIZABLE) {
9125                    TransactionIsolationLevel::Serializable
9126                } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
9127                    TransactionIsolationLevel::StrongSessionSerializable
9128                } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
9129                    TransactionIsolationLevel::StrictSerializable
9130                } else {
9131                    self.expected(self.peek_pos(), "isolation level", self.peek_token())?
9132                };
9133                TransactionMode::IsolationLevel(iso_level)
9134            } else if self.parse_keywords(&[READ, ONLY]) {
9135                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
9136            } else if self.parse_keywords(&[READ, WRITE]) {
9137                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
9138            } else if required {
9139                self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
9140            } else {
9141                break;
9142            };
9143            modes.push(mode);
9144            // ANSI requires a comma after each transaction mode, but
9145            // PostgreSQL, for historical reasons, does not. We follow
9146            // PostgreSQL in making the comma optional, since that is strictly
9147            // more general.
9148            required = self.consume_token(&Token::Comma);
9149        }
9150        Ok(modes)
9151    }
9152
9153    fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
9154        Ok(Statement::Commit(CommitStatement {
9155            chain: self.parse_commit_rollback_chain()?,
9156        }))
9157    }
9158
9159    fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
9160        Ok(Statement::Rollback(RollbackStatement {
9161            chain: self.parse_commit_rollback_chain()?,
9162        }))
9163    }
9164
9165    fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
9166        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9167        if self.parse_keyword(AND) {
9168            let chain = !self.parse_keyword(NO);
9169            self.expect_keyword(CHAIN)?;
9170            Ok(chain)
9171        } else {
9172            Ok(false)
9173        }
9174    }
9175
9176    fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
9177        parser_err!(
9178            self,
9179            self.peek_prev_pos(),
9180            "TAIL has been renamed to SUBSCRIBE"
9181        )
9182    }
9183
9184    fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
9185        let _ = self.parse_keyword(TO);
9186        let relation = if self.consume_token(&Token::LParen) {
9187            let query = self.parse_query()?;
9188            self.expect_token(&Token::RParen)?;
9189            SubscribeRelation::Query(query)
9190        } else {
9191            SubscribeRelation::Name(self.parse_raw_name()?)
9192        };
9193        let mut output = self.parse_subscribe_output()?;
9194        let options = if self.parse_keyword(WITH) {
9195            self.expect_token(&Token::LParen)?;
9196            let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
9197            self.expect_token(&Token::RParen)?;
9198            options
9199        } else {
9200            vec![]
9201        };
9202        let as_of = self.parse_optional_as_of()?;
9203        let up_to = self.parse_optional_up_to()?;
9204        // For backwards compatibility, we allow parsing output options
9205        // (`ENVELOPE`, `WITHIN TIMESTAMP ORDER BY`) at the end of the
9206        // statement, if they haven't already been specified where we prefer
9207        // them, before the `WITH` options and before the `AS OF`/`UP TO`
9208        // options. Our preferred syntax better aligns with the option ordering
9209        // for `CREATE SINK` and `SELECT`.
9210        if output == SubscribeOutput::Diffs {
9211            output = self.parse_subscribe_output()?;
9212        }
9213        Ok(Statement::Subscribe(SubscribeStatement {
9214            relation,
9215            options,
9216            as_of,
9217            up_to,
9218            output,
9219        }))
9220    }
9221
9222    fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
9223        let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
9224            PROGRESS => SubscribeOptionName::Progress,
9225            SNAPSHOT => SubscribeOptionName::Snapshot,
9226            _ => unreachable!(),
9227        };
9228        Ok(SubscribeOption {
9229            name,
9230            value: self.parse_optional_option_value()?,
9231        })
9232    }
9233
9234    fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
9235        if self.parse_keywords(&[ENVELOPE]) {
9236            let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
9237            self.expect_token(&Token::LParen)?;
9238            self.expect_keyword(KEY)?;
9239            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
9240            let output = match keyword {
9241                UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
9242                DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
9243                _ => unreachable!("no other keyword allowed"),
9244            };
9245            self.expect_token(&Token::RParen)?;
9246            Ok(output)
9247        } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
9248            Ok(SubscribeOutput::WithinTimestampOrderBy {
9249                order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
9250            })
9251        } else {
9252            Ok(SubscribeOutput::Diffs)
9253        }
9254    }
9255
9256    /// Parse an `EXPLAIN` statement, assuming that the `EXPLAIN` token
9257    /// has already been consumed.
9258    fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9259        if self.parse_keyword(TIMESTAMP) {
9260            self.parse_explain_timestamp()
9261                .map_parser_err(StatementKind::ExplainTimestamp)
9262        } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9263            self.parse_explain_pushdown()
9264                .map_parser_err(StatementKind::ExplainPushdown)
9265        } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9266            self.parse_explain_analyze()
9267                .map_parser_err(StatementKind::ExplainAnalyzeObject)
9268        } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9269            self.parse_explain_schema()
9270                .map_parser_err(StatementKind::ExplainSinkSchema)
9271        } else {
9272            self.parse_explain_plan()
9273                .map_parser_err(StatementKind::ExplainPlan)
9274        }
9275    }
9276
9277    fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9278        let explainee = if self.parse_keyword(VIEW) {
9279            // Parse: `VIEW name`
9280            Explainee::View(self.parse_raw_name()?)
9281        } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9282            // Parse: `MATERIALIZED VIEW name`
9283            Explainee::MaterializedView(self.parse_raw_name()?)
9284        } else if self.parse_keyword(INDEX) {
9285            // Parse: `INDEX name`
9286            Explainee::Index(self.parse_raw_name()?)
9287        } else if self.parse_keywords(&[REPLAN, VIEW]) {
9288            // Parse: `REPLAN VIEW name`
9289            Explainee::ReplanView(self.parse_raw_name()?)
9290        } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9291            // Parse: `REPLAN MATERIALIZED VIEW name`
9292            Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9293        } else if self.parse_keywords(&[REPLAN, INDEX]) {
9294            // Parse: `REPLAN INDEX name`
9295            Explainee::ReplanIndex(self.parse_raw_name()?)
9296        } else {
9297            let broken = self.parse_keyword(BROKEN);
9298
9299            if self.peek_keywords(&[CREATE, VIEW])
9300                || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9301            {
9302                // Parse: `BROKEN? CREATE [OR REPLACE] VIEW ...`
9303                let _ = self.parse_keyword(CREATE); // consume CREATE token
9304                let stmt = match self.parse_create_view()? {
9305                    Statement::CreateView(stmt) => stmt,
9306                    _ => panic!("Unexpected statement type return after parsing"),
9307                };
9308
9309                Explainee::CreateView(Box::new(stmt), broken)
9310            } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9311                || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9312            {
9313                // Parse: `BROKEN? CREATE [OR REPLACE] MATERIALIZED VIEW ...`
9314                let _ = self.parse_keyword(CREATE); // consume CREATE token
9315                let stmt = match self.parse_create_materialized_view()? {
9316                    Statement::CreateMaterializedView(stmt) => stmt,
9317                    _ => panic!("Unexpected statement type return after parsing"),
9318                };
9319
9320                Explainee::CreateMaterializedView(Box::new(stmt), broken)
9321            } else if self.peek_keywords(&[CREATE, INDEX])
9322                || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9323            {
9324                // Parse: `BROKEN? CREATE INDEX ...`
9325                let _ = self.parse_keyword(CREATE); // consume CREATE token
9326                let stmt = match self.parse_create_index()? {
9327                    Statement::CreateIndex(stmt) => stmt,
9328                    _ => panic!("Unexpected statement type return after parsing"),
9329                };
9330
9331                Explainee::CreateIndex(Box::new(stmt), broken)
9332            } else if self.peek_keyword(SUBSCRIBE) {
9333                // Parse: `BROKEN? SUBSCRIBE ...`
9334                let _ = self.parse_keyword(SUBSCRIBE); // consume SUBSCRIBE token
9335                let stmt = match self.parse_subscribe()? {
9336                    Statement::Subscribe(stmt) => stmt,
9337                    _ => panic!("Unexpected statement type return after parsing"),
9338                };
9339                Explainee::Subscribe(Box::new(stmt), broken)
9340            } else {
9341                // Parse: `BROKEN? query`
9342                let query = self.parse_select_statement()?;
9343                Explainee::Select(Box::new(query), broken)
9344            }
9345        };
9346        Ok(explainee)
9347    }
9348
9349    /// Parse an `EXPLAIN ... PLAN` statement, assuming that the `EXPLAIN` token
9350    /// has already been consumed.
9351    fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9352        let start = self.peek_pos();
9353        let (has_stage, stage) = match self.parse_one_of_keywords(&[
9354            RAW,
9355            DECORRELATED,
9356            LOCALLY,
9357            OPTIMIZED,
9358            PHYSICAL,
9359            OPTIMIZER,
9360            PLAN,
9361        ]) {
9362            Some(RAW) => {
9363                self.expect_keyword(PLAN)?;
9364                (true, Some(ExplainStage::RawPlan))
9365            }
9366            Some(DECORRELATED) => {
9367                self.expect_keyword(PLAN)?;
9368                (true, Some(ExplainStage::DecorrelatedPlan))
9369            }
9370            Some(LOCALLY) => {
9371                self.expect_keywords(&[OPTIMIZED, PLAN])?;
9372                (true, Some(ExplainStage::LocalPlan))
9373            }
9374            Some(OPTIMIZED) => {
9375                self.expect_keyword(PLAN)?;
9376                (true, Some(ExplainStage::GlobalPlan))
9377            }
9378            Some(PHYSICAL) => {
9379                self.expect_keyword(PLAN)?;
9380                (true, Some(ExplainStage::PhysicalPlan))
9381            }
9382            Some(OPTIMIZER) => {
9383                self.expect_keyword(TRACE)?;
9384                (true, Some(ExplainStage::Trace))
9385            }
9386            Some(PLAN) => {
9387                if self.parse_keyword(INSIGHTS) {
9388                    (true, Some(ExplainStage::PlanInsights))
9389                } else {
9390                    // Use the default plan for the explainee.
9391                    (true, None)
9392                }
9393            }
9394            None => {
9395                // Use the default plan for the explainee.
9396                (false, None)
9397            }
9398            _ => unreachable!(),
9399        };
9400
9401        let with_options = if self.parse_keyword(WITH) {
9402            if self.consume_token(&Token::LParen) {
9403                let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9404                self.expect_token(&Token::RParen)?;
9405                options
9406            } else {
9407                self.prev_token(); // push back WITH in case it's actually a CTE
9408                vec![]
9409            }
9410        } else {
9411            vec![]
9412        };
9413
9414        let format = if self.parse_keyword(AS) {
9415            match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9416                Some(TEXT) => Some(ExplainFormat::Text),
9417                Some(JSON) => Some(ExplainFormat::Json),
9418                Some(DOT) => Some(ExplainFormat::Dot),
9419                Some(VERBOSE) => {
9420                    self.expect_keyword(TEXT)?;
9421                    Some(ExplainFormat::VerboseText)
9422                }
9423                None => return Err(ParserError::new(self.index, "expected a format")),
9424                _ => unreachable!(),
9425            }
9426        } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9427            // if EXPLAIN PHYSICAL PLAN is explicitly specified without AS, default to VERBOSE TEXT
9428            Some(ExplainFormat::VerboseText)
9429        } else {
9430            None
9431        };
9432
9433        if has_stage {
9434            self.expect_keyword(FOR)?;
9435        }
9436
9437        let explainee = self.parse_explainee()?;
9438
9439        // Explainees that represent a view only work in association with an
9440        // explicitly defined stage.
9441        if matches!((explainee.is_view(), &stage), (true, None)) {
9442            let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9443            return Err(self.error(start, msg));
9444        }
9445
9446        Ok(Statement::ExplainPlan(ExplainPlanStatement {
9447            stage,
9448            with_options,
9449            format,
9450            explainee,
9451        }))
9452    }
9453
9454    fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9455        Ok(ExplainPlanOption {
9456            name: self.parse_explain_plan_option_name()?,
9457            value: self.parse_optional_option_value()?,
9458        })
9459    }
9460
9461    /// Parse an `EXPLAIN FILTER PUSHDOWN` statement, assuming that the `EXPLAIN
9462    /// PUSHDOWN` tokens have already been consumed.
9463    fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9464        self.expect_keyword(FOR)?;
9465
9466        let explainee = self.parse_explainee()?;
9467
9468        Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9469            explainee,
9470        }))
9471    }
9472
9473    fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9474        // EXPLAIN ANALYZE CLUSTER (MEMORY | CPU) [WITH SKEW] [AS SQL]
9475        if self.parse_keyword(CLUSTER) {
9476            let properties = self.parse_explain_analyze_computation_properties()?;
9477            let as_sql = self.parse_keywords(&[AS, SQL]);
9478            return Ok(Statement::ExplainAnalyzeCluster(
9479                ExplainAnalyzeClusterStatement { properties, as_sql },
9480            ));
9481        }
9482
9483        // EXPLAIN ANALYZE ((MEMORY | CPU) [WITH SKEW] | HINTS) FOR (INDEX ... | MATERIALIZED VIEW ...) [AS SQL]
9484
9485        let properties = if self.parse_keyword(HINTS) {
9486            ExplainAnalyzeProperty::Hints
9487        } else {
9488            ExplainAnalyzeProperty::Computation(
9489                self.parse_explain_analyze_computation_properties()?,
9490            )
9491        };
9492
9493        self.expect_keyword(FOR)?;
9494
9495        let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9496            INDEX => Explainee::Index(self.parse_raw_name()?),
9497            MATERIALIZED => {
9498                self.expect_keyword(VIEW)?;
9499                Explainee::MaterializedView(self.parse_raw_name()?)
9500            }
9501            _ => unreachable!(),
9502        };
9503
9504        let as_sql = self.parse_keywords(&[AS, SQL]);
9505
9506        Ok(Statement::ExplainAnalyzeObject(
9507            ExplainAnalyzeObjectStatement {
9508                properties,
9509                explainee,
9510                as_sql,
9511            },
9512        ))
9513    }
9514
9515    fn parse_explain_analyze_computation_properties(
9516        &mut self,
9517    ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9518        let mut computation_properties = vec![CPU, MEMORY];
9519        let (kw, property) =
9520            self.parse_explain_analyze_computation_property(&computation_properties)?;
9521        let mut properties = vec![property];
9522        computation_properties.retain(|p| p != &kw);
9523
9524        while self.consume_token(&Token::Comma) {
9525            let (kw, property) =
9526                self.parse_explain_analyze_computation_property(&computation_properties)?;
9527            computation_properties.retain(|p| p != &kw);
9528            properties.push(property);
9529        }
9530
9531        let skew = self.parse_keywords(&[WITH, SKEW]);
9532
9533        Ok(ExplainAnalyzeComputationProperties { properties, skew })
9534    }
9535
9536    fn parse_explain_analyze_computation_property(
9537        &mut self,
9538        properties: &[Keyword],
9539    ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9540        if properties.is_empty() {
9541            return Err(ParserError::new(
9542                self.peek_pos(),
9543                "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9544            ));
9545        }
9546
9547        match self.expect_one_of_keywords(properties)? {
9548            CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9549            MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9550            _ => unreachable!(),
9551        }
9552    }
9553
9554    /// Parse an `EXPLAIN TIMESTAMP` statement, assuming that the `EXPLAIN
9555    /// TIMESTAMP` tokens have already been consumed.
9556    fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9557        let format = if self.parse_keyword(AS) {
9558            match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9559                Some(TEXT) => Some(ExplainFormat::Text),
9560                Some(JSON) => Some(ExplainFormat::Json),
9561                Some(DOT) => Some(ExplainFormat::Dot),
9562                None => return Err(ParserError::new(self.index, "expected a format")),
9563                _ => unreachable!(),
9564            }
9565        } else {
9566            None
9567        };
9568
9569        self.expect_keyword(FOR)?;
9570
9571        let query = self.parse_select_statement()?;
9572
9573        Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9574            format,
9575            select: query,
9576        }))
9577    }
9578    /// Parse an `EXPLAIN [KEY|VALUE] SCHEMA` statement assuming that the `EXPLAIN` token
9579    /// have already been consumed
9580    fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9581        let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9582            KEY => ExplainSinkSchemaFor::Key,
9583            VALUE => ExplainSinkSchemaFor::Value,
9584            _ => unreachable!(),
9585        };
9586
9587        self.expect_keyword(SCHEMA)?;
9588
9589        let format = if self.parse_keyword(AS) {
9590            // only json format is supported
9591            self.expect_keyword(JSON)?;
9592            Some(ExplainFormat::Json)
9593        } else {
9594            None
9595        };
9596
9597        self.expect_keywords(&[FOR, CREATE])?;
9598
9599        if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9600            Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9601                schema_for,
9602                format,
9603                statement,
9604            }))
9605        } else {
9606            unreachable!("only create sink can be returned here");
9607        }
9608    }
9609
9610    /// Parse a `DECLARE` statement, assuming that the `DECLARE` token
9611    /// has already been consumed.
9612    fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9613        let name = self
9614            .parse_identifier()
9615            .map_parser_err(StatementKind::Declare)?;
9616        self.expect_keyword(CURSOR)
9617            .map_parser_err(StatementKind::Declare)?;
9618        if self.parse_keyword(WITH) {
9619            let err = parser_err!(
9620                self,
9621                self.peek_prev_pos(),
9622                "WITH HOLD is unsupported for cursors"
9623            )
9624            .map_parser_err(StatementKind::Declare);
9625            self.expect_keyword(HOLD)
9626                .map_parser_err(StatementKind::Declare)?;
9627            return err;
9628        }
9629        // WITHOUT HOLD is optional and the default behavior so we can ignore it.
9630        let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9631        self.expect_keyword(FOR)
9632            .map_parser_err(StatementKind::Declare)?;
9633        let StatementParseResult { ast, sql } = self.parse_statement()?;
9634        Ok(Statement::Declare(DeclareStatement {
9635            name,
9636            stmt: Box::new(ast),
9637            sql: sql.to_string(),
9638        }))
9639    }
9640
9641    /// Parse a `CLOSE` statement, assuming that the `CLOSE` token
9642    /// has already been consumed.
9643    fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9644        let name = self.parse_identifier()?;
9645        Ok(Statement::Close(CloseStatement { name }))
9646    }
9647
9648    /// Parse a `PREPARE` statement, assuming that the `PREPARE` token
9649    /// has already been consumed.
9650    fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9651        let name = self
9652            .parse_identifier()
9653            .map_parser_err(StatementKind::Prepare)?;
9654        self.expect_keyword(AS)
9655            .map_parser_err(StatementKind::Prepare)?;
9656        let pos = self.peek_pos();
9657        //
9658        let StatementParseResult { ast, sql } = self.parse_statement()?;
9659        if !matches!(
9660            ast,
9661            Statement::Select(_)
9662                | Statement::Insert(_)
9663                | Statement::Delete(_)
9664                | Statement::Update(_)
9665                | Statement::Fetch(_),
9666        ) {
9667            return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9668        }
9669        Ok(Statement::Prepare(PrepareStatement {
9670            name,
9671            stmt: Box::new(ast),
9672            sql: sql.to_string(),
9673        }))
9674    }
9675
9676    /// Parse a `EXECUTE` statement, assuming that the `EXECUTE` token
9677    /// has already been consumed.
9678    fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9679        // Check if this is EXECUTE UNIT TEST
9680        if self.parse_keywords(&[UNIT, TEST]) {
9681            return self.parse_execute_unit_test();
9682        }
9683
9684        // Otherwise parse as regular EXECUTE (prepared statement)
9685        let name = self.parse_identifier()?;
9686        let params = if self.consume_token(&Token::LParen) {
9687            let params = self.parse_comma_separated(Parser::parse_expr)?;
9688            self.expect_token(&Token::RParen)?;
9689            params
9690        } else {
9691            Vec::new()
9692        };
9693        Ok(Statement::Execute(ExecuteStatement { name, params }))
9694    }
9695
9696    /// Parse an `EXECUTE UNIT TEST` statement, assuming that the
9697    /// `EXECUTE UNIT TEST` tokens have already been consumed.
9698    fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9699        // Parse test name
9700        let name = self.parse_identifier()?;
9701
9702        // Expect FOR keyword
9703        self.expect_keyword(FOR)?;
9704
9705        // Parse target view name
9706        let target = self.parse_raw_name()?;
9707
9708        // Parse optional AT TIME clause
9709        let at_time = if self.parse_keywords(&[AT, TIME]) {
9710            Some(self.parse_expr()?)
9711        } else {
9712            None
9713        };
9714
9715        // Parse MOCK definitions (0 or more). Like CTEs, MOCK clauses are
9716        // comma-separated; no comma appears before the trailing `EXPECTED`
9717        // clause.
9718        let mut mocks = Vec::new();
9719        if self.parse_keyword(MOCK) {
9720            mocks.push(self.parse_mock_view_def()?);
9721            while self.consume_token(&Token::Comma) {
9722                self.expect_keyword(MOCK)?;
9723                mocks.push(self.parse_mock_view_def()?);
9724            }
9725        }
9726
9727        self.expect_keyword(EXPECTED)?;
9728
9729        self.expect_token(&Token::LParen)?;
9730        let expected_columns = self.parse_comma_separated(|parser| {
9731            Ok(ColumnDef {
9732                name: parser.parse_identifier()?,
9733                data_type: parser.parse_data_type()?,
9734                collation: None,
9735                options: vec![],
9736            })
9737        })?;
9738        self.expect_token(&Token::RParen)?;
9739
9740        self.expect_keyword(AS)?;
9741        self.expect_token(&Token::LParen)?;
9742        let expected_query = self.parse_query()?;
9743        self.expect_token(&Token::RParen)?;
9744
9745        let expected = ExpectedResultDef {
9746            columns: expected_columns,
9747            query: expected_query,
9748        };
9749
9750        Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9751            name,
9752            target,
9753            at_time,
9754            mocks,
9755            expected,
9756        }))
9757    }
9758
9759    /// Parse a single `MOCK <name> (<cols>) AS (<query>)` definition,
9760    /// assuming the leading `MOCK` keyword has already been consumed.
9761    fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9762        let name = self.parse_raw_name()?;
9763
9764        self.expect_token(&Token::LParen)?;
9765        let columns = self.parse_comma_separated(|parser| {
9766            Ok(ColumnDef {
9767                name: parser.parse_identifier()?,
9768                data_type: parser.parse_data_type()?,
9769                collation: None,
9770                options: vec![],
9771            })
9772        })?;
9773        self.expect_token(&Token::RParen)?;
9774
9775        self.expect_keyword(AS)?;
9776        self.expect_token(&Token::LParen)?;
9777        let query = self.parse_query()?;
9778        self.expect_token(&Token::RParen)?;
9779
9780        Ok(MockViewDef {
9781            name,
9782            columns,
9783            query,
9784        })
9785    }
9786
9787    /// Parse a `DEALLOCATE` statement, assuming that the `DEALLOCATE` token
9788    /// has already been consumed.
9789    fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9790        let _ = self.parse_keyword(PREPARE);
9791        let name = if self.parse_keyword(ALL) {
9792            None
9793        } else {
9794            Some(self.parse_identifier()?)
9795        };
9796        Ok(Statement::Deallocate(DeallocateStatement { name }))
9797    }
9798
9799    /// Parse a `FETCH` statement, assuming that the `FETCH` token
9800    /// has already been consumed.
9801    fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9802        let _ = self.parse_keyword(FORWARD);
9803        let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9804            Some(FetchDirection::ForwardCount(count))
9805        } else if self.parse_keyword(ALL) {
9806            Some(FetchDirection::ForwardAll)
9807        } else {
9808            None
9809        };
9810        let _ = self.parse_keyword(FROM);
9811        let name = self.parse_identifier()?;
9812        let options = if self.parse_keyword(WITH) {
9813            self.expect_token(&Token::LParen)?;
9814            let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9815            self.expect_token(&Token::RParen)?;
9816            options
9817        } else {
9818            vec![]
9819        };
9820        Ok(Statement::Fetch(FetchStatement {
9821            name,
9822            count,
9823            options,
9824        }))
9825    }
9826
9827    fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9828        self.expect_keyword(TIMEOUT)?;
9829        Ok(FetchOption {
9830            name: FetchOptionName::Timeout,
9831            value: self.parse_optional_option_value()?,
9832        })
9833    }
9834
9835    /// Parse a `RAISE` statement, assuming that the `RAISE` token
9836    /// has already been consumed.
9837    fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9838        let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9839            Some(DEBUG) => NoticeSeverity::Debug,
9840            Some(INFO) => NoticeSeverity::Info,
9841            Some(LOG) => NoticeSeverity::Log,
9842            Some(NOTICE) => NoticeSeverity::Notice,
9843            Some(WARNING) => NoticeSeverity::Warning,
9844            Some(_) => unreachable!(),
9845            None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9846        };
9847
9848        Ok(Statement::Raise(RaiseStatement { severity }))
9849    }
9850
9851    /// Parse a `GRANT` statement, assuming that the `GRANT` token
9852    /// has already been consumed.
9853    fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9854        match self.parse_privilege_specification() {
9855            Some(privileges) => self
9856                .parse_grant_privilege(privileges)
9857                .map_parser_err(StatementKind::GrantPrivileges),
9858            None => self
9859                .parse_grant_role()
9860                .map_parser_err(StatementKind::GrantRole),
9861        }
9862    }
9863
9864    /// Parse a `GRANT PRIVILEGE` statement, assuming that the `GRANT` token
9865    /// and all privileges have already been consumed.
9866    fn parse_grant_privilege(
9867        &mut self,
9868        privileges: PrivilegeSpecification,
9869    ) -> Result<Statement<Raw>, ParserError> {
9870        self.expect_keyword(ON)?;
9871        let target = self.expect_grant_target_specification("GRANT")?;
9872        self.expect_keyword(TO)?;
9873        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9874        Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9875            privileges,
9876            target,
9877            roles,
9878        }))
9879    }
9880
9881    /// Parse a `GRANT ROLE` statement, assuming that the `GRANT` token
9882    /// has already been consumed.
9883    fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9884        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9885        self.expect_keyword(TO)?;
9886        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9887        Ok(Statement::GrantRole(GrantRoleStatement {
9888            role_names,
9889            member_names,
9890        }))
9891    }
9892
9893    /// Parse a `REVOKE` statement, assuming that the `REVOKE` token
9894    /// has already been consumed.
9895    fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9896        match self.parse_privilege_specification() {
9897            Some(privileges) => self
9898                .parse_revoke_privilege(privileges)
9899                .map_parser_err(StatementKind::RevokePrivileges),
9900            None => self
9901                .parse_revoke_role()
9902                .map_parser_err(StatementKind::RevokeRole),
9903        }
9904    }
9905
9906    /// Parse a `REVOKE PRIVILEGE` statement, assuming that the `REVOKE` token
9907    /// and all privileges have already been consumed.
9908    fn parse_revoke_privilege(
9909        &mut self,
9910        privileges: PrivilegeSpecification,
9911    ) -> Result<Statement<Raw>, ParserError> {
9912        self.expect_keyword(ON)?;
9913        let target = self.expect_grant_target_specification("REVOKE")?;
9914        self.expect_keyword(FROM)?;
9915        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9916        Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9917            privileges,
9918            target,
9919            roles,
9920        }))
9921    }
9922
9923    /// Parse a `REVOKE ROLE` statement, assuming that the `REVOKE` token
9924    /// has already been consumed.
9925    fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9926        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9927        self.expect_keyword(FROM)?;
9928        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9929        Ok(Statement::RevokeRole(RevokeRoleStatement {
9930            role_names,
9931            member_names,
9932        }))
9933    }
9934
9935    fn expect_grant_target_specification(
9936        &mut self,
9937        statement_type: &str,
9938    ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9939        if self.parse_keyword(SYSTEM) {
9940            return Ok(GrantTargetSpecification::System);
9941        }
9942
9943        let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9944            let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9945            let object_spec_inner = if self.parse_keyword(IN) {
9946                if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9947                    return parser_err!(
9948                        self,
9949                        self.peek_prev_pos(),
9950                        format!("IN invalid for {object_type}S")
9951                    );
9952                }
9953                match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9954                    DATABASE => GrantTargetSpecificationInner::All(
9955                        GrantTargetAllSpecification::AllDatabases {
9956                            databases: self.parse_comma_separated(Parser::parse_database_name)?,
9957                        },
9958                    ),
9959                    SCHEMA => {
9960                        if object_type == ObjectType::Schema {
9961                            self.prev_token();
9962                            self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9963                        }
9964                        GrantTargetSpecificationInner::All(
9965                            GrantTargetAllSpecification::AllSchemas {
9966                                schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9967                            },
9968                        )
9969                    }
9970                    _ => unreachable!(),
9971                }
9972            } else {
9973                GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9974            };
9975            (object_type, object_spec_inner)
9976        } else {
9977            let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9978            let object_spec_inner = GrantTargetSpecificationInner::Objects {
9979                names: self
9980                    .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9981            };
9982            (object_type, object_spec_inner)
9983        };
9984
9985        Ok(GrantTargetSpecification::Object {
9986            object_type,
9987            object_spec_inner,
9988        })
9989    }
9990
9991    /// Bail out if the current token is not an object type suitable for a GRANT/REVOKE, or consume
9992    /// and return it if it is.
9993    fn expect_grant_revoke_object_type(
9994        &mut self,
9995        statement_type: &str,
9996    ) -> Result<ObjectType, ParserError> {
9997        // If the object type is omitted, then it is assumed to be a table.
9998        let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9999        self.expect_grant_revoke_object_type_inner(statement_type, object_type)
10000    }
10001
10002    /// Bail out if the current token is not a plural object type suitable for a GRANT/REVOKE, or consume
10003    /// and return it if it is.
10004    fn expect_grant_revoke_plural_object_type(
10005        &mut self,
10006        statement_type: &str,
10007    ) -> Result<ObjectType, ParserError> {
10008        let object_type = self.expect_plural_object_type().map_err(|_| {
10009            // Limit the error message to allowed object types.
10010            self.expected::<_, ObjectType>(
10011                self.peek_pos(),
10012                "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
10013                self.peek_token(),
10014            )
10015                .unwrap_err()
10016        })?;
10017        self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
10018        Ok(object_type)
10019    }
10020
10021    fn expect_grant_revoke_object_type_inner(
10022        &self,
10023        statement_type: &str,
10024        object_type: ObjectType,
10025    ) -> Result<ObjectType, ParserError> {
10026        match object_type {
10027            ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
10028                parser_err!(
10029                    self,
10030                    self.peek_prev_pos(),
10031                    format!(
10032                        "For object type {object_type}, you must specify 'TABLE' or omit the object type"
10033                    )
10034                )
10035            }
10036            ObjectType::Sink
10037            | ObjectType::MetricSink
10038            | ObjectType::Index
10039            | ObjectType::ClusterReplica
10040            | ObjectType::Role
10041            | ObjectType::Func
10042            | ObjectType::Subsource => {
10043                parser_err!(
10044                    self,
10045                    self.peek_prev_pos(),
10046                    format!("Unsupported {statement_type} on {object_type}")
10047                )
10048            }
10049            ObjectType::Table
10050            | ObjectType::Type
10051            | ObjectType::Cluster
10052            | ObjectType::Secret
10053            | ObjectType::Connection
10054            | ObjectType::Database
10055            | ObjectType::Schema
10056            | ObjectType::NetworkPolicy => Ok(object_type),
10057        }
10058    }
10059
10060    /// Bail out if the current token is not an object type, or consume and return it if it is.
10061    fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
10062        Ok(
10063            match self.expect_one_of_keywords(&[
10064                TABLE,
10065                VIEW,
10066                MATERIALIZED,
10067                SOURCE,
10068                SINK,
10069                METRIC,
10070                INDEX,
10071                TYPE,
10072                ROLE,
10073                USER,
10074                CLUSTER,
10075                SECRET,
10076                CONNECTION,
10077                DATABASE,
10078                SCHEMA,
10079                FUNCTION,
10080                NETWORK,
10081            ])? {
10082                TABLE => ObjectType::Table,
10083                VIEW => ObjectType::View,
10084                MATERIALIZED => {
10085                    if let Err(e) = self.expect_keyword(VIEW) {
10086                        self.prev_token();
10087                        return Err(e);
10088                    }
10089                    ObjectType::MaterializedView
10090                }
10091                SOURCE => ObjectType::Source,
10092                SINK => ObjectType::Sink,
10093                METRIC => {
10094                    if let Err(e) = self.expect_keyword(SINK) {
10095                        self.prev_token();
10096                        return Err(e);
10097                    }
10098                    ObjectType::MetricSink
10099                }
10100                INDEX => ObjectType::Index,
10101                TYPE => ObjectType::Type,
10102                ROLE | USER => ObjectType::Role,
10103                CLUSTER => {
10104                    if self.parse_keyword(REPLICA) {
10105                        ObjectType::ClusterReplica
10106                    } else {
10107                        ObjectType::Cluster
10108                    }
10109                }
10110                SECRET => ObjectType::Secret,
10111                CONNECTION => ObjectType::Connection,
10112                DATABASE => ObjectType::Database,
10113                SCHEMA => ObjectType::Schema,
10114                FUNCTION => ObjectType::Func,
10115                NETWORK => {
10116                    if let Err(e) = self.expect_keyword(POLICY) {
10117                        self.prev_token();
10118                        return Err(e);
10119                    }
10120                    ObjectType::NetworkPolicy
10121                }
10122                _ => unreachable!(),
10123            },
10124        )
10125    }
10126
10127    /// Look for an object type and return it if it matches.
10128    fn parse_object_type(&mut self) -> Option<ObjectType> {
10129        Some(
10130            match self.parse_one_of_keywords(&[
10131                TABLE,
10132                VIEW,
10133                MATERIALIZED,
10134                SOURCE,
10135                SINK,
10136                METRIC,
10137                INDEX,
10138                TYPE,
10139                ROLE,
10140                USER,
10141                CLUSTER,
10142                SECRET,
10143                CONNECTION,
10144                DATABASE,
10145                SCHEMA,
10146                FUNCTION,
10147                NETWORK,
10148            ])? {
10149                TABLE => ObjectType::Table,
10150                VIEW => ObjectType::View,
10151                MATERIALIZED => {
10152                    if self.parse_keyword(VIEW) {
10153                        ObjectType::MaterializedView
10154                    } else {
10155                        self.prev_token();
10156                        return None;
10157                    }
10158                }
10159                SOURCE => ObjectType::Source,
10160                SINK => ObjectType::Sink,
10161                METRIC => {
10162                    if self.parse_keyword(SINK) {
10163                        ObjectType::MetricSink
10164                    } else {
10165                        self.prev_token();
10166                        return None;
10167                    }
10168                }
10169                INDEX => ObjectType::Index,
10170                TYPE => ObjectType::Type,
10171                ROLE | USER => ObjectType::Role,
10172                CLUSTER => {
10173                    if self.parse_keyword(REPLICA) {
10174                        ObjectType::ClusterReplica
10175                    } else {
10176                        ObjectType::Cluster
10177                    }
10178                }
10179                SECRET => ObjectType::Secret,
10180                CONNECTION => ObjectType::Connection,
10181                DATABASE => ObjectType::Database,
10182                SCHEMA => ObjectType::Schema,
10183                FUNCTION => ObjectType::Func,
10184                NETWORK => {
10185                    if self.parse_keyword(POLICY) {
10186                        ObjectType::NetworkPolicy
10187                    } else {
10188                        self.prev_token();
10189                        return None;
10190                    }
10191                }
10192                _ => unreachable!(),
10193            },
10194        )
10195    }
10196
10197    /// Bail out if the current token is not an object type in the plural form, or consume and return it if it is.
10198    fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
10199        Ok(
10200            match self.expect_one_of_keywords(&[
10201                TABLES,
10202                VIEWS,
10203                MATERIALIZED,
10204                SOURCES,
10205                SINKS,
10206                INDEXES,
10207                TYPES,
10208                ROLES,
10209                USERS,
10210                CLUSTER,
10211                CLUSTERS,
10212                SECRETS,
10213                CONNECTIONS,
10214                DATABASES,
10215                SCHEMAS,
10216                POLICIES,
10217            ])? {
10218                TABLES => ObjectType::Table,
10219                VIEWS => ObjectType::View,
10220                MATERIALIZED => {
10221                    if let Err(e) = self.expect_keyword(VIEWS) {
10222                        self.prev_token();
10223                        return Err(e);
10224                    }
10225                    ObjectType::MaterializedView
10226                }
10227                SOURCES => ObjectType::Source,
10228                SINKS => ObjectType::Sink,
10229                INDEXES => ObjectType::Index,
10230                TYPES => ObjectType::Type,
10231                ROLES | USERS => ObjectType::Role,
10232                CLUSTER => {
10233                    if let Err(e) = self.expect_keyword(REPLICAS) {
10234                        self.prev_token();
10235                        return Err(e);
10236                    }
10237                    ObjectType::ClusterReplica
10238                }
10239                CLUSTERS => ObjectType::Cluster,
10240                SECRETS => ObjectType::Secret,
10241                CONNECTIONS => ObjectType::Connection,
10242                DATABASES => ObjectType::Database,
10243                SCHEMAS => ObjectType::Schema,
10244                POLICIES => ObjectType::NetworkPolicy,
10245                _ => unreachable!(),
10246            },
10247        )
10248    }
10249
10250    /// Look for an object type in the plural form and return it if it matches.
10251    fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
10252        Some(
10253            match self.parse_one_of_keywords(&[
10254                TABLES,
10255                VIEWS,
10256                MATERIALIZED,
10257                SOURCES,
10258                SINKS,
10259                METRIC,
10260                INDEXES,
10261                TYPES,
10262                ROLES,
10263                USERS,
10264                CLUSTER,
10265                CLUSTERS,
10266                SECRETS,
10267                CONNECTIONS,
10268                DATABASES,
10269                SCHEMAS,
10270                SUBSOURCES,
10271                NETWORK,
10272            ])? {
10273                TABLES => ObjectType::Table,
10274                VIEWS => ObjectType::View,
10275                MATERIALIZED => {
10276                    if self.parse_keyword(VIEWS) {
10277                        ObjectType::MaterializedView
10278                    } else {
10279                        self.prev_token();
10280                        return None;
10281                    }
10282                }
10283                SOURCES => ObjectType::Source,
10284                SINKS => ObjectType::Sink,
10285                METRIC => {
10286                    if self.parse_keyword(SINKS) {
10287                        ObjectType::MetricSink
10288                    } else {
10289                        self.prev_token();
10290                        return None;
10291                    }
10292                }
10293                INDEXES => ObjectType::Index,
10294                TYPES => ObjectType::Type,
10295                ROLES | USERS => ObjectType::Role,
10296                CLUSTER => {
10297                    if self.parse_keyword(REPLICAS) {
10298                        ObjectType::ClusterReplica
10299                    } else {
10300                        self.prev_token();
10301                        return None;
10302                    }
10303                }
10304                CLUSTERS => ObjectType::Cluster,
10305                SECRETS => ObjectType::Secret,
10306                CONNECTIONS => ObjectType::Connection,
10307                DATABASES => ObjectType::Database,
10308                SCHEMAS => ObjectType::Schema,
10309                SUBSOURCES => ObjectType::Subsource,
10310                NETWORK => {
10311                    if self.parse_keyword(POLICIES) {
10312                        ObjectType::NetworkPolicy
10313                    } else {
10314                        self.prev_token();
10315                        return None;
10316                    }
10317                }
10318                _ => unreachable!(),
10319            },
10320        )
10321    }
10322
10323    /// Bail out if the current token is not a privilege object type, or consume and
10324    /// return it if it is.
10325    fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10326        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10327            return parser_err!(
10328                self,
10329                self.peek_prev_pos(),
10330                format!("For object type {object_type}, you must specify 'TABLES'")
10331            );
10332        }
10333        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10334            self.prev_token();
10335            return parser_err!(
10336                self,
10337                self.peek_prev_pos(),
10338                "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10339            );
10340        }
10341
10342        Ok(
10343            match self.expect_one_of_keywords(&[
10344                TABLES,
10345                TYPES,
10346                CLUSTERS,
10347                SECRETS,
10348                CONNECTIONS,
10349                DATABASES,
10350                SCHEMAS,
10351            ])? {
10352                TABLES => ObjectType::Table,
10353                TYPES => ObjectType::Type,
10354                CLUSTERS => ObjectType::Cluster,
10355                SECRETS => ObjectType::Secret,
10356                CONNECTIONS => ObjectType::Connection,
10357                DATABASES => ObjectType::Database,
10358                SCHEMAS => ObjectType::Schema,
10359                _ => unreachable!(),
10360            },
10361        )
10362    }
10363
10364    /// Bail out if the current token is not a privilege object type in the plural form, or consume and
10365    /// return it if it is.
10366    fn expect_plural_system_object_type_for_privileges(
10367        &mut self,
10368    ) -> Result<SystemObjectType, ParserError> {
10369        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10370            return parser_err!(
10371                self,
10372                self.peek_prev_pos(),
10373                format!("For object type {object_type}, you must specify 'TABLES'")
10374            );
10375        }
10376        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10377            self.prev_token();
10378            return parser_err!(
10379                self,
10380                self.peek_prev_pos(),
10381                "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10382            );
10383        }
10384
10385        Ok(
10386            match self.expect_one_of_keywords(&[
10387                SYSTEM,
10388                TABLES,
10389                TYPES,
10390                CLUSTERS,
10391                SECRETS,
10392                CONNECTIONS,
10393                DATABASES,
10394                SCHEMAS,
10395            ])? {
10396                SYSTEM => SystemObjectType::System,
10397                TABLES => SystemObjectType::Object(ObjectType::Table),
10398                TYPES => SystemObjectType::Object(ObjectType::Type),
10399                CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10400                SECRETS => SystemObjectType::Object(ObjectType::Secret),
10401                CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10402                DATABASES => SystemObjectType::Object(ObjectType::Database),
10403                SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10404                _ => unreachable!(),
10405            },
10406        )
10407    }
10408
10409    /// Look for a privilege and return it if it matches.
10410    fn parse_privilege(&mut self) -> Option<Privilege> {
10411        Some(
10412            match self.parse_one_of_keywords(&[
10413                INSERT,
10414                SELECT,
10415                UPDATE,
10416                DELETE,
10417                USAGE,
10418                CREATE,
10419                CREATEROLE,
10420                CREATEDB,
10421                CREATECLUSTER,
10422                CREATENETWORKPOLICY,
10423            ])? {
10424                INSERT => Privilege::INSERT,
10425                SELECT => Privilege::SELECT,
10426                UPDATE => Privilege::UPDATE,
10427                DELETE => Privilege::DELETE,
10428                USAGE => Privilege::USAGE,
10429                CREATE => Privilege::CREATE,
10430                CREATEROLE => Privilege::CREATEROLE,
10431                CREATEDB => Privilege::CREATEDB,
10432                CREATECLUSTER => Privilege::CREATECLUSTER,
10433                CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10434                _ => unreachable!(),
10435            },
10436        )
10437    }
10438
10439    /// Parse one or more privileges separated by a ','.
10440    fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10441        if self.parse_keyword(ALL) {
10442            let _ = self.parse_keyword(PRIVILEGES);
10443            return Some(PrivilegeSpecification::All);
10444        }
10445
10446        let mut privileges = Vec::new();
10447        while let Some(privilege) = self.parse_privilege() {
10448            privileges.push(privilege);
10449            if !self.consume_token(&Token::Comma) {
10450                break;
10451            }
10452        }
10453
10454        if privileges.is_empty() {
10455            None
10456        } else {
10457            Some(PrivilegeSpecification::Privileges(privileges))
10458        }
10459    }
10460
10461    /// Bail out if the current token is not a role specification, or consume and return it if it is.
10462    fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10463        let _ = self.parse_keyword(GROUP);
10464        self.parse_identifier()
10465    }
10466
10467    /// Parse a `REASSIGN OWNED` statement, assuming that the `REASSIGN` token
10468    /// has already been consumed.
10469    fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10470        self.expect_keywords(&[OWNED, BY])?;
10471        let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10472        self.expect_keyword(TO)?;
10473        let new_role = self.parse_identifier()?;
10474        Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10475            old_roles,
10476            new_role,
10477        }))
10478    }
10479
10480    fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10481        self.expect_keyword(ON)?;
10482
10483        let object = match self.expect_one_of_keywords(&[
10484            TABLE,
10485            VIEW,
10486            COLUMN,
10487            MATERIALIZED,
10488            SOURCE,
10489            SINK,
10490            INDEX,
10491            FUNCTION,
10492            CONNECTION,
10493            TYPE,
10494            SECRET,
10495            ROLE,
10496            DATABASE,
10497            SCHEMA,
10498            CLUSTER,
10499            NETWORK,
10500        ])? {
10501            TABLE => {
10502                let name = self.parse_raw_name()?;
10503                CommentObjectType::Table { name }
10504            }
10505            VIEW => {
10506                let name = self.parse_raw_name()?;
10507                CommentObjectType::View { name }
10508            }
10509            MATERIALIZED => {
10510                self.expect_keyword(VIEW)?;
10511                let name = self.parse_raw_name()?;
10512                CommentObjectType::MaterializedView { name }
10513            }
10514            SOURCE => {
10515                let name = self.parse_raw_name()?;
10516                CommentObjectType::Source { name }
10517            }
10518            SINK => {
10519                let name = self.parse_raw_name()?;
10520                CommentObjectType::Sink { name }
10521            }
10522            INDEX => {
10523                let name = self.parse_raw_name()?;
10524                CommentObjectType::Index { name }
10525            }
10526            FUNCTION => {
10527                let name = self.parse_raw_name()?;
10528                CommentObjectType::Func { name }
10529            }
10530            CONNECTION => {
10531                let name = self.parse_raw_name()?;
10532                CommentObjectType::Connection { name }
10533            }
10534            TYPE => {
10535                let ty = self.parse_data_type()?;
10536                CommentObjectType::Type { ty }
10537            }
10538            SECRET => {
10539                let name = self.parse_raw_name()?;
10540                CommentObjectType::Secret { name }
10541            }
10542            ROLE => {
10543                let name = self.parse_identifier()?;
10544                CommentObjectType::Role { name }
10545            }
10546            DATABASE => {
10547                let name = self.parse_database_name()?;
10548                CommentObjectType::Database { name }
10549            }
10550            SCHEMA => {
10551                let name = self.parse_schema_name()?;
10552                CommentObjectType::Schema { name }
10553            }
10554            CLUSTER => {
10555                if self.parse_keyword(REPLICA) {
10556                    let name = self.parse_cluster_replica_name()?;
10557                    CommentObjectType::ClusterReplica { name }
10558                } else {
10559                    let name = self.parse_raw_ident()?;
10560                    CommentObjectType::Cluster { name }
10561                }
10562            }
10563            COLUMN => {
10564                let name = self.parse_column_name()?;
10565                CommentObjectType::Column { name }
10566            }
10567            NETWORK => {
10568                self.expect_keyword(POLICY)?;
10569                let name = self.parse_raw_network_policy_name()?;
10570                CommentObjectType::NetworkPolicy { name }
10571            }
10572            _ => unreachable!(),
10573        };
10574
10575        self.expect_keyword(IS)?;
10576        let comment = match self.next_token() {
10577            Some(Token::Keyword(NULL)) => None,
10578            Some(Token::String(s)) => Some(s),
10579            other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10580        };
10581
10582        Ok(Statement::Comment(CommentStatement { object, comment }))
10583    }
10584
10585    pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10586    where
10587        S: TryInto<IdentString>,
10588        <S as TryInto<IdentString>>::Error: fmt::Display,
10589    {
10590        Ident::new(s).map_err(|e| ParserError {
10591            pos: self.peek_prev_pos(),
10592            message: e.to_string(),
10593        })
10594    }
10595}
10596
10597impl CheckedRecursion for Parser<'_> {
10598    fn recursion_guard(&self) -> &RecursionGuard {
10599        &self.recursion_guard
10600    }
10601}
10602
10603/// Represents an expression or query (a "fragment") with parentheses around it,
10604/// when it is unknown whether the fragment belongs to a larger expression or
10605/// query.
10606enum ParenthesizedFragment {
10607    Query(Query<Raw>),
10608    Exprs(Vec<Expr<Raw>>),
10609}
10610
10611impl ParenthesizedFragment {
10612    /// Force the fragment into an expression.
10613    fn into_expr(self) -> Expr<Raw> {
10614        match self {
10615            ParenthesizedFragment::Exprs(exprs) => {
10616                // The `ParenthesizedFragment` represents that there were
10617                // parentheses surrounding `exprs`, so...
10618                if exprs.len() == 1 {
10619                    // ...if there was only one expression, the parentheses
10620                    // were simple nesting...
10621                    Expr::Nested(Box::new(exprs.into_element()))
10622                } else {
10623                    // ...and if there were multiple expressions, the
10624                    // parentheses formed an implicit row constructor.
10625                    Expr::Row { exprs }
10626                }
10627            }
10628            // Queries become subquery expressions.
10629            ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10630        }
10631    }
10632}
10633
10634// Include the `Parser::parse_~` implementations for simple options derived by
10635// the crate's build.rs script.
10636include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));