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