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