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