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