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