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