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