Skip to main content

mz_sql_parser/
parser.rs

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