Skip to main content

mz_sql_parser/
parser.rs

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