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