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        self.expect_keyword(TABLE)?;
5161        let if_not_exists = self.parse_if_not_exists()?;
5162        let table_name = self.parse_item_name()?;
5163
5164        if self.parse_keywords(&[FROM, WEBHOOK]) {
5165            // Webhook Source, which works differently than all other sources.
5166            return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5167        }
5168
5169        let (columns, constraints) = self.parse_table_from_source_columns()?;
5170
5171        self.expect_keywords(&[FROM, SOURCE])?;
5172
5173        let source = self.parse_raw_name()?;
5174
5175        let external_reference = if self.consume_token(&Token::LParen) {
5176            self.expect_keyword(REFERENCE)?;
5177            let _ = self.consume_token(&Token::Eq);
5178            let external_reference = self.parse_item_name()?;
5179            self.expect_token(&Token::RParen)?;
5180            Some(external_reference)
5181        } else {
5182            None
5183        };
5184
5185        let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5186            Some(KEY) => {
5187                self.expect_keyword(FORMAT)?;
5188                let key = self.parse_format()?;
5189                self.expect_keywords(&[VALUE, FORMAT])?;
5190                let value = self.parse_format()?;
5191                Some(FormatSpecifier::KeyValue { key, value })
5192            }
5193            Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5194            Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5195            None => None,
5196        };
5197        let include_metadata = self.parse_source_include_metadata()?;
5198
5199        let envelope = if self.parse_keyword(ENVELOPE) {
5200            Some(self.parse_source_envelope()?)
5201        } else {
5202            None
5203        };
5204
5205        let with_options = if self.parse_keyword(WITH) {
5206            self.expect_token(&Token::LParen)?;
5207            let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5208            self.expect_token(&Token::RParen)?;
5209            options
5210        } else {
5211            vec![]
5212        };
5213
5214        Ok(Statement::CreateTableFromSource(
5215            CreateTableFromSourceStatement {
5216                name: table_name,
5217                columns,
5218                constraints,
5219                if_not_exists,
5220                source,
5221                external_reference,
5222                format,
5223                include_metadata,
5224                envelope,
5225                with_options,
5226            },
5227        ))
5228    }
5229
5230    fn parse_table_from_source_option(
5231        &mut self,
5232    ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5233        let option = match self
5234            .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5235        {
5236            ref keyword @ (TEXT | EXCLUDE) => {
5237                self.expect_keyword(COLUMNS)?;
5238
5239                let _ = self.consume_token(&Token::Eq);
5240
5241                let value = self
5242                    .parse_option_sequence(Parser::parse_identifier)?
5243                    .map(|inner| {
5244                        WithOptionValue::Sequence(
5245                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5246                        )
5247                    });
5248
5249                TableFromSourceOption {
5250                    name: match *keyword {
5251                        TEXT => TableFromSourceOptionName::TextColumns,
5252                        EXCLUDE => TableFromSourceOptionName::ExcludeColumns,
5253                        _ => unreachable!(),
5254                    },
5255                    value,
5256                }
5257            }
5258            DETAILS => TableFromSourceOption {
5259                name: TableFromSourceOptionName::Details,
5260                value: self.parse_optional_option_value()?,
5261            },
5262            IGNORE => {
5263                self.expect_keyword(COLUMNS)?;
5264                let _ = self.consume_token(&Token::Eq);
5265
5266                let value = self
5267                    .parse_option_sequence(Parser::parse_identifier)?
5268                    .map(|inner| {
5269                        WithOptionValue::Sequence(
5270                            inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5271                        )
5272                    });
5273                TableFromSourceOption {
5274                    // IGNORE is historical syntax for this option.
5275                    name: TableFromSourceOptionName::ExcludeColumns,
5276                    value,
5277                }
5278            }
5279            PARTITION => {
5280                self.expect_keyword(BY)?;
5281                TableFromSourceOption {
5282                    name: TableFromSourceOptionName::PartitionBy,
5283                    value: self.parse_optional_option_value()?,
5284                }
5285            }
5286            RETAIN => {
5287                self.expect_keyword(HISTORY)?;
5288                TableFromSourceOption {
5289                    name: TableFromSourceOptionName::RetainHistory,
5290                    value: self.parse_option_retain_history()?,
5291                }
5292            }
5293            _ => unreachable!(),
5294        };
5295        Ok(option)
5296    }
5297
5298    fn parse_table_from_source_columns(
5299        &mut self,
5300    ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5301        let mut constraints = vec![];
5302
5303        if !self.consume_token(&Token::LParen) {
5304            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5305        }
5306        if self.consume_token(&Token::RParen) {
5307            // Tables with zero columns are a PostgreSQL extension.
5308            return Ok((TableFromSourceColumns::NotSpecified, constraints));
5309        }
5310
5311        let mut column_names = vec![];
5312        let mut column_defs = vec![];
5313        loop {
5314            if let Some(constraint) = self.parse_optional_table_constraint()? {
5315                constraints.push(constraint);
5316            } else if let Some(column_name) = self.consume_identifier()? {
5317                let next_token = self.peek_token();
5318                match next_token {
5319                    Some(Token::Comma) | Some(Token::RParen) => {
5320                        column_names.push(column_name);
5321                    }
5322                    _ => {
5323                        let data_type = self.parse_data_type()?;
5324                        let collation = if self.parse_keyword(COLLATE) {
5325                            Some(self.parse_item_name()?)
5326                        } else {
5327                            None
5328                        };
5329                        let mut options = vec![];
5330                        loop {
5331                            match self.peek_token() {
5332                                None | Some(Token::Comma) | Some(Token::RParen) => break,
5333                                _ => options.push(self.parse_column_option_def()?),
5334                            }
5335                        }
5336
5337                        column_defs.push(ColumnDef {
5338                            name: column_name,
5339                            data_type,
5340                            collation,
5341                            options,
5342                        });
5343                    }
5344                }
5345            } else {
5346                return self.expected(
5347                    self.peek_pos(),
5348                    "column name or constraint definition",
5349                    self.peek_token(),
5350                );
5351            }
5352            if self.consume_token(&Token::Comma) {
5353                // Continue.
5354            } else if self.consume_token(&Token::RParen) {
5355                break;
5356            } else {
5357                return self.expected(
5358                    self.peek_pos(),
5359                    "',' or ')' after column definition",
5360                    self.peek_token(),
5361                );
5362            }
5363        }
5364        if !column_defs.is_empty() && !column_names.is_empty() {
5365            return parser_err!(
5366                self,
5367                self.peek_prev_pos(),
5368                "cannot mix column definitions and column names"
5369            );
5370        }
5371
5372        let columns = match column_defs.is_empty() {
5373            true => match column_names.is_empty() {
5374                true => TableFromSourceColumns::NotSpecified,
5375                false => TableFromSourceColumns::Named(column_names),
5376            },
5377            false => TableFromSourceColumns::Defined(column_defs),
5378        };
5379
5380        Ok((columns, constraints))
5381    }
5382
5383    fn parse_columns(
5384        &mut self,
5385        optional: IsOptional,
5386    ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5387        let mut columns = vec![];
5388        let mut constraints = vec![];
5389
5390        if !self.consume_token(&Token::LParen) {
5391            if optional == Optional {
5392                return Ok((columns, constraints));
5393            } else {
5394                return self.expected(
5395                    self.peek_pos(),
5396                    "a list of columns in parentheses",
5397                    self.peek_token(),
5398                );
5399            }
5400        }
5401        if self.consume_token(&Token::RParen) {
5402            // Tables with zero columns are a PostgreSQL extension.
5403            return Ok((columns, constraints));
5404        }
5405
5406        loop {
5407            if let Some(constraint) = self.parse_optional_table_constraint()? {
5408                constraints.push(constraint);
5409            } else if let Some(column_name) = self.consume_identifier()? {
5410                let data_type = self.parse_data_type()?;
5411                let collation = if self.parse_keyword(COLLATE) {
5412                    Some(self.parse_item_name()?)
5413                } else {
5414                    None
5415                };
5416                let mut options = vec![];
5417                loop {
5418                    match self.peek_token() {
5419                        None | Some(Token::Comma) | Some(Token::RParen) => break,
5420                        _ => options.push(self.parse_column_option_def()?),
5421                    }
5422                }
5423
5424                columns.push(ColumnDef {
5425                    name: column_name,
5426                    data_type,
5427                    collation,
5428                    options,
5429                });
5430            } else {
5431                return self.expected(
5432                    self.peek_pos(),
5433                    "column name or constraint definition",
5434                    self.peek_token(),
5435                );
5436            }
5437            if self.consume_token(&Token::Comma) {
5438                // Continue.
5439            } else if self.consume_token(&Token::RParen) {
5440                break;
5441            } else {
5442                return self.expected(
5443                    self.peek_pos(),
5444                    "',' or ')' after column definition",
5445                    self.peek_token(),
5446                );
5447            }
5448        }
5449
5450        Ok((columns, constraints))
5451    }
5452
5453    fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5454        let name = if self.parse_keyword(CONSTRAINT) {
5455            Some(self.parse_identifier()?)
5456        } else {
5457            None
5458        };
5459
5460        let option = if self.parse_keywords(&[NOT, NULL]) {
5461            ColumnOption::NotNull
5462        } else if self.parse_keyword(NULL) {
5463            ColumnOption::Null
5464        } else if self.parse_keyword(DEFAULT) {
5465            ColumnOption::Default(self.parse_expr()?)
5466        } else if self.parse_keywords(&[PRIMARY, KEY]) {
5467            ColumnOption::Unique { is_primary: true }
5468        } else if self.parse_keyword(UNIQUE) {
5469            ColumnOption::Unique { is_primary: false }
5470        } else if self.parse_keyword(REFERENCES) {
5471            let foreign_table = self.parse_item_name()?;
5472            let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5473            ColumnOption::ForeignKey {
5474                foreign_table,
5475                referred_columns,
5476            }
5477        } else if self.parse_keyword(CHECK) {
5478            self.expect_token(&Token::LParen)?;
5479            let expr = self.parse_expr()?;
5480            self.expect_token(&Token::RParen)?;
5481            ColumnOption::Check(expr)
5482        } else if self.parse_keyword(VERSION) {
5483            self.expect_keyword(ADDED)?;
5484            let action = ColumnVersioned::Added;
5485            let version = self.parse_version()?;
5486
5487            ColumnOption::Versioned { action, version }
5488        } else {
5489            return self.expected(self.peek_pos(), "column option", self.peek_token());
5490        };
5491
5492        Ok(ColumnOptionDef { name, option })
5493    }
5494
5495    fn parse_optional_table_constraint(
5496        &mut self,
5497    ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5498        let name = if self.parse_keyword(CONSTRAINT) {
5499            Some(self.parse_identifier()?)
5500        } else {
5501            None
5502        };
5503        match self.next_token() {
5504            Some(Token::Keyword(PRIMARY)) => {
5505                self.expect_keyword(KEY)?;
5506                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5507                Ok(Some(TableConstraint::Unique {
5508                    name,
5509                    columns,
5510                    is_primary: true,
5511                    nulls_not_distinct: false,
5512                }))
5513            }
5514            Some(Token::Keyword(UNIQUE)) => {
5515                let nulls_not_distinct = if self.parse_keyword(NULLS) {
5516                    self.expect_keywords(&[NOT, DISTINCT])?;
5517                    true
5518                } else {
5519                    false
5520                };
5521
5522                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5523                Ok(Some(TableConstraint::Unique {
5524                    name,
5525                    columns,
5526                    is_primary: false,
5527                    nulls_not_distinct,
5528                }))
5529            }
5530            Some(Token::Keyword(FOREIGN)) => {
5531                self.expect_keyword(KEY)?;
5532                let columns = self.parse_parenthesized_column_list(Mandatory)?;
5533                self.expect_keyword(REFERENCES)?;
5534                let foreign_table = self.parse_raw_name()?;
5535                let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5536                Ok(Some(TableConstraint::ForeignKey {
5537                    name,
5538                    columns,
5539                    foreign_table,
5540                    referred_columns,
5541                }))
5542            }
5543            Some(Token::Keyword(CHECK)) => {
5544                self.expect_token(&Token::LParen)?;
5545                let expr = Box::new(self.parse_expr()?);
5546                self.expect_token(&Token::RParen)?;
5547                Ok(Some(TableConstraint::Check { name, expr }))
5548            }
5549            unexpected => {
5550                if name.is_some() {
5551                    self.expected(
5552                        self.peek_prev_pos(),
5553                        "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5554                        unexpected,
5555                    )
5556                } else {
5557                    self.prev_token();
5558                    Ok(None)
5559                }
5560            }
5561        }
5562    }
5563
5564    fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5565        let _ = self.consume_token(&Token::Eq);
5566        Ok(WithOptionValue::Item(self.parse_raw_name()?))
5567    }
5568
5569    fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5570        // The next token might be a value and might not. The only valid things
5571        // that indicate no value would be `)` for end-of-options , `,` for
5572        // another-option, or ';'/nothing for end-of-statement. Either of those
5573        // means there's no value, anything else means we expect a valid value.
5574        match self.peek_token() {
5575            Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5576            _ => {
5577                let _ = self.consume_token(&Token::Eq);
5578                Ok(Some(self.parse_option_value()?))
5579            }
5580        }
5581    }
5582
5583    fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5584    where
5585        F: FnMut(&mut Self) -> Result<T, ParserError>,
5586    {
5587        Ok(if self.consume_token(&Token::LParen) {
5588            let options = if self.consume_token(&Token::RParen) {
5589                vec![]
5590            } else {
5591                let options = self.parse_comma_separated(f)?;
5592                self.expect_token(&Token::RParen)?;
5593                options
5594            };
5595
5596            Some(options)
5597        } else if self.consume_token(&Token::LBracket) {
5598            let options = if self.consume_token(&Token::RBracket) {
5599                vec![]
5600            } else {
5601                let options = self.parse_comma_separated(f)?;
5602
5603                self.expect_token(&Token::RBracket)?;
5604                options
5605            };
5606
5607            Some(options)
5608        } else {
5609            None
5610        })
5611    }
5612
5613    fn parse_option_map(
5614        &mut self,
5615    ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5616        Ok(if self.parse_keyword(MAP) {
5617            self.expect_token(&Token::LBracket)?;
5618            let mut map = BTreeMap::new();
5619            loop {
5620                if let Some(Token::RBracket) = self.peek_token() {
5621                    break;
5622                }
5623                let key = match self.next_token() {
5624                    Some(Token::String(s)) => s,
5625                    token => return self.expected(self.peek_pos(), "string", token),
5626                };
5627                self.expect_token(&Token::Arrow)?;
5628                let value = Parser::parse_option_value(self)?;
5629                map.insert(key, value);
5630                if !self.consume_token(&Token::Comma) {
5631                    break;
5632                }
5633            }
5634            self.expect_token(&Token::RBracket)?;
5635            Some(map)
5636        } else {
5637            None
5638        })
5639    }
5640
5641    fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5642        if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5643            Ok(WithOptionValue::Sequence(seq))
5644        } else if let Some(map) = self.parse_option_map()? {
5645            Ok(WithOptionValue::Map(map))
5646        } else if self.parse_keyword(SECRET) {
5647            if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5648                Ok(WithOptionValue::Secret(secret))
5649            } else {
5650                Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5651                    vec![ident!("secret")],
5652                )))
5653            }
5654        } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5655            Ok(WithOptionValue::Value(value))
5656        } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5657            Ok(WithOptionValue::UnresolvedItemName(item_name))
5658        } else {
5659            self.expected(self.peek_pos(), "option value", self.peek_token())
5660        }
5661    }
5662
5663    fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5664        let _ = self.consume_token(&Token::Eq);
5665        Ok(WithOptionValue::DataType(self.parse_data_type()?))
5666    }
5667
5668    fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5669        if self.parse_keyword(SYSTEM) {
5670            self.parse_alter_system()
5671        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5672            self.parse_alter_default_privileges()
5673                .map_parser_err(StatementKind::AlterDefaultPrivileges)
5674        } else {
5675            self.parse_alter_object()
5676        }
5677    }
5678
5679    fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5680        let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5681
5682        match object_type {
5683            ObjectType::Role => self
5684                .parse_alter_role()
5685                .map_parser_err(StatementKind::AlterRole),
5686            ObjectType::Sink => self.parse_alter_sink(),
5687            ObjectType::Source => self.parse_alter_source(),
5688            ObjectType::Index => self.parse_alter_index(),
5689            ObjectType::Secret => self.parse_alter_secret(),
5690            ObjectType::Connection => self.parse_alter_connection(),
5691            ObjectType::View
5692            | ObjectType::MaterializedView
5693            | ObjectType::Table
5694            | ObjectType::ContinualTask => self.parse_alter_views(object_type),
5695            ObjectType::Type => {
5696                let if_exists = self
5697                    .parse_if_exists()
5698                    .map_parser_err(StatementKind::AlterOwner)?;
5699                let name = UnresolvedObjectName::Item(
5700                    self.parse_item_name()
5701                        .map_parser_err(StatementKind::AlterOwner)?,
5702                );
5703                self.expect_keywords(&[OWNER, TO])
5704                    .map_parser_err(StatementKind::AlterOwner)?;
5705                let new_owner = self
5706                    .parse_identifier()
5707                    .map_parser_err(StatementKind::AlterOwner)?;
5708                Ok(Statement::AlterOwner(AlterOwnerStatement {
5709                    object_type,
5710                    if_exists,
5711                    name,
5712                    new_owner,
5713                }))
5714            }
5715            ObjectType::Cluster => self.parse_alter_cluster(object_type),
5716            ObjectType::ClusterReplica => {
5717                let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5718                let name = UnresolvedObjectName::ClusterReplica(
5719                    self.parse_cluster_replica_name()
5720                        .map_no_statement_parser_err()?,
5721                );
5722                let action = self
5723                    .expect_one_of_keywords(&[OWNER, RENAME])
5724                    .map_no_statement_parser_err()?;
5725                self.expect_keyword(TO).map_no_statement_parser_err()?;
5726                match action {
5727                    OWNER => {
5728                        let new_owner = self
5729                            .parse_identifier()
5730                            .map_parser_err(StatementKind::AlterOwner)?;
5731                        Ok(Statement::AlterOwner(AlterOwnerStatement {
5732                            object_type,
5733                            if_exists,
5734                            name,
5735                            new_owner,
5736                        }))
5737                    }
5738                    RENAME => {
5739                        let to_item_name = self
5740                            .parse_identifier()
5741                            .map_parser_err(StatementKind::AlterObjectRename)?;
5742                        Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5743                            object_type,
5744                            if_exists,
5745                            name,
5746                            to_item_name,
5747                        }))
5748                    }
5749                    _ => unreachable!(),
5750                }
5751            }
5752            ObjectType::Database => {
5753                let if_exists = self
5754                    .parse_if_exists()
5755                    .map_parser_err(StatementKind::AlterOwner)?;
5756                let name = UnresolvedObjectName::Database(
5757                    self.parse_database_name()
5758                        .map_parser_err(StatementKind::AlterOwner)?,
5759                );
5760                self.expect_keywords(&[OWNER, TO])
5761                    .map_parser_err(StatementKind::AlterOwner)?;
5762                let new_owner = self
5763                    .parse_identifier()
5764                    .map_parser_err(StatementKind::AlterOwner)?;
5765                Ok(Statement::AlterOwner(AlterOwnerStatement {
5766                    object_type,
5767                    if_exists,
5768                    name,
5769                    new_owner,
5770                }))
5771            }
5772            ObjectType::Schema => self.parse_alter_schema(object_type),
5773            ObjectType::NetworkPolicy => self
5774                .parse_alter_network_policy()
5775                .map_parser_err(StatementKind::AlterNetworkPolicy),
5776            ObjectType::Func | ObjectType::Subsource => parser_err!(
5777                self,
5778                self.peek_prev_pos(),
5779                format!("Unsupported ALTER on {object_type}")
5780            )
5781            .map_no_statement_parser_err(),
5782        }
5783    }
5784
5785    fn parse_alter_cluster(
5786        &mut self,
5787        object_type: ObjectType,
5788    ) -> Result<Statement<Raw>, ParserStatementError> {
5789        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5790        let name = self.parse_identifier().map_no_statement_parser_err()?;
5791        let action = self
5792            .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
5793            .map_no_statement_parser_err()?;
5794        match action {
5795            OWNER => {
5796                self.expect_keyword(TO)
5797                    .map_parser_err(StatementKind::AlterOwner)?;
5798                let new_owner = self
5799                    .parse_identifier()
5800                    .map_parser_err(StatementKind::AlterOwner)?;
5801                let name = UnresolvedObjectName::Cluster(name);
5802                Ok(Statement::AlterOwner(AlterOwnerStatement {
5803                    object_type,
5804                    if_exists,
5805                    name,
5806                    new_owner,
5807                }))
5808            }
5809            RENAME => {
5810                self.expect_keyword(TO)
5811                    .map_parser_err(StatementKind::AlterObjectRename)?;
5812                let to_item_name = self
5813                    .parse_identifier()
5814                    .map_parser_err(StatementKind::AlterObjectRename)?;
5815                let name = UnresolvedObjectName::Cluster(name);
5816                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5817                    object_type,
5818                    if_exists,
5819                    name,
5820                    to_item_name,
5821                }))
5822            }
5823            RESET => {
5824                self.expect_token(&Token::LParen)
5825                    .map_parser_err(StatementKind::AlterCluster)?;
5826                let names = self
5827                    .parse_comma_separated(Parser::parse_cluster_option_name)
5828                    .map_parser_err(StatementKind::AlterCluster)?;
5829                self.expect_token(&Token::RParen)
5830                    .map_parser_err(StatementKind::AlterCluster)?;
5831                Ok(Statement::AlterCluster(AlterClusterStatement {
5832                    if_exists,
5833                    name,
5834                    action: AlterClusterAction::ResetOptions(names),
5835                }))
5836            }
5837            SET => {
5838                self.expect_token(&Token::LParen)
5839                    .map_parser_err(StatementKind::AlterCluster)?;
5840                let options = self
5841                    .parse_comma_separated(Parser::parse_cluster_option)
5842                    .map_parser_err(StatementKind::AlterCluster)?;
5843                self.expect_token(&Token::RParen)
5844                    .map_parser_err(StatementKind::AlterCluster)?;
5845                let with_options = if self.parse_keyword(WITH) {
5846                    self.expect_token(&Token::LParen)
5847                        .map_parser_err(StatementKind::AlterCluster)?;
5848                    let options = self
5849                        .parse_comma_separated(Parser::parse_alter_cluster_option)
5850                        .map_parser_err(StatementKind::AlterCluster)?;
5851                    self.expect_token(&Token::RParen)
5852                        .map_parser_err(StatementKind::AlterCluster)?;
5853                    options
5854                } else {
5855                    vec![]
5856                };
5857                Ok(Statement::AlterCluster(AlterClusterStatement {
5858                    if_exists,
5859                    name,
5860                    action: AlterClusterAction::SetOptions {
5861                        options,
5862                        with_options,
5863                    },
5864                }))
5865            }
5866            SWAP => {
5867                self.expect_keyword(WITH)
5868                    .map_parser_err(StatementKind::AlterObjectSwap)?;
5869                let name_b = self
5870                    .parse_identifier()
5871                    .map_parser_err(StatementKind::AlterObjectSwap)?;
5872
5873                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
5874                    object_type,
5875                    name_a: UnresolvedObjectName::Cluster(name),
5876                    name_b,
5877                }))
5878            }
5879            _ => unreachable!(),
5880        }
5881    }
5882
5883    fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5884        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5885        let source_name = self.parse_item_name().map_no_statement_parser_err()?;
5886
5887        Ok(
5888            match self
5889                .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
5890                .map_no_statement_parser_err()?
5891            {
5892                ADD => {
5893                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5894                        .map_parser_err(StatementKind::AlterSource)?;
5895
5896                    // TODO: Add IF NOT EXISTS?
5897                    let subsources = self
5898                        .parse_comma_separated(Parser::parse_subsource_references)
5899                        .map_parser_err(StatementKind::AlterSource)?;
5900
5901                    let options = if self.parse_keyword(WITH) {
5902                        self.expect_token(&Token::LParen)
5903                            .map_parser_err(StatementKind::AlterSource)?;
5904                        let options = self
5905                            .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
5906                            .map_parser_err(StatementKind::AlterSource)?;
5907                        self.expect_token(&Token::RParen)
5908                            .map_parser_err(StatementKind::AlterSource)?;
5909                        options
5910                    } else {
5911                        vec![]
5912                    };
5913
5914                    Statement::AlterSource(AlterSourceStatement {
5915                        source_name,
5916                        if_exists,
5917                        action: AlterSourceAction::AddSubsources {
5918                            external_references: subsources,
5919                            options,
5920                        },
5921                    })
5922                }
5923                DROP => {
5924                    self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5925                        .map_parser_err(StatementKind::AlterSource)?;
5926
5927                    let if_exists_inner = self
5928                        .parse_if_exists()
5929                        .map_parser_err(StatementKind::AlterSource)?;
5930
5931                    let names = self
5932                        .parse_comma_separated(Parser::parse_item_name)
5933                        .map_parser_err(StatementKind::AlterSource)?;
5934
5935                    let cascade = matches!(
5936                        self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
5937                            .map_parser_err(StatementKind::AlterSource)?,
5938                        Some(CASCADE),
5939                    );
5940
5941                    Statement::AlterSource(AlterSourceStatement {
5942                        source_name,
5943                        if_exists,
5944                        action: AlterSourceAction::DropSubsources {
5945                            if_exists: if_exists_inner,
5946                            cascade,
5947                            names,
5948                        },
5949                    })
5950                }
5951                RESET => {
5952                    self.expect_token(&Token::LParen)
5953                        .map_parser_err(StatementKind::AlterSource)?;
5954                    let reset_options = self
5955                        .parse_comma_separated(Parser::parse_source_option_name)
5956                        .map_parser_err(StatementKind::AlterSource)?;
5957                    self.expect_token(&Token::RParen)
5958                        .map_parser_err(StatementKind::AlterSource)?;
5959
5960                    Statement::AlterSource(AlterSourceStatement {
5961                        source_name,
5962                        if_exists,
5963                        action: AlterSourceAction::ResetOptions(reset_options),
5964                    })
5965                }
5966                SET => {
5967                    if let Some(stmt) = self.maybe_parse_alter_set_cluster(
5968                        if_exists,
5969                        &source_name,
5970                        ObjectType::Source,
5971                    ) {
5972                        return stmt;
5973                    }
5974                    self.expect_token(&Token::LParen)
5975                        .map_parser_err(StatementKind::AlterSource)?;
5976                    let set_options = self
5977                        .parse_comma_separated(Parser::parse_source_option)
5978                        .map_parser_err(StatementKind::AlterSource)?;
5979                    self.expect_token(&Token::RParen)
5980                        .map_parser_err(StatementKind::AlterSource)?;
5981                    Statement::AlterSource(AlterSourceStatement {
5982                        source_name,
5983                        if_exists,
5984                        action: AlterSourceAction::SetOptions(set_options),
5985                    })
5986                }
5987                RENAME => {
5988                    self.expect_keyword(TO)
5989                        .map_parser_err(StatementKind::AlterObjectRename)?;
5990                    let to_item_name = self
5991                        .parse_identifier()
5992                        .map_parser_err(StatementKind::AlterObjectRename)?;
5993
5994                    Statement::AlterObjectRename(AlterObjectRenameStatement {
5995                        object_type: ObjectType::Source,
5996                        if_exists,
5997                        name: UnresolvedObjectName::Item(source_name),
5998                        to_item_name,
5999                    })
6000                }
6001                OWNER => {
6002                    self.expect_keyword(TO)
6003                        .map_parser_err(StatementKind::AlterOwner)?;
6004                    let new_owner = self
6005                        .parse_identifier()
6006                        .map_parser_err(StatementKind::AlterOwner)?;
6007
6008                    Statement::AlterOwner(AlterOwnerStatement {
6009                        object_type: ObjectType::Source,
6010                        if_exists,
6011                        name: UnresolvedObjectName::Item(source_name),
6012                        new_owner,
6013                    })
6014                }
6015                REFRESH => {
6016                    self.expect_keyword(REFERENCES)
6017                        .map_parser_err(StatementKind::AlterSource)?;
6018                    Statement::AlterSource(AlterSourceStatement {
6019                        source_name,
6020                        if_exists,
6021                        action: AlterSourceAction::RefreshReferences,
6022                    })
6023                }
6024                _ => unreachable!(),
6025            },
6026        )
6027    }
6028
6029    fn parse_alter_source_add_subsource_option(
6030        &mut self,
6031    ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6032        match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6033            ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6034                self.expect_keyword(COLUMNS)?;
6035
6036                let _ = self.consume_token(&Token::Eq);
6037
6038                let value = self
6039                    .parse_option_sequence(Parser::parse_item_name)?
6040                    .map(|inner| {
6041                        WithOptionValue::Sequence(
6042                            inner
6043                                .into_iter()
6044                                .map(WithOptionValue::UnresolvedItemName)
6045                                .collect_vec(),
6046                        )
6047                    });
6048
6049                Ok(AlterSourceAddSubsourceOption {
6050                    name: match *keyword {
6051                        TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6052                        // IGNORE is historical syntax for this option.
6053                        EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6054                        _ => unreachable!(),
6055                    },
6056                    value,
6057                })
6058            }
6059            _ => unreachable!(),
6060        }
6061    }
6062
6063    fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6064        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6065        let name = self.parse_item_name().map_no_statement_parser_err()?;
6066
6067        Ok(
6068            match self
6069                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6070                .map_no_statement_parser_err()?
6071            {
6072                RESET => {
6073                    self.expect_token(&Token::LParen)
6074                        .map_parser_err(StatementKind::AlterIndex)?;
6075                    let reset_options = self
6076                        .parse_comma_separated(Parser::parse_index_option_name)
6077                        .map_parser_err(StatementKind::AlterIndex)?;
6078                    self.expect_token(&Token::RParen)
6079                        .map_parser_err(StatementKind::AlterIndex)?;
6080
6081                    Statement::AlterIndex(AlterIndexStatement {
6082                        index_name: name,
6083                        if_exists,
6084                        action: AlterIndexAction::ResetOptions(reset_options),
6085                    })
6086                }
6087                SET => {
6088                    self.expect_token(&Token::LParen)
6089                        .map_parser_err(StatementKind::AlterIndex)?;
6090                    let set_options = self
6091                        .parse_comma_separated(Parser::parse_index_option)
6092                        .map_parser_err(StatementKind::AlterIndex)?;
6093                    self.expect_token(&Token::RParen)
6094                        .map_parser_err(StatementKind::AlterIndex)?;
6095                    Statement::AlterIndex(AlterIndexStatement {
6096                        index_name: name,
6097                        if_exists,
6098                        action: AlterIndexAction::SetOptions(set_options),
6099                    })
6100                }
6101                RENAME => {
6102                    self.expect_keyword(TO)
6103                        .map_parser_err(StatementKind::AlterObjectRename)?;
6104                    let to_item_name = self
6105                        .parse_identifier()
6106                        .map_parser_err(StatementKind::AlterObjectRename)?;
6107
6108                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6109                        object_type: ObjectType::Index,
6110                        if_exists,
6111                        name: UnresolvedObjectName::Item(name),
6112                        to_item_name,
6113                    })
6114                }
6115                OWNER => {
6116                    self.expect_keyword(TO)
6117                        .map_parser_err(StatementKind::AlterOwner)?;
6118                    let new_owner = self
6119                        .parse_identifier()
6120                        .map_parser_err(StatementKind::AlterOwner)?;
6121
6122                    Statement::AlterOwner(AlterOwnerStatement {
6123                        object_type: ObjectType::Index,
6124                        if_exists,
6125                        name: UnresolvedObjectName::Item(name),
6126                        new_owner,
6127                    })
6128                }
6129                _ => unreachable!(),
6130            },
6131        )
6132    }
6133
6134    fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6135        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6136        let name = self.parse_item_name().map_no_statement_parser_err()?;
6137
6138        Ok(
6139            match self
6140                .expect_one_of_keywords(&[AS, RENAME, OWNER])
6141                .map_no_statement_parser_err()?
6142            {
6143                AS => {
6144                    let value = self
6145                        .parse_expr()
6146                        .map_parser_err(StatementKind::AlterSecret)?;
6147                    Statement::AlterSecret(AlterSecretStatement {
6148                        name,
6149                        if_exists,
6150                        value,
6151                    })
6152                }
6153                RENAME => {
6154                    self.expect_keyword(TO)
6155                        .map_parser_err(StatementKind::AlterObjectRename)?;
6156                    let to_item_name = self
6157                        .parse_identifier()
6158                        .map_parser_err(StatementKind::AlterObjectRename)?;
6159
6160                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6161                        object_type: ObjectType::Secret,
6162                        if_exists,
6163                        name: UnresolvedObjectName::Item(name),
6164                        to_item_name,
6165                    })
6166                }
6167                OWNER => {
6168                    self.expect_keyword(TO)
6169                        .map_parser_err(StatementKind::AlterOwner)?;
6170                    let new_owner = self
6171                        .parse_identifier()
6172                        .map_parser_err(StatementKind::AlterOwner)?;
6173
6174                    Statement::AlterOwner(AlterOwnerStatement {
6175                        object_type: ObjectType::Secret,
6176                        if_exists,
6177                        name: UnresolvedObjectName::Item(name),
6178                        new_owner,
6179                    })
6180                }
6181                _ => unreachable!(),
6182            },
6183        )
6184    }
6185
6186    /// Parse an ALTER SINK statement.
6187    fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6188        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6189        let name = self.parse_item_name().map_no_statement_parser_err()?;
6190
6191        Ok(
6192            match self
6193                .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6194                .map_no_statement_parser_err()?
6195            {
6196                RESET => {
6197                    self.expect_token(&Token::LParen)
6198                        .map_parser_err(StatementKind::AlterSink)?;
6199                    let reset_options = self
6200                        .parse_comma_separated(Parser::parse_create_sink_option_name)
6201                        .map_parser_err(StatementKind::AlterSink)?;
6202                    self.expect_token(&Token::RParen)
6203                        .map_parser_err(StatementKind::AlterSink)?;
6204
6205                    Statement::AlterSink(AlterSinkStatement {
6206                        sink_name: name,
6207                        if_exists,
6208                        action: AlterSinkAction::ResetOptions(reset_options),
6209                    })
6210                }
6211                SET => {
6212                    if let Some(result) =
6213                        self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6214                    {
6215                        return result;
6216                    }
6217
6218                    if self.parse_keyword(FROM) {
6219                        let from = self
6220                            .parse_raw_name()
6221                            .map_parser_err(StatementKind::AlterSink)?;
6222
6223                        Statement::AlterSink(AlterSinkStatement {
6224                            sink_name: name,
6225                            if_exists,
6226                            action: AlterSinkAction::ChangeRelation(from),
6227                        })
6228                    } else {
6229                        self.expect_token(&Token::LParen)
6230                            .map_parser_err(StatementKind::AlterSink)?;
6231                        let set_options = self
6232                            .parse_comma_separated(Parser::parse_create_sink_option)
6233                            .map_parser_err(StatementKind::AlterSink)?;
6234                        self.expect_token(&Token::RParen)
6235                            .map_parser_err(StatementKind::AlterSink)?;
6236                        Statement::AlterSink(AlterSinkStatement {
6237                            sink_name: name,
6238                            if_exists,
6239                            action: AlterSinkAction::SetOptions(set_options),
6240                        })
6241                    }
6242                }
6243                RENAME => {
6244                    self.expect_keyword(TO)
6245                        .map_parser_err(StatementKind::AlterObjectRename)?;
6246                    let to_item_name = self
6247                        .parse_identifier()
6248                        .map_parser_err(StatementKind::AlterObjectRename)?;
6249
6250                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6251                        object_type: ObjectType::Sink,
6252                        if_exists,
6253                        name: UnresolvedObjectName::Item(name),
6254                        to_item_name,
6255                    })
6256                }
6257                OWNER => {
6258                    self.expect_keyword(TO)
6259                        .map_parser_err(StatementKind::AlterOwner)?;
6260                    let new_owner = self
6261                        .parse_identifier()
6262                        .map_parser_err(StatementKind::AlterOwner)?;
6263
6264                    Statement::AlterOwner(AlterOwnerStatement {
6265                        object_type: ObjectType::Sink,
6266                        if_exists,
6267                        name: UnresolvedObjectName::Item(name),
6268                        new_owner,
6269                    })
6270                }
6271                _ => unreachable!(),
6272            },
6273        )
6274    }
6275
6276    /// Parse an ALTER SYSTEM statement.
6277    fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6278        match self
6279            .expect_one_of_keywords(&[SET, RESET])
6280            .map_no_statement_parser_err()?
6281        {
6282            SET => {
6283                let name = self
6284                    .parse_identifier()
6285                    .map_parser_err(StatementKind::AlterSystemSet)?;
6286                self.expect_keyword_or_token(TO, &Token::Eq)
6287                    .map_parser_err(StatementKind::AlterSystemSet)?;
6288                let to = self
6289                    .parse_set_variable_to()
6290                    .map_parser_err(StatementKind::AlterSystemSet)?;
6291                Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6292                    name,
6293                    to,
6294                }))
6295            }
6296            RESET => {
6297                if self.parse_keyword(ALL) {
6298                    Ok(Statement::AlterSystemResetAll(
6299                        AlterSystemResetAllStatement {},
6300                    ))
6301                } else {
6302                    let name = self
6303                        .parse_identifier()
6304                        .map_parser_err(StatementKind::AlterSystemReset)?;
6305                    Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6306                        name,
6307                    }))
6308                }
6309            }
6310            _ => unreachable!(),
6311        }
6312    }
6313
6314    fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6315        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6316        let name = self.parse_item_name().map_no_statement_parser_err()?;
6317
6318        Ok(
6319            match self
6320                .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6321                .map_no_statement_parser_err()?
6322            {
6323                RENAME => {
6324                    self.expect_keyword(TO)
6325                        .map_parser_err(StatementKind::AlterObjectRename)?;
6326                    let to_item_name = self
6327                        .parse_identifier()
6328                        .map_parser_err(StatementKind::AlterObjectRename)?;
6329
6330                    Statement::AlterObjectRename(AlterObjectRenameStatement {
6331                        object_type: ObjectType::Connection,
6332                        if_exists,
6333                        name: UnresolvedObjectName::Item(name),
6334                        to_item_name,
6335                    })
6336                }
6337                OWNER => {
6338                    self.expect_keyword(TO)
6339                        .map_parser_err(StatementKind::AlterOwner)?;
6340                    let new_owner = self
6341                        .parse_identifier()
6342                        .map_parser_err(StatementKind::AlterOwner)?;
6343
6344                    Statement::AlterOwner(AlterOwnerStatement {
6345                        object_type: ObjectType::Connection,
6346                        if_exists,
6347                        name: UnresolvedObjectName::Item(name),
6348                        new_owner,
6349                    })
6350                }
6351                _ => {
6352                    self.prev_token();
6353                    let actions = self
6354                        .parse_comma_separated(Parser::parse_alter_connection_action)
6355                        .map_parser_err(StatementKind::AlterConnection)?;
6356
6357                    let with_options = if self.parse_keyword(WITH) {
6358                        self.expect_token(&Token::LParen)
6359                            .map_parser_err(StatementKind::AlterConnection)?;
6360                        let options = self
6361                            .parse_comma_separated(Parser::parse_alter_connection_option)
6362                            .map_parser_err(StatementKind::AlterConnection)?;
6363                        self.expect_token(&Token::RParen)
6364                            .map_parser_err(StatementKind::AlterConnection)?;
6365                        options
6366                    } else {
6367                        vec![]
6368                    };
6369
6370                    Statement::AlterConnection(AlterConnectionStatement {
6371                        name,
6372                        if_exists,
6373                        actions,
6374                        with_options,
6375                    })
6376                }
6377            },
6378        )
6379    }
6380
6381    fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6382        let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6383            ROTATE => {
6384                self.expect_keyword(KEYS)?;
6385                AlterConnectionAction::RotateKeys
6386            }
6387            SET => {
6388                self.expect_token(&Token::LParen)?;
6389                let option = self.parse_connection_option_unified()?;
6390                self.expect_token(&Token::RParen)?;
6391                AlterConnectionAction::SetOption(option)
6392            }
6393            DROP | RESET => {
6394                self.expect_token(&Token::LParen)?;
6395                let option = self.parse_connection_option_name()?;
6396                self.expect_token(&Token::RParen)?;
6397                AlterConnectionAction::DropOption(option)
6398            }
6399            _ => unreachable!(),
6400        };
6401
6402        Ok(r)
6403    }
6404
6405    /// Parses a single valid option in the WITH block of a create source
6406    fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6407        let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6408            VALIDATE => AlterConnectionOptionName::Validate,
6409            _ => unreachable!(),
6410        };
6411
6412        Ok(AlterConnectionOption {
6413            name,
6414            value: self.parse_optional_option_value()?,
6415        })
6416    }
6417
6418    fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6419        let name = self.parse_identifier()?;
6420
6421        let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6422            Some(SET) => {
6423                let name = self.parse_identifier()?;
6424                self.expect_keyword_or_token(TO, &Token::Eq)?;
6425                let value = self.parse_set_variable_to()?;
6426                let var = SetRoleVar::Set { name, value };
6427                AlterRoleOption::Variable(var)
6428            }
6429            Some(RESET) => {
6430                let name = self.parse_identifier()?;
6431                let var = SetRoleVar::Reset { name };
6432                AlterRoleOption::Variable(var)
6433            }
6434            Some(WITH) | None => {
6435                let _ = self.parse_keyword(WITH);
6436                let attrs = self.parse_role_attributes()?;
6437                AlterRoleOption::Attributes(attrs)
6438            }
6439            Some(k) => unreachable!("unmatched keyword: {k}"),
6440        };
6441
6442        Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6443    }
6444
6445    fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6446        self.expect_keyword(FOR)?;
6447        let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6448            ROLE | USER => TargetRoleSpecification::Roles(
6449                self.parse_comma_separated(Parser::parse_identifier)?,
6450            ),
6451            ALL => {
6452                self.expect_keyword(ROLES)?;
6453                TargetRoleSpecification::AllRoles
6454            }
6455            _ => unreachable!(),
6456        };
6457        let target_objects = if self.parse_keyword(IN) {
6458            match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6459                SCHEMA => GrantTargetAllSpecification::AllSchemas {
6460                    schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6461                },
6462                DATABASE => GrantTargetAllSpecification::AllDatabases {
6463                    databases: self.parse_comma_separated(Parser::parse_database_name)?,
6464                },
6465                _ => unreachable!(),
6466            }
6467        } else {
6468            GrantTargetAllSpecification::All
6469        };
6470        let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6471        let privileges = self.parse_privilege_specification().ok_or_else(|| {
6472            self.expected::<_, PrivilegeSpecification>(
6473                self.peek_pos(),
6474                "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6475                self.peek_token(),
6476            )
6477            .expect_err("only returns errors")
6478        })?;
6479        self.expect_keyword(ON)?;
6480        let object_type =
6481            self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6482        if is_grant {
6483            self.expect_keyword(TO)?;
6484        } else {
6485            self.expect_keyword(FROM)?;
6486        }
6487        let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6488
6489        let grant_or_revoke = if is_grant {
6490            AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6491                privileges,
6492                object_type,
6493                grantees,
6494            })
6495        } else {
6496            AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6497                privileges,
6498                object_type,
6499                revokees: grantees,
6500            })
6501        };
6502
6503        Ok(Statement::AlterDefaultPrivileges(
6504            AlterDefaultPrivilegesStatement {
6505                target_roles,
6506                target_objects,
6507                grant_or_revoke,
6508            },
6509        ))
6510    }
6511
6512    fn parse_alter_views(
6513        &mut self,
6514        object_type: ObjectType,
6515    ) -> Result<Statement<Raw>, ParserStatementError> {
6516        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6517        let name = self.parse_item_name().map_no_statement_parser_err()?;
6518        let keywords: &[_] = match object_type {
6519            ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6520            ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6521            ObjectType::View | ObjectType::ContinualTask => &[SET, RENAME, OWNER, RESET],
6522            ObjectType::Source
6523            | ObjectType::Sink
6524            | ObjectType::Index
6525            | ObjectType::Type
6526            | ObjectType::Role
6527            | ObjectType::Cluster
6528            | ObjectType::ClusterReplica
6529            | ObjectType::Secret
6530            | ObjectType::Connection
6531            | ObjectType::Database
6532            | ObjectType::Schema
6533            | ObjectType::Func
6534            | ObjectType::Subsource
6535            | ObjectType::NetworkPolicy => {
6536                unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6537            }
6538        };
6539
6540        let action = self
6541            .expect_one_of_keywords(keywords)
6542            .map_no_statement_parser_err()?;
6543        match action {
6544            RENAME => {
6545                self.expect_keyword(TO).map_no_statement_parser_err()?;
6546                let to_item_name = self
6547                    .parse_identifier()
6548                    .map_parser_err(StatementKind::AlterObjectRename)?;
6549                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6550                    object_type,
6551                    if_exists,
6552                    name: UnresolvedObjectName::Item(name),
6553                    to_item_name,
6554                }))
6555            }
6556            SET => {
6557                if self.parse_keyword(CLUSTER) {
6558                    self.parse_alter_set_cluster(if_exists, name, object_type)
6559                } else {
6560                    self.expect_token(&Token::LParen)
6561                        .map_no_statement_parser_err()?;
6562                    self.expect_keywords(&[RETAIN, HISTORY])
6563                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6564                    let history = self
6565                        .parse_retain_history()
6566                        .map_parser_err(StatementKind::AlterRetainHistory)?;
6567                    self.expect_token(&Token::RParen)
6568                        .map_parser_err(StatementKind::AlterCluster)?;
6569                    Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6570                        object_type,
6571                        if_exists,
6572                        name: UnresolvedObjectName::Item(name),
6573                        history: Some(history),
6574                    }))
6575                }
6576            }
6577            RESET => {
6578                self.expect_token(&Token::LParen)
6579                    .map_no_statement_parser_err()?;
6580                self.expect_keywords(&[RETAIN, HISTORY])
6581                    .map_parser_err(StatementKind::AlterRetainHistory)?;
6582                self.expect_token(&Token::RParen)
6583                    .map_no_statement_parser_err()?;
6584                Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6585                    object_type,
6586                    if_exists,
6587                    name: UnresolvedObjectName::Item(name),
6588                    history: None,
6589                }))
6590            }
6591            OWNER => {
6592                self.expect_keyword(TO).map_no_statement_parser_err()?;
6593                let new_owner = self
6594                    .parse_identifier()
6595                    .map_parser_err(StatementKind::AlterOwner)?;
6596                Ok(Statement::AlterOwner(AlterOwnerStatement {
6597                    object_type,
6598                    if_exists,
6599                    name: UnresolvedObjectName::Item(name),
6600                    new_owner,
6601                }))
6602            }
6603            ADD => {
6604                assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6605
6606                self.expect_keyword(COLUMN)
6607                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6608                let if_col_not_exist = self
6609                    .parse_if_not_exists()
6610                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6611                let column_name = self
6612                    .parse_identifier()
6613                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6614                let data_type = self
6615                    .parse_data_type()
6616                    .map_parser_err(StatementKind::AlterTableAddColumn)?;
6617
6618                Ok(Statement::AlterTableAddColumn(
6619                    AlterTableAddColumnStatement {
6620                        if_exists,
6621                        name,
6622                        if_col_not_exist,
6623                        column_name,
6624                        data_type,
6625                    },
6626                ))
6627            }
6628            APPLY => {
6629                assert_eq!(
6630                    object_type,
6631                    ObjectType::MaterializedView,
6632                    "checked object_type above",
6633                );
6634
6635                self.expect_keyword(REPLACEMENT)
6636                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6637
6638                let replacement_name = self
6639                    .parse_item_name()
6640                    .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6641
6642                Ok(Statement::AlterMaterializedViewApplyReplacement(
6643                    AlterMaterializedViewApplyReplacementStatement {
6644                        if_exists,
6645                        name,
6646                        replacement_name,
6647                    },
6648                ))
6649            }
6650            _ => unreachable!(),
6651        }
6652    }
6653
6654    fn parse_alter_schema(
6655        &mut self,
6656        object_type: ObjectType,
6657    ) -> Result<Statement<Raw>, ParserStatementError> {
6658        let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6659        let name = self.parse_schema_name().map_no_statement_parser_err()?;
6660        let name = UnresolvedObjectName::Schema(name);
6661        let action = self
6662            .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6663            .map_no_statement_parser_err()?;
6664
6665        match action {
6666            OWNER => {
6667                self.expect_keyword(TO)
6668                    .map_parser_err(StatementKind::AlterOwner)?;
6669                let new_owner = self
6670                    .parse_identifier()
6671                    .map_parser_err(StatementKind::AlterOwner)?;
6672
6673                Ok(Statement::AlterOwner(AlterOwnerStatement {
6674                    object_type,
6675                    if_exists,
6676                    name,
6677                    new_owner,
6678                }))
6679            }
6680            RENAME => {
6681                self.expect_keyword(TO)
6682                    .map_parser_err(StatementKind::AlterObjectRename)?;
6683                let to_item_name = self
6684                    .parse_identifier()
6685                    .map_parser_err(StatementKind::AlterObjectRename)?;
6686
6687                Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6688                    object_type,
6689                    if_exists,
6690                    name,
6691                    to_item_name,
6692                }))
6693            }
6694            SWAP => {
6695                self.expect_keyword(WITH)
6696                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6697                let name_b = self
6698                    .parse_identifier()
6699                    .map_parser_err(StatementKind::AlterObjectSwap)?;
6700
6701                Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6702                    object_type,
6703                    name_a: name,
6704                    name_b,
6705                }))
6706            }
6707            k => unreachable!("programming error, unmatched {k}"),
6708        }
6709    }
6710
6711    /// Parses `CLUSTER name` fragments into a [`AlterSetClusterStatement`] if `CLUSTER` is found.
6712    fn maybe_parse_alter_set_cluster(
6713        &mut self,
6714        if_exists: bool,
6715        name: &UnresolvedItemName,
6716        object_type: ObjectType,
6717    ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6718        if self.parse_keyword(CLUSTER) {
6719            Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6720        } else {
6721            None
6722        }
6723    }
6724
6725    /// Parses `IN CLUSTER name` fragments into a [`AlterSetClusterStatement`].
6726    fn parse_alter_set_cluster(
6727        &mut self,
6728        if_exists: bool,
6729        name: UnresolvedItemName,
6730        object_type: ObjectType,
6731    ) -> Result<Statement<Raw>, ParserStatementError> {
6732        let set_cluster = self
6733            .parse_raw_ident()
6734            .map_parser_err(StatementKind::AlterSetCluster)?;
6735        Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6736            name,
6737            if_exists,
6738            set_cluster,
6739            object_type,
6740        }))
6741    }
6742
6743    /// Parse a copy statement
6744    fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6745        // We support an optional "INTO" keyword for COPY INTO <table> FROM
6746        let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
6747            Some(self.peek_prev_pos())
6748        } else {
6749            None
6750        };
6751
6752        let relation = if self.consume_token(&Token::LParen) {
6753            let query = self.parse_statement()?.ast;
6754            self.expect_token(&Token::RParen)
6755                .map_parser_err(StatementKind::Copy)?;
6756            match query {
6757                Statement::Select(stmt) => CopyRelation::Select(stmt),
6758                Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
6759                _ => {
6760                    return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
6761                        .map_parser_err(StatementKind::Copy);
6762                }
6763            }
6764        } else {
6765            let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
6766            let columns = self
6767                .parse_parenthesized_column_list(Optional)
6768                .map_parser_err(StatementKind::Copy)?;
6769            CopyRelation::Named { name, columns }
6770        };
6771        let (direction, target) = match self
6772            .expect_one_of_keywords(&[FROM, TO])
6773            .map_parser_err(StatementKind::Copy)?
6774        {
6775            FROM => {
6776                if let CopyRelation::Named { .. } = relation {
6777                    // Ok.
6778                } else {
6779                    return parser_err!(
6780                        self,
6781                        self.peek_prev_pos(),
6782                        "queries not allowed in COPY FROM"
6783                    )
6784                    .map_no_statement_parser_err();
6785                }
6786                if self.parse_keyword(STDIN) {
6787                    (CopyDirection::From, CopyTarget::Stdin)
6788                } else {
6789                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6790                    (CopyDirection::From, CopyTarget::Expr(url_expr))
6791                }
6792            }
6793            TO => {
6794                // We only support the INTO keyword for 'COPY FROM'.
6795                if let Some(into_pos) = maybe_into_pos {
6796                    return self
6797                        .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
6798                        .map_parser_err(StatementKind::Copy);
6799                }
6800
6801                if self.parse_keyword(STDOUT) {
6802                    (CopyDirection::To, CopyTarget::Stdout)
6803                } else {
6804                    let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6805                    (CopyDirection::To, CopyTarget::Expr(url_expr))
6806                }
6807            }
6808            _ => unreachable!(),
6809        };
6810        // WITH must be followed by LParen. The WITH in COPY is optional for backward
6811        // compat with Postgres but is required elsewhere, which is why we don't use
6812        // parse_with_options here.
6813        let has_options = if self.parse_keyword(WITH) {
6814            self.expect_token(&Token::LParen)
6815                .map_parser_err(StatementKind::Copy)?;
6816            true
6817        } else {
6818            self.consume_token(&Token::LParen)
6819        };
6820        let options = if has_options {
6821            let o = self
6822                .parse_comma_separated(Parser::parse_copy_option)
6823                .map_parser_err(StatementKind::Copy)?;
6824            self.expect_token(&Token::RParen)
6825                .map_parser_err(StatementKind::Copy)?;
6826            o
6827        } else {
6828            vec![]
6829        };
6830        Ok(Statement::Copy(CopyStatement {
6831            relation,
6832            direction,
6833            target,
6834            options,
6835        }))
6836    }
6837
6838    fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
6839        let name = match self.expect_one_of_keywords(&[
6840            FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
6841        ])? {
6842            FORMAT => CopyOptionName::Format,
6843            DELIMITER => CopyOptionName::Delimiter,
6844            NULL => CopyOptionName::Null,
6845            ESCAPE => CopyOptionName::Escape,
6846            QUOTE => CopyOptionName::Quote,
6847            HEADER => CopyOptionName::Header,
6848            AWS => {
6849                self.expect_keyword(CONNECTION)?;
6850                return Ok(CopyOption {
6851                    name: CopyOptionName::AwsConnection,
6852                    value: Some(self.parse_object_option_value()?),
6853                });
6854            }
6855            MAX => {
6856                self.expect_keywords(&[FILE, SIZE])?;
6857                CopyOptionName::MaxFileSize
6858            }
6859            FILES => CopyOptionName::Files,
6860            PATTERN => CopyOptionName::Pattern,
6861            _ => unreachable!(),
6862        };
6863        Ok(CopyOption {
6864            name,
6865            value: self.parse_optional_option_value()?,
6866        })
6867    }
6868
6869    /// Parse a literal value (numbers, strings, date/time, booleans)
6870    fn parse_value(&mut self) -> Result<Value, ParserError> {
6871        match self.next_token() {
6872            Some(t) => match t {
6873                Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
6874                Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
6875                Token::Keyword(NULL) => Ok(Value::Null),
6876                Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
6877                Token::Keyword(kw) => {
6878                    parser_err!(
6879                        self,
6880                        self.peek_prev_pos(),
6881                        format!("No value parser for keyword {}", kw)
6882                    )
6883                }
6884                Token::Op(ref op) if op == "-" => match self.next_token() {
6885                    Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
6886                    other => self.expected(self.peek_prev_pos(), "literal int", other),
6887                },
6888                Token::Number(ref n) => Ok(Value::Number(n.to_string())),
6889                Token::String(ref s) => Ok(Value::String(s.to_string())),
6890                Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
6891                _ => parser_err!(
6892                    self,
6893                    self.peek_prev_pos(),
6894                    format!("Unsupported value: {:?}", t)
6895                ),
6896            },
6897            None => parser_err!(
6898                self,
6899                self.peek_prev_pos(),
6900                "Expecting a value, but found EOF"
6901            ),
6902        }
6903    }
6904
6905    fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
6906        if self.consume_token(&Token::LParen) {
6907            let subquery = self.parse_query()?;
6908            self.expect_token(&Token::RParen)?;
6909            Ok(Expr::ArraySubquery(Box::new(subquery)))
6910        } else {
6911            self.parse_sequence(Self::parse_array).map(Expr::Array)
6912        }
6913    }
6914
6915    fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
6916        if self.consume_token(&Token::LParen) {
6917            let subquery = self.parse_query()?;
6918            self.expect_token(&Token::RParen)?;
6919            Ok(Expr::ListSubquery(Box::new(subquery)))
6920        } else {
6921            self.parse_sequence(Self::parse_list).map(Expr::List)
6922        }
6923    }
6924
6925    fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
6926        if self.consume_token(&Token::LParen) {
6927            let subquery = self.parse_query()?;
6928            self.expect_token(&Token::RParen)?;
6929            return Ok(Expr::MapSubquery(Box::new(subquery)));
6930        }
6931
6932        self.expect_token(&Token::LBracket)?;
6933        let mut exprs = vec![];
6934        loop {
6935            if let Some(Token::RBracket) = self.peek_token() {
6936                break;
6937            }
6938            let key = self.parse_expr()?;
6939            self.expect_token(&Token::Arrow)?;
6940            let value = if let Some(Token::LBracket) = self.peek_token() {
6941                self.parse_map()?
6942            } else {
6943                self.parse_expr()?
6944            };
6945            exprs.push(MapEntry { key, value });
6946            if !self.consume_token(&Token::Comma) {
6947                break;
6948            }
6949        }
6950        self.expect_token(&Token::RBracket)?;
6951        Ok(Expr::Map(exprs))
6952    }
6953
6954    fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
6955    where
6956        F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
6957    {
6958        self.expect_token(&Token::LBracket)?;
6959        let mut exprs = vec![];
6960        loop {
6961            if let Some(Token::RBracket) = self.peek_token() {
6962                break;
6963            }
6964            let expr = if let Some(Token::LBracket) = self.peek_token() {
6965                f(self)?
6966            } else {
6967                self.parse_expr()?
6968            };
6969            exprs.push(expr);
6970            if !self.consume_token(&Token::Comma) {
6971                break;
6972            }
6973        }
6974        self.expect_token(&Token::RBracket)?;
6975        Ok(exprs)
6976    }
6977
6978    fn parse_number_value(&mut self) -> Result<Value, ParserError> {
6979        match self.parse_value()? {
6980            v @ Value::Number(_) => Ok(v),
6981            _ => {
6982                self.prev_token();
6983                self.expected(self.peek_pos(), "literal number", self.peek_token())
6984            }
6985        }
6986    }
6987
6988    fn parse_version(&mut self) -> Result<Version, ParserError> {
6989        let version = self.parse_literal_uint()?;
6990        Ok(Version(version))
6991    }
6992
6993    /// Parse a signed literal integer.
6994    fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
6995        let negative = self.consume_token(&Token::Op("-".into()));
6996        match self.next_token() {
6997            Some(Token::Number(s)) => {
6998                let n = s.parse::<i64>().map_err(|e| {
6999                    self.error(
7000                        self.peek_prev_pos(),
7001                        format!("Could not parse '{}' as i64: {}", s, e),
7002                    )
7003                })?;
7004                if negative {
7005                    n.checked_neg().ok_or_else(|| {
7006                        self.error(
7007                            self.peek_prev_pos(),
7008                            format!("Could not parse '{}' as i64: overflows i64", s),
7009                        )
7010                    })
7011                } else {
7012                    Ok(n)
7013                }
7014            }
7015            other => self.expected(self.peek_prev_pos(), "literal integer", other),
7016        }
7017    }
7018
7019    /// Parse an unsigned literal integer.
7020    fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7021        match self.next_token() {
7022            Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7023                self.error(
7024                    self.peek_prev_pos(),
7025                    format!("Could not parse '{}' as u64: {}", s, e),
7026                )
7027            }),
7028            other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7029        }
7030    }
7031
7032    /// Parse a literal string
7033    fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7034        match self.next_token() {
7035            Some(Token::String(ref s)) => Ok(s.clone()),
7036            other => self.expected(self.peek_prev_pos(), "literal string", other),
7037        }
7038    }
7039
7040    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
7041    fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7042        let other = |ident| RawDataType::Other {
7043            name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7044            typ_mod: vec![],
7045        };
7046
7047        let mut data_type = match self.next_token() {
7048            Some(Token::Keyword(kw)) => match kw {
7049                // Text-like types
7050                CHAR | CHARACTER => {
7051                    let name = if self.parse_keyword(VARYING) {
7052                        ident!("varchar")
7053                    } else {
7054                        ident!("bpchar")
7055                    };
7056                    RawDataType::Other {
7057                        name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7058                        typ_mod: self.parse_typ_mod()?,
7059                    }
7060                }
7061                BPCHAR => RawDataType::Other {
7062                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7063                    typ_mod: self.parse_typ_mod()?,
7064                },
7065                VARCHAR => RawDataType::Other {
7066                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7067                    typ_mod: self.parse_typ_mod()?,
7068                },
7069                STRING => other(ident!("text")),
7070
7071                // Number-like types
7072                BIGINT => other(ident!("int8")),
7073                SMALLINT => other(ident!("int2")),
7074                DEC | DECIMAL => RawDataType::Other {
7075                    name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7076                    typ_mod: self.parse_typ_mod()?,
7077                },
7078                DOUBLE => {
7079                    let _ = self.parse_keyword(PRECISION);
7080                    other(ident!("float8"))
7081                }
7082                FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7083                    v if v == 0 || v > 53 => {
7084                        return Err(self.error(
7085                            self.peek_prev_pos(),
7086                            "precision for type float must be within ([1-53])".into(),
7087                        ));
7088                    }
7089                    v if v < 25 => other(ident!("float4")),
7090                    _ => other(ident!("float8")),
7091                },
7092                INT | INTEGER => other(ident!("int4")),
7093                REAL => other(ident!("float4")),
7094
7095                // Time-like types
7096                TIME => {
7097                    if self.parse_keyword(WITH) {
7098                        self.expect_keywords(&[TIME, ZONE])?;
7099                        other(ident!("timetz"))
7100                    } else {
7101                        if self.parse_keyword(WITHOUT) {
7102                            self.expect_keywords(&[TIME, ZONE])?;
7103                        }
7104                        other(ident!("time"))
7105                    }
7106                }
7107                TIMESTAMP => {
7108                    let typ_mod = self.parse_timestamp_precision()?;
7109                    if self.parse_keyword(WITH) {
7110                        self.expect_keywords(&[TIME, ZONE])?;
7111                        RawDataType::Other {
7112                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7113                                "timestamptz"
7114                            ))),
7115                            typ_mod,
7116                        }
7117                    } else {
7118                        if self.parse_keyword(WITHOUT) {
7119                            self.expect_keywords(&[TIME, ZONE])?;
7120                        }
7121                        RawDataType::Other {
7122                            name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7123                                "timestamp"
7124                            ))),
7125                            typ_mod,
7126                        }
7127                    }
7128                }
7129                TIMESTAMPTZ => {
7130                    let typ_mod = self.parse_timestamp_precision()?;
7131                    RawDataType::Other {
7132                        name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7133                            "timestamptz"
7134                        ))),
7135                        typ_mod,
7136                    }
7137                }
7138
7139                // MZ "proprietary" types
7140                MAP => {
7141                    return self.parse_map_type();
7142                }
7143
7144                // Misc.
7145                BOOLEAN => other(ident!("bool")),
7146                BYTES => other(ident!("bytea")),
7147                JSON => other(ident!("jsonb")),
7148
7149                // We do not want any reserved keywords to be parsed as data type names,
7150                // eg "CASE 'foo' WHEN ... END" should not parse as "CAST 'foo' AS CASE"
7151                kw if kw.is_sometimes_reserved() => {
7152                    return self.expected(
7153                        self.peek_prev_pos(),
7154                        "a data type name",
7155                        Some(Token::Keyword(kw)),
7156                    );
7157                }
7158                _ => {
7159                    self.prev_token();
7160                    RawDataType::Other {
7161                        name: RawItemName::Name(self.parse_item_name()?),
7162                        typ_mod: self.parse_typ_mod()?,
7163                    }
7164                }
7165            },
7166            Some(Token::Ident(_) | Token::LBracket) => {
7167                self.prev_token();
7168                RawDataType::Other {
7169                    name: self.parse_raw_name()?,
7170                    typ_mod: self.parse_typ_mod()?,
7171                }
7172            }
7173            other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7174        };
7175
7176        loop {
7177            match self.peek_token() {
7178                Some(Token::Keyword(LIST)) => {
7179                    self.next_token();
7180                    data_type = RawDataType::List(Box::new(data_type));
7181                }
7182                Some(Token::LBracket) => {
7183                    // Handle array suffixes. Note that `int[]`, `int[][][]`,
7184                    // and `int[2][2]` all parse to the same "int array" type.
7185                    self.next_token();
7186                    let _ = self.maybe_parse(|parser| parser.parse_number_value());
7187                    self.expect_token(&Token::RBracket)?;
7188                    if !matches!(data_type, RawDataType::Array(_)) {
7189                        data_type = RawDataType::Array(Box::new(data_type));
7190                    }
7191                }
7192                _ => break,
7193            }
7194        }
7195        Ok(data_type)
7196    }
7197
7198    fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7199        if self.consume_token(&Token::LParen) {
7200            let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7201            self.expect_token(&Token::RParen)?;
7202            Ok(typ_mod)
7203        } else {
7204            Ok(vec![])
7205        }
7206    }
7207
7208    // parses the precision in timestamp(<precision>) and timestamptz(<precision>)
7209    fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7210        if self.consume_token(&Token::LParen) {
7211            let typ_mod = self.parse_literal_int()?;
7212            self.expect_token(&Token::RParen)?;
7213            Ok(vec![typ_mod])
7214        } else {
7215            Ok(vec![])
7216        }
7217    }
7218
7219    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
7220    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
7221    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
7222    fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7223    where
7224        F: FnOnce(Keyword) -> bool,
7225    {
7226        let after_as = self.parse_keyword(AS);
7227        match self.next_token() {
7228            // Do not accept `AS OF`, which is reserved for providing timestamp information
7229            // to queries.
7230            Some(Token::Keyword(OF)) => {
7231                self.prev_token();
7232                if after_as {
7233                    self.prev_token();
7234                }
7235                Ok(None)
7236            }
7237            // Accept any other identifier after `AS` (though many dialects have restrictions on
7238            // keywords that may appear here). If there's no `AS`: don't parse keywords,
7239            // which may start a construct allowed in this position, to be parsed as aliases.
7240            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
7241            // not an alias.)
7242            Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7243            Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7244            not_an_ident => {
7245                if after_as {
7246                    return self.expected(
7247                        self.peek_prev_pos(),
7248                        "an identifier after AS",
7249                        not_an_ident,
7250                    );
7251                }
7252                self.prev_token();
7253                Ok(None) // no alias found
7254            }
7255        }
7256    }
7257
7258    /// Parse `AS identifier` when the AS is describing a table-valued object,
7259    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
7260    /// the alias is allowed to optionally name the columns in the table, in
7261    /// addition to the table itself.
7262    fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7263        match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7264            Some(name) => {
7265                let columns = self.parse_parenthesized_column_list(Optional)?;
7266                Ok(Some(TableAlias {
7267                    name,
7268                    columns,
7269                    strict: false,
7270                }))
7271            }
7272            None => Ok(None),
7273        }
7274    }
7275
7276    fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7277        Ok(match self.parse_raw_name()? {
7278            named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7279            RawItemName::Name(name) => DeferredItemName::Deferred(name),
7280        })
7281    }
7282
7283    fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7284        if self.consume_token(&Token::LBracket) {
7285            let id = match self.next_token() {
7286                Some(Token::Ident(id)) => id.into_inner(),
7287                _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7288            };
7289            self.expect_keyword(AS)?;
7290            let name = self.parse_item_name()?;
7291            // TODO(justin): is there a more idiomatic way to detect a fully-qualified name?
7292            if name.0.len() < 2 {
7293                return parser_err!(
7294                    self,
7295                    self.peek_prev_pos(),
7296                    "table name in square brackets must be fully qualified"
7297                );
7298            }
7299
7300            let version = if self.parse_keywords(&[VERSION]) {
7301                let version = self.parse_version()?;
7302                Some(version)
7303            } else {
7304                None
7305            };
7306
7307            self.expect_token(&Token::RBracket)?;
7308            Ok(RawItemName::Id(id, name, version))
7309        } else {
7310            Ok(RawItemName::Name(self.parse_item_name()?))
7311        }
7312    }
7313
7314    fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7315        let start = self.peek_pos();
7316        let mut item_name = self.parse_raw_name()?;
7317        let column_name = match &mut item_name {
7318            RawItemName::Name(UnresolvedItemName(identifiers)) => {
7319                if identifiers.len() < 2 {
7320                    return Err(ParserError::new(
7321                        start,
7322                        "need to specify an object and a column",
7323                    ));
7324                }
7325                identifiers.pop().unwrap()
7326            }
7327            RawItemName::Id(_, _, _) => {
7328                self.expect_token(&Token::Dot)?;
7329                self.parse_identifier()?
7330            }
7331        };
7332
7333        Ok(ColumnName {
7334            relation: item_name,
7335            column: column_name,
7336        })
7337    }
7338
7339    /// Parse a possibly quoted database identifier, e.g.
7340    /// `foo` or `"mydatabase"`
7341    fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7342        Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7343    }
7344
7345    /// Parse a possibly qualified, possibly quoted schema identifier, e.g.
7346    /// `foo` or `mydatabase."schema"`
7347    fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7348        Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7349    }
7350
7351    /// Parse a possibly qualified, possibly quoted object identifier, e.g.
7352    /// `foo` or `myschema."table"`
7353    fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7354        Ok(UnresolvedItemName(self.parse_identifiers()?))
7355    }
7356
7357    /// Parse an object name.
7358    fn parse_object_name(
7359        &mut self,
7360        object_type: ObjectType,
7361    ) -> Result<UnresolvedObjectName, ParserError> {
7362        Ok(match object_type {
7363            ObjectType::Table
7364            | ObjectType::View
7365            | ObjectType::MaterializedView
7366            | ObjectType::Source
7367            | ObjectType::Subsource
7368            | ObjectType::Sink
7369            | ObjectType::Index
7370            | ObjectType::Type
7371            | ObjectType::Secret
7372            | ObjectType::Connection
7373            | ObjectType::Func
7374            | ObjectType::ContinualTask => UnresolvedObjectName::Item(self.parse_item_name()?),
7375            ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7376            ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7377            ObjectType::ClusterReplica => {
7378                UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7379            }
7380            ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7381            ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7382            ObjectType::NetworkPolicy => {
7383                UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7384            }
7385        })
7386    }
7387
7388    ///Parse one or more simple one-word identifiers separated by a '.'
7389    fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7390        let mut idents = vec![];
7391        loop {
7392            idents.push(self.parse_identifier()?);
7393            if !self.consume_token(&Token::Dot) {
7394                break;
7395            }
7396        }
7397        Ok(idents)
7398    }
7399
7400    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
7401    fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7402        match self.consume_identifier()? {
7403            Some(id) => {
7404                if id.as_str().is_empty() {
7405                    return parser_err!(
7406                        self,
7407                        self.peek_prev_pos(),
7408                        "zero-length delimited identifier",
7409                    );
7410                }
7411                Ok(id)
7412            }
7413            None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7414        }
7415    }
7416
7417    fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7418        match self.peek_token() {
7419            Some(Token::Keyword(kw)) => {
7420                self.next_token();
7421                Ok(Some(kw.into()))
7422            }
7423            Some(Token::Ident(id)) => {
7424                self.next_token();
7425                Ok(Some(self.new_identifier(id)?))
7426            }
7427            _ => Ok(None),
7428        }
7429    }
7430
7431    fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7432        let mut id_parts = vec![id];
7433        match self.peek_token() {
7434            Some(Token::LParen) | Some(Token::Dot) => {
7435                let mut ends_with_wildcard = false;
7436                while self.consume_token(&Token::Dot) {
7437                    match self.next_token() {
7438                        Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7439                        Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7440                        Some(Token::Star) => {
7441                            ends_with_wildcard = true;
7442                            break;
7443                        }
7444                        unexpected => {
7445                            return self.expected(
7446                                self.peek_prev_pos(),
7447                                "an identifier or a '*' after '.'",
7448                                unexpected,
7449                            );
7450                        }
7451                    }
7452                }
7453                if ends_with_wildcard {
7454                    Ok(Expr::QualifiedWildcard(id_parts))
7455                } else if self.peek_token() == Some(Token::LParen) {
7456                    let function =
7457                        self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7458                    Ok(Expr::Function(function))
7459                } else {
7460                    Ok(Expr::Identifier(id_parts))
7461                }
7462            }
7463            _ => Ok(Expr::Identifier(id_parts)),
7464        }
7465    }
7466
7467    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
7468    fn parse_parenthesized_column_list(
7469        &mut self,
7470        optional: IsOptional,
7471    ) -> Result<Vec<Ident>, ParserError> {
7472        if self.consume_token(&Token::LParen) {
7473            let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7474            self.expect_token(&Token::RParen)?;
7475            Ok(cols)
7476        } else if optional == Optional {
7477            Ok(vec![])
7478        } else {
7479            self.expected(
7480                self.peek_pos(),
7481                "a list of columns in parentheses",
7482                self.peek_token(),
7483            )
7484        }
7485    }
7486
7487    fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7488        if self.consume_token(&Token::LParen) {
7489            let n = self.parse_literal_uint()?;
7490            self.expect_token(&Token::RParen)?;
7491            Ok(Some(n))
7492        } else {
7493            Ok(None)
7494        }
7495    }
7496
7497    fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7498        self.expect_token(&Token::LBracket)?;
7499        let key_type = Box::new(self.parse_data_type()?);
7500        self.expect_token(&Token::Arrow)?;
7501        let value_type = Box::new(self.parse_data_type()?);
7502        self.expect_token(&Token::RBracket)?;
7503        Ok(RawDataType::Map {
7504            key_type,
7505            value_type,
7506        })
7507    }
7508
7509    fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7510        self.expect_keyword(FROM)?;
7511        let table_name = RawItemName::Name(self.parse_item_name()?);
7512        let alias = self.parse_optional_table_alias()?;
7513        let using = if self.parse_keyword(USING) {
7514            self.parse_comma_separated(Parser::parse_table_and_joins)?
7515        } else {
7516            vec![]
7517        };
7518        let selection = if self.parse_keyword(WHERE) {
7519            Some(self.parse_expr()?)
7520        } else {
7521            None
7522        };
7523
7524        Ok(Statement::Delete(DeleteStatement {
7525            table_name,
7526            alias,
7527            using,
7528            selection,
7529        }))
7530    }
7531
7532    /// Parses a SELECT (or WITH, VALUES, TABLE) statement with optional AS OF.
7533    fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7534        Ok(SelectStatement {
7535            query: self.parse_query()?,
7536            as_of: self.parse_optional_as_of()?,
7537        })
7538    }
7539
7540    /// Parse a query expression, i.e. a `SELECT` statement optionally
7541    /// preceded with some `WITH` CTE declarations and optionally followed
7542    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
7543    /// expect the initial keyword to be already consumed
7544    fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7545        self.checked_recur_mut(|parser| {
7546            let cte_block = if parser.parse_keyword(WITH) {
7547                if parser.parse_keyword(MUTUALLY) {
7548                    parser.expect_keyword(RECURSIVE)?;
7549                    let options = if parser.consume_token(&Token::LParen) {
7550                        let options =
7551                            parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7552                        parser.expect_token(&Token::RParen)?;
7553                        options
7554                    } else {
7555                        vec![]
7556                    };
7557                    CteBlock::MutuallyRecursive(MutRecBlock {
7558                        options,
7559                        ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7560                    })
7561                } else {
7562                    // TODO: optional RECURSIVE
7563                    CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7564                }
7565            } else {
7566                CteBlock::empty()
7567            };
7568
7569            let body = parser.parse_query_body(SetPrecedence::Zero)?;
7570
7571            parser.parse_query_tail(cte_block, body)
7572        })
7573    }
7574
7575    fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7576        match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7577            RECURSION => {
7578                self.expect_keyword(LIMIT)?;
7579                Ok(MutRecBlockOption {
7580                    name: MutRecBlockOptionName::RecursionLimit,
7581                    value: self.parse_optional_option_value()?,
7582                })
7583            }
7584            RETURN => {
7585                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7586                Ok(MutRecBlockOption {
7587                    name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7588                    value: self.parse_optional_option_value()?,
7589                })
7590            }
7591            ERROR => {
7592                self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7593                Ok(MutRecBlockOption {
7594                    name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7595                    value: self.parse_optional_option_value()?,
7596                })
7597            }
7598            _ => unreachable!(),
7599        }
7600    }
7601
7602    fn parse_query_tail(
7603        &mut self,
7604        ctes: CteBlock<Raw>,
7605        body: SetExpr<Raw>,
7606    ) -> Result<Query<Raw>, ParserError> {
7607        let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7608            SetExpr::Query(query) => {
7609                let Query {
7610                    ctes,
7611                    body,
7612                    order_by,
7613                    limit,
7614                    offset,
7615                } = *query;
7616                (ctes, order_by, limit, offset, body)
7617            }
7618            _ => (CteBlock::empty(), vec![], None, None, body),
7619        };
7620
7621        let ctes = if ctes.is_empty() {
7622            inner_ctes
7623        } else if !inner_ctes.is_empty() {
7624            return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7625        } else {
7626            ctes
7627        };
7628
7629        let order_by = if self.parse_keywords(&[ORDER, BY]) {
7630            if !inner_order_by.is_empty() {
7631                return parser_err!(
7632                    self,
7633                    self.peek_prev_pos(),
7634                    "multiple ORDER BY clauses not allowed"
7635                );
7636            }
7637            self.parse_comma_separated(Parser::parse_order_by_expr)?
7638        } else {
7639            inner_order_by
7640        };
7641
7642        // Parse LIMIT, FETCH, OFFSET in any order, but:
7643        // - Only at most one of LIMIT or FETCH is allowed.
7644        // - Only at most one occurrence is allowed from each of these.
7645        let mut limit = inner_limit;
7646        let mut offset = inner_offset;
7647        while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7648            match parsed_keyword {
7649                LIMIT => {
7650                    if limit.is_some() {
7651                        return parser_err!(
7652                            self,
7653                            self.peek_prev_pos(),
7654                            "multiple LIMIT/FETCH clauses not allowed"
7655                        );
7656                    }
7657                    limit = if self.parse_keyword(ALL) {
7658                        None
7659                    } else {
7660                        Some(Limit {
7661                            with_ties: false,
7662                            quantity: self.parse_expr()?,
7663                        })
7664                    };
7665                }
7666                OFFSET => {
7667                    if offset.is_some() {
7668                        return parser_err!(
7669                            self,
7670                            self.peek_prev_pos(),
7671                            "multiple OFFSET clauses not allowed"
7672                        );
7673                    }
7674                    let value = self.parse_expr()?;
7675                    let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7676                    offset = Some(value);
7677                }
7678                FETCH => {
7679                    if limit.is_some() {
7680                        return parser_err!(
7681                            self,
7682                            self.peek_prev_pos(),
7683                            "multiple LIMIT/FETCH clauses not allowed"
7684                        );
7685                    }
7686                    self.expect_one_of_keywords(&[FIRST, NEXT])?;
7687                    let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7688                        Expr::Value(Value::Number('1'.into()))
7689                    } else {
7690                        let quantity = self.parse_expr()?;
7691                        self.expect_one_of_keywords(&[ROW, ROWS])?;
7692                        quantity
7693                    };
7694                    let with_ties = if self.parse_keyword(ONLY) {
7695                        false
7696                    } else if self.parse_keywords(&[WITH, TIES]) {
7697                        true
7698                    } else {
7699                        return self.expected(
7700                            self.peek_pos(),
7701                            "one of ONLY or WITH TIES",
7702                            self.peek_token(),
7703                        );
7704                    };
7705                    limit = Some(Limit {
7706                        with_ties,
7707                        quantity,
7708                    });
7709                }
7710                _ => unreachable!(),
7711            }
7712        }
7713
7714        Ok(Query {
7715            ctes,
7716            body,
7717            order_by,
7718            limit,
7719            offset,
7720        })
7721    }
7722
7723    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
7724    fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7725        let alias = TableAlias {
7726            name: self.parse_identifier()?,
7727            columns: self.parse_parenthesized_column_list(Optional)?,
7728            strict: false,
7729        };
7730        self.expect_keyword(AS)?;
7731        self.expect_token(&Token::LParen)?;
7732        let query = self.parse_query()?;
7733        self.expect_token(&Token::RParen)?;
7734        Ok(Cte {
7735            alias,
7736            query,
7737            id: (),
7738        })
7739    }
7740
7741    /// Parse a mutually recursive CTE (`alias ( col1: typ1, col2: typ2, ... ) AS (subquery)`).
7742    ///
7743    /// The main distinction from `parse_cte` is that the column names and types are mandatory.
7744    /// This is not how SQL works for `WITH RECURSIVE`, but we are doing it for now to make the
7745    /// query interpretation that much easier.
7746    fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7747        let name = self.parse_identifier()?;
7748        self.expect_token(&Token::LParen)?;
7749        let columns = self.parse_comma_separated(|parser| {
7750            Ok(CteMutRecColumnDef {
7751                name: parser.parse_identifier()?,
7752                data_type: parser.parse_data_type()?,
7753            })
7754        })?;
7755        self.expect_token(&Token::RParen)?;
7756        self.expect_keyword(AS)?;
7757        self.expect_token(&Token::LParen)?;
7758        let query = self.parse_query()?;
7759        self.expect_token(&Token::RParen)?;
7760        Ok(CteMutRec {
7761            name,
7762            columns,
7763            query,
7764            id: (),
7765        })
7766    }
7767
7768    /// Parse a "query body", which is an expression with roughly the
7769    /// following grammar:
7770    /// ```text
7771    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
7772    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
7773    ///   subquery ::= query_body [ order_by_limit ]
7774    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
7775    /// ```
7776    fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
7777        // We parse the expression using a Pratt parser, as in `parse_expr()`.
7778        // Start by parsing a restricted SELECT or a `(subquery)`:
7779        let expr = if self.parse_keyword(SELECT) {
7780            SetExpr::Select(Box::new(self.parse_select()?))
7781        } else if self.consume_token(&Token::LParen) {
7782            // CTEs are not allowed here, but the parser currently accepts them
7783            let subquery = self.parse_query()?;
7784            self.expect_token(&Token::RParen)?;
7785            SetExpr::Query(Box::new(subquery))
7786        } else if self.parse_keyword(VALUES) {
7787            SetExpr::Values(self.parse_values()?)
7788        } else if self.parse_keyword(SHOW) {
7789            SetExpr::Show(self.parse_show()?)
7790        } else if self.parse_keyword(TABLE) {
7791            SetExpr::Table(self.parse_raw_name()?)
7792        } else {
7793            return self.expected(
7794                self.peek_pos(),
7795                "SELECT, VALUES, or a subquery in the query body",
7796                self.peek_token(),
7797            );
7798        };
7799
7800        self.parse_query_body_seeded(precedence, expr)
7801    }
7802
7803    fn parse_query_body_seeded(
7804        &mut self,
7805        precedence: SetPrecedence,
7806        mut expr: SetExpr<Raw>,
7807    ) -> Result<SetExpr<Raw>, ParserError> {
7808        loop {
7809            // The query can be optionally followed by a set operator:
7810            let next_token = self.peek_token();
7811            let op = self.parse_set_operator(&next_token);
7812            let next_precedence = match op {
7813                // UNION and EXCEPT have the same precedence and evaluate left-to-right
7814                Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7815                // INTERSECT has higher precedence than UNION/EXCEPT
7816                Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7817                // Unexpected token or EOF => stop parsing the query body
7818                None => break,
7819            };
7820            if precedence >= next_precedence {
7821                break;
7822            }
7823            self.next_token(); // skip past the set operator
7824
7825            let all = self.parse_keyword(ALL);
7826            let distinct = self.parse_keyword(DISTINCT);
7827            if all && distinct {
7828                return parser_err!(
7829                    self,
7830                    self.peek_prev_pos(),
7831                    "Cannot specify both ALL and DISTINCT in set operation"
7832                );
7833            }
7834            expr = SetExpr::SetOperation {
7835                left: Box::new(expr),
7836                op: op.unwrap(),
7837                all,
7838                right: Box::new(self.parse_query_body(next_precedence)?),
7839            };
7840        }
7841
7842        Ok(expr)
7843    }
7844
7845    fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
7846        match token {
7847            Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
7848            Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
7849            Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
7850            _ => None,
7851        }
7852    }
7853
7854    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
7855    /// assuming the initial `SELECT` was already consumed
7856    fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
7857        let all = self.parse_keyword(ALL);
7858        let distinct = self.parse_keyword(DISTINCT);
7859        if all && distinct {
7860            return parser_err!(
7861                self,
7862                self.peek_prev_pos(),
7863                "Cannot specify both ALL and DISTINCT in SELECT"
7864            );
7865        }
7866        let distinct = if distinct && self.parse_keyword(ON) {
7867            self.expect_token(&Token::LParen)?;
7868            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
7869            self.expect_token(&Token::RParen)?;
7870            Some(Distinct::On(exprs))
7871        } else if distinct {
7872            Some(Distinct::EntireRow)
7873        } else {
7874            None
7875        };
7876
7877        let projection = match self.peek_token() {
7878            // An empty target list is permissible to match PostgreSQL, which
7879            // permits these for symmetry with zero column tables. We need
7880            // to sniff out `AS` here specially to support `SELECT AS OF ...`.
7881            Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
7882            Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
7883            _ => {
7884                let mut projection = vec![];
7885                loop {
7886                    projection.push(self.parse_select_item()?);
7887                    if !self.consume_token(&Token::Comma) {
7888                        break;
7889                    }
7890                    if self.peek_keyword(FROM) {
7891                        return parser_err!(
7892                            self,
7893                            self.peek_prev_pos(),
7894                            "invalid trailing comma in SELECT list",
7895                        );
7896                    }
7897                }
7898                projection
7899            }
7900        };
7901
7902        // Note that for keywords to be properly handled here, they need to be
7903        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
7904        // otherwise they may be parsed as an alias as part of the `projection`
7905        // or `from`.
7906
7907        let from = if self.parse_keyword(FROM) {
7908            self.parse_comma_separated(Parser::parse_table_and_joins)?
7909        } else {
7910            vec![]
7911        };
7912
7913        let selection = if self.parse_keyword(WHERE) {
7914            Some(self.parse_expr()?)
7915        } else {
7916            None
7917        };
7918
7919        let group_by = if self.parse_keywords(&[GROUP, BY]) {
7920            self.parse_comma_separated(Parser::parse_expr)?
7921        } else {
7922            vec![]
7923        };
7924
7925        let having = if self.parse_keyword(HAVING) {
7926            Some(self.parse_expr()?)
7927        } else {
7928            None
7929        };
7930
7931        let qualify = if self.parse_keyword(QUALIFY) {
7932            Some(self.parse_expr()?)
7933        } else {
7934            None
7935        };
7936
7937        let options = if self.parse_keyword(OPTIONS) {
7938            self.expect_token(&Token::LParen)?;
7939            let options = self.parse_comma_separated(Self::parse_select_option)?;
7940            self.expect_token(&Token::RParen)?;
7941            options
7942        } else {
7943            vec![]
7944        };
7945
7946        Ok(Select {
7947            distinct,
7948            projection,
7949            from,
7950            selection,
7951            group_by,
7952            having,
7953            qualify,
7954            options,
7955        })
7956    }
7957
7958    fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
7959        let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
7960            EXPECTED => {
7961                self.expect_keywords(&[GROUP, SIZE])?;
7962                SelectOptionName::ExpectedGroupSize
7963            }
7964            AGGREGATE => {
7965                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7966                SelectOptionName::AggregateInputGroupSize
7967            }
7968            DISTINCT => {
7969                self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
7970                SelectOptionName::DistinctOnInputGroupSize
7971            }
7972            LIMIT => {
7973                self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7974                SelectOptionName::LimitInputGroupSize
7975            }
7976            _ => unreachable!(),
7977        };
7978        Ok(SelectOption {
7979            name,
7980            value: self.parse_optional_option_value()?,
7981        })
7982    }
7983
7984    fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
7985        let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
7986        let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
7987        let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
7988        if !normal {
7989            match variable.as_str().parse() {
7990                Ok(TIME) => {
7991                    self.expect_keyword(ZONE).map_no_statement_parser_err()?;
7992                    variable = ident!("timezone");
7993                    normal = true;
7994                }
7995                Ok(NAMES) => {
7996                    variable = ident!("client_encoding");
7997                    normal = true;
7998                }
7999                _ => {}
8000            }
8001        }
8002        if variable.as_str().parse() == Ok(SCHEMA) {
8003            variable = ident!("search_path");
8004            let to = self
8005                .parse_set_schema_to()
8006                .map_parser_err(StatementKind::SetVariable)?;
8007            Ok(Statement::SetVariable(SetVariableStatement {
8008                local: modifier == Some(LOCAL),
8009                variable,
8010                to,
8011            }))
8012        } else if normal {
8013            let to = self
8014                .parse_set_variable_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 variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8022            // SET TRANSACTION transaction_mode
8023            Ok(Statement::SetTransaction(SetTransactionStatement {
8024                local: true,
8025                modes: self
8026                    .parse_transaction_modes(true)
8027                    .map_parser_err(StatementKind::SetTransaction)?,
8028            }))
8029        } else if modifier == Some(SESSION)
8030            && variable.as_str().parse() == Ok(CHARACTERISTICS)
8031            && self.parse_keywords(&[AS, TRANSACTION])
8032        {
8033            // SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
8034            Ok(Statement::SetTransaction(SetTransactionStatement {
8035                local: false,
8036                modes: self
8037                    .parse_transaction_modes(true)
8038                    .map_parser_err(StatementKind::SetTransaction)?,
8039            }))
8040        } else {
8041            self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8042                .map_no_statement_parser_err()
8043        }
8044    }
8045
8046    fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8047        if self.parse_keyword(DEFAULT) {
8048            Ok(SetVariableTo::Default)
8049        } else {
8050            let to = self.parse_set_variable_value()?;
8051            Ok(SetVariableTo::Values(vec![to]))
8052        }
8053    }
8054
8055    fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8056        if self.parse_keyword(DEFAULT) {
8057            Ok(SetVariableTo::Default)
8058        } else {
8059            Ok(SetVariableTo::Values(
8060                self.parse_comma_separated(Parser::parse_set_variable_value)?,
8061            ))
8062        }
8063    }
8064
8065    fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8066        if let Some(value) = self.maybe_parse(Parser::parse_value) {
8067            Ok(SetVariableValue::Literal(value))
8068        } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8069            Ok(SetVariableValue::Ident(ident))
8070        } else {
8071            self.expected(self.peek_pos(), "variable value", self.peek_token())
8072        }
8073    }
8074
8075    fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8076        let mut variable = self.parse_identifier()?;
8077        if variable.as_str().parse() == Ok(SCHEMA) {
8078            variable = ident!("search_path");
8079        }
8080        Ok(Statement::ResetVariable(ResetVariableStatement {
8081            variable,
8082        }))
8083    }
8084
8085    fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8086        let redacted = self.parse_keyword(REDACTED);
8087        if redacted && !self.peek_keyword(CREATE) {
8088            return parser_err!(
8089                self,
8090                self.peek_pos(),
8091                "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8092            );
8093        }
8094        if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8095            self.parse_show_columns()
8096        } else if self.parse_keyword(OBJECTS) {
8097            let from = if self.parse_keywords(&[FROM]) {
8098                Some(self.parse_schema_name()?)
8099            } else {
8100                None
8101            };
8102            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8103                object_type: ShowObjectType::Object,
8104                from,
8105                filter: self.parse_show_statement_filter()?,
8106            }))
8107        } else if let Some(object_type) = self.parse_plural_object_type() {
8108            let from = if object_type.lives_in_schema() {
8109                if self.parse_keywords(&[FROM]) {
8110                    Some(self.parse_schema_name()?)
8111                } else {
8112                    None
8113                }
8114            } else {
8115                None
8116            };
8117
8118            let show_object_type = match object_type {
8119                ObjectType::Database => ShowObjectType::Database,
8120                ObjectType::Schema => {
8121                    let from = if self.parse_keyword(FROM) {
8122                        Some(self.parse_database_name()?)
8123                    } else {
8124                        None
8125                    };
8126                    ShowObjectType::Schema { from }
8127                }
8128                ObjectType::Table => {
8129                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8130                        Some(self.parse_raw_name()?)
8131                    } else {
8132                        None
8133                    };
8134                    ShowObjectType::Table { on_source }
8135                }
8136                ObjectType::View => ShowObjectType::View,
8137                ObjectType::Source => {
8138                    let in_cluster = self.parse_optional_in_cluster()?;
8139                    ShowObjectType::Source { in_cluster }
8140                }
8141                ObjectType::Subsource => {
8142                    let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8143                        Some(self.parse_raw_name()?)
8144                    } else {
8145                        None
8146                    };
8147
8148                    if from.is_some() && on_source.is_some() {
8149                        return parser_err!(
8150                            self,
8151                            self.peek_prev_pos(),
8152                            "Cannot specify both FROM and ON"
8153                        );
8154                    }
8155
8156                    ShowObjectType::Subsource { on_source }
8157                }
8158                ObjectType::Sink => {
8159                    let in_cluster = self.parse_optional_in_cluster()?;
8160                    ShowObjectType::Sink { in_cluster }
8161                }
8162                ObjectType::Type => ShowObjectType::Type,
8163                ObjectType::Role => ShowObjectType::Role,
8164                ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8165                ObjectType::Secret => ShowObjectType::Secret,
8166                ObjectType::Connection => ShowObjectType::Connection,
8167                ObjectType::Cluster => ShowObjectType::Cluster,
8168                ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8169                ObjectType::MaterializedView => {
8170                    let in_cluster = self.parse_optional_in_cluster()?;
8171                    ShowObjectType::MaterializedView { in_cluster }
8172                }
8173                ObjectType::ContinualTask => {
8174                    let in_cluster = self.parse_optional_in_cluster()?;
8175                    ShowObjectType::ContinualTask { in_cluster }
8176                }
8177                ObjectType::Index => {
8178                    let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8179                        Some(self.parse_raw_name()?)
8180                    } else {
8181                        None
8182                    };
8183
8184                    if from.is_some() && on_object.is_some() {
8185                        return parser_err!(
8186                            self,
8187                            self.peek_prev_pos(),
8188                            "Cannot specify both FROM and ON"
8189                        );
8190                    }
8191
8192                    let in_cluster = self.parse_optional_in_cluster()?;
8193                    ShowObjectType::Index {
8194                        in_cluster,
8195                        on_object,
8196                    }
8197                }
8198                ObjectType::Func => {
8199                    return parser_err!(
8200                        self,
8201                        self.peek_prev_pos(),
8202                        format!("Unsupported SHOW on {object_type}")
8203                    );
8204                }
8205            };
8206            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8207                object_type: show_object_type,
8208                from,
8209                filter: self.parse_show_statement_filter()?,
8210            }))
8211        } else if self.parse_keyword(CLUSTER) {
8212            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8213                variable: ident!("cluster"),
8214            }))
8215        } else if self.parse_keyword(PRIVILEGES) {
8216            self.parse_show_privileges()
8217        } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8218            self.parse_show_default_privileges()
8219        } else if self.parse_keyword(ROLE) {
8220            self.expect_keyword(MEMBERSHIP)?;
8221            let role = if self.parse_keyword(FOR) {
8222                Some(self.parse_identifier()?)
8223            } else {
8224                None
8225            };
8226            Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8227                object_type: ShowObjectType::RoleMembership { role },
8228                from: None,
8229                filter: self.parse_show_statement_filter()?,
8230            }))
8231        } else if self.parse_keywords(&[CREATE, VIEW]) {
8232            Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8233                view_name: self.parse_raw_name()?,
8234                redacted,
8235            }))
8236        } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8237            Ok(ShowStatement::ShowCreateMaterializedView(
8238                ShowCreateMaterializedViewStatement {
8239                    materialized_view_name: self.parse_raw_name()?,
8240                    redacted,
8241                },
8242            ))
8243        } else if self.parse_keywords(&[CREATE, SOURCE]) {
8244            Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8245                source_name: self.parse_raw_name()?,
8246                redacted,
8247            }))
8248        } else if self.parse_keywords(&[CREATE, TABLE]) {
8249            Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8250                table_name: self.parse_raw_name()?,
8251                redacted,
8252            }))
8253        } else if self.parse_keywords(&[CREATE, SINK]) {
8254            Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8255                sink_name: self.parse_raw_name()?,
8256                redacted,
8257            }))
8258        } else if self.parse_keywords(&[CREATE, INDEX]) {
8259            Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8260                index_name: self.parse_raw_name()?,
8261                redacted,
8262            }))
8263        } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8264            Ok(ShowStatement::ShowCreateConnection(
8265                ShowCreateConnectionStatement {
8266                    connection_name: self.parse_raw_name()?,
8267                    redacted,
8268                },
8269            ))
8270        } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8271            if redacted {
8272                return parser_err!(
8273                    self,
8274                    self.peek_prev_pos(),
8275                    "SHOW REDACTED CREATE CLUSTER is not supported"
8276                );
8277            }
8278            Ok(ShowStatement::ShowCreateCluster(
8279                ShowCreateClusterStatement {
8280                    cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8281                },
8282            ))
8283        } else if self.parse_keywords(&[CREATE, TYPE]) {
8284            Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8285                type_name: self.parse_data_type()?,
8286                redacted,
8287            }))
8288        } else {
8289            let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8290                ident!("transaction_isolation")
8291            } else if self.parse_keywords(&[TIME, ZONE]) {
8292                ident!("timezone")
8293            } else {
8294                self.parse_identifier()?
8295            };
8296            Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8297                variable,
8298            }))
8299        }
8300    }
8301
8302    fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8303        self.expect_one_of_keywords(&[FROM, IN])?;
8304        let table_name = self.parse_raw_name()?;
8305        // MySQL also supports FROM <database> here. In other words, MySQL
8306        // allows both FROM <table> FROM <database> and FROM <database>.<table>,
8307        // while we only support the latter for now.
8308        let filter = self.parse_show_statement_filter()?;
8309        Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8310            table_name,
8311            filter,
8312        }))
8313    }
8314
8315    fn parse_show_statement_filter(
8316        &mut self,
8317    ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8318        if self.parse_keyword(LIKE) {
8319            Ok(Some(ShowStatementFilter::Like(
8320                self.parse_literal_string()?,
8321            )))
8322        } else if self.parse_keyword(WHERE) {
8323            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8324        } else {
8325            Ok(None)
8326        }
8327    }
8328
8329    fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8330        let object_type = if self.parse_keyword(ON) {
8331            Some(self.expect_plural_system_object_type_for_privileges()?)
8332        } else {
8333            None
8334        };
8335        let role = if self.parse_keyword(FOR) {
8336            Some(self.parse_identifier()?)
8337        } else {
8338            None
8339        };
8340        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8341            object_type: ShowObjectType::Privileges { object_type, role },
8342            from: None,
8343            filter: self.parse_show_statement_filter()?,
8344        }))
8345    }
8346
8347    fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8348        let object_type = if self.parse_keyword(ON) {
8349            Some(self.expect_plural_object_type_for_privileges()?)
8350        } else {
8351            None
8352        };
8353        let role = if self.parse_keyword(FOR) {
8354            Some(self.parse_identifier()?)
8355        } else {
8356            None
8357        };
8358        Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8359            object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8360            from: None,
8361            filter: self.parse_show_statement_filter()?,
8362        }))
8363    }
8364
8365    fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8366        self.expect_keyword(SHARD)?;
8367        let id = self.parse_literal_string()?;
8368        Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8369    }
8370
8371    fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8372        let relation = self.parse_table_factor()?;
8373
8374        // Note that for keywords to be properly handled here, they need to be
8375        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
8376        // a table alias.
8377        let mut joins = vec![];
8378        loop {
8379            let join = if self.parse_keyword(CROSS) {
8380                self.expect_keyword(JOIN)?;
8381                Join {
8382                    relation: self.parse_table_factor()?,
8383                    join_operator: JoinOperator::CrossJoin,
8384                }
8385            } else {
8386                let natural = self.parse_keyword(NATURAL);
8387                let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8388                    Some(kw)
8389                } else {
8390                    None
8391                };
8392
8393                let join_operator_type = match peek_keyword {
8394                    Some(INNER) | Some(JOIN) => {
8395                        let _ = self.parse_keyword(INNER);
8396                        self.expect_keyword(JOIN)?;
8397                        JoinOperator::Inner
8398                    }
8399                    Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8400                        let _ = self.next_token();
8401                        let _ = self.parse_keyword(OUTER);
8402                        self.expect_keyword(JOIN)?;
8403                        match kw {
8404                            LEFT => JoinOperator::LeftOuter,
8405                            RIGHT => JoinOperator::RightOuter,
8406                            FULL => JoinOperator::FullOuter,
8407                            _ => unreachable!(),
8408                        }
8409                    }
8410                    Some(OUTER) => {
8411                        return self.expected(
8412                            self.peek_pos(),
8413                            "LEFT, RIGHT, or FULL",
8414                            self.peek_token(),
8415                        );
8416                    }
8417                    None if natural => {
8418                        return self.expected(
8419                            self.peek_pos(),
8420                            "a join type after NATURAL",
8421                            self.peek_token(),
8422                        );
8423                    }
8424                    _ => break,
8425                };
8426                let relation = self.parse_table_factor()?;
8427                let join_constraint = self.parse_join_constraint(natural)?;
8428                Join {
8429                    relation,
8430                    join_operator: join_operator_type(join_constraint),
8431                }
8432            };
8433            joins.push(join);
8434        }
8435        Ok(TableWithJoins { relation, joins })
8436    }
8437
8438    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
8439    fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8440        if self.parse_keyword(LATERAL) {
8441            // LATERAL must always be followed by a subquery or table function.
8442            if self.consume_token(&Token::LParen) {
8443                return self.parse_derived_table_factor(Lateral);
8444            } else if self.parse_keywords(&[ROWS, FROM]) {
8445                return self.parse_rows_from();
8446            } else {
8447                let name = self.parse_raw_name()?;
8448                self.expect_token(&Token::LParen)?;
8449                let args = self.parse_optional_args(false)?;
8450                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8451                return Ok(TableFactor::Function {
8452                    function: Function {
8453                        name,
8454                        args,
8455                        filter: None,
8456                        over: None,
8457                        distinct: false,
8458                    },
8459                    alias,
8460                    with_ordinality,
8461                });
8462            }
8463        }
8464
8465        if self.consume_token(&Token::LParen) {
8466            // A left paren introduces either a derived table (i.e., a subquery)
8467            // or a nested join. It's nearly impossible to determine ahead of
8468            // time which it is... so we just try to parse both.
8469            //
8470            // Here's an example that demonstrates the complexity:
8471            //                     /-------------------------------------------------------\
8472            //                     | /-----------------------------------\                 |
8473            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
8474            //                   ^ ^ ^ ^
8475            //                   | | | |
8476            //                   | | | |
8477            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
8478            //                   | | (3) starts a derived table (subquery)
8479            //                   | (2) starts a nested join
8480            //                   (1) an additional set of parens around a nested join
8481            //
8482
8483            // Check if the recently consumed '(' started a derived table, in
8484            // which case we've parsed the subquery, followed by the closing
8485            // ')', and the alias of the derived table. In the example above
8486            // this is case (3), and the next token would be `NATURAL`.
8487            maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8488
8489            // The '(' we've recently consumed does not start a derived table.
8490            // For valid input this can happen either when the token following
8491            // the paren can't start a query (e.g. `foo` in `FROM (foo NATURAL
8492            // JOIN bar)`, or when the '(' we've consumed is followed by another
8493            // '(' that starts a derived table, like (3), or another nested join
8494            // (2).
8495            //
8496            // Ignore the error and back up to where we were before. Either
8497            // we'll be able to parse a valid nested join, or we won't, and
8498            // we'll return that error instead.
8499            let table_and_joins = self.parse_table_and_joins()?;
8500            match table_and_joins.relation {
8501                TableFactor::NestedJoin { .. } => (),
8502                _ => {
8503                    if table_and_joins.joins.is_empty() {
8504                        // The SQL spec prohibits derived tables and bare
8505                        // tables from appearing alone in parentheses.
8506                        self.expected(self.peek_pos(), "joined table", self.peek_token())?
8507                    }
8508                }
8509            }
8510            self.expect_token(&Token::RParen)?;
8511            Ok(TableFactor::NestedJoin {
8512                join: Box::new(table_and_joins),
8513                alias: self.parse_optional_table_alias()?,
8514            })
8515        } else if self.parse_keywords(&[ROWS, FROM]) {
8516            Ok(self.parse_rows_from()?)
8517        } else {
8518            let name = self.parse_raw_name()?;
8519            if self.consume_token(&Token::LParen) {
8520                let args = self.parse_optional_args(false)?;
8521                let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8522                Ok(TableFactor::Function {
8523                    function: Function {
8524                        name,
8525                        args,
8526                        filter: None,
8527                        over: None,
8528                        distinct: false,
8529                    },
8530                    alias,
8531                    with_ordinality,
8532                })
8533            } else {
8534                Ok(TableFactor::Table {
8535                    name,
8536                    alias: self.parse_optional_table_alias()?,
8537                })
8538            }
8539        }
8540    }
8541
8542    fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8543        self.expect_token(&Token::LParen)?;
8544        let functions = self.parse_comma_separated(Parser::parse_named_function)?;
8545        self.expect_token(&Token::RParen)?;
8546        let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8547        Ok(TableFactor::RowsFrom {
8548            functions,
8549            alias,
8550            with_ordinality,
8551        })
8552    }
8553
8554    /// Parses the things that can come after the argument list of a table function call. These are
8555    /// - optional WITH ORDINALITY
8556    /// - optional table alias
8557    /// - optional WITH ORDINALITY again! This is allowed just to keep supporting our earlier buggy
8558    ///   order where we allowed WITH ORDINALITY only after the table alias. (Postgres and other
8559    ///   systems support it only before the table alias.)
8560    fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8561        let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8562        let alias = self.parse_optional_table_alias()?;
8563        let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8564        if with_ordinality_1 && with_ordinality_2 {
8565            return parser_err!(
8566                self,
8567                self.peek_prev_pos(),
8568                "WITH ORDINALITY specified twice"
8569            );
8570        }
8571        Ok((with_ordinality_1 || with_ordinality_2, alias))
8572    }
8573
8574    fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8575        let name = self.parse_raw_name()?;
8576        self.parse_function(name)
8577    }
8578
8579    fn parse_derived_table_factor(
8580        &mut self,
8581        lateral: IsLateral,
8582    ) -> Result<TableFactor<Raw>, ParserError> {
8583        let subquery = Box::new(self.parse_query()?);
8584        self.expect_token(&Token::RParen)?;
8585        let alias = self.parse_optional_table_alias()?;
8586        Ok(TableFactor::Derived {
8587            lateral: match lateral {
8588                Lateral => true,
8589                NotLateral => false,
8590            },
8591            subquery,
8592            alias,
8593        })
8594    }
8595
8596    fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8597        if natural {
8598            Ok(JoinConstraint::Natural)
8599        } else if self.parse_keyword(ON) {
8600            let constraint = self.parse_expr()?;
8601            Ok(JoinConstraint::On(constraint))
8602        } else if self.parse_keyword(USING) {
8603            let columns = self.parse_parenthesized_column_list(Mandatory)?;
8604            let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8605
8606            Ok(JoinConstraint::Using { columns, alias })
8607        } else {
8608            self.expected(
8609                self.peek_pos(),
8610                "ON, or USING after JOIN",
8611                self.peek_token(),
8612            )
8613        }
8614    }
8615
8616    /// Parse an INSERT statement
8617    fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8618        self.expect_keyword(INTO)?;
8619        let table_name = self.parse_raw_name()?;
8620        let columns = self.parse_parenthesized_column_list(Optional)?;
8621        let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8622            InsertSource::DefaultValues
8623        } else {
8624            InsertSource::Query(self.parse_query()?)
8625        };
8626        let returning = self.parse_returning()?;
8627        Ok(Statement::Insert(InsertStatement {
8628            table_name,
8629            columns,
8630            source,
8631            returning,
8632        }))
8633    }
8634
8635    fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8636        Ok(if self.parse_keyword(RETURNING) {
8637            self.parse_comma_separated(Parser::parse_select_item)?
8638        } else {
8639            Vec::new()
8640        })
8641    }
8642
8643    fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8644        let table_name = RawItemName::Name(self.parse_item_name()?);
8645        // The alias here doesn't support columns, so don't use parse_optional_table_alias.
8646        let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8647        let alias = alias.map(|name| TableAlias {
8648            name,
8649            columns: Vec::new(),
8650            strict: false,
8651        });
8652
8653        self.expect_keyword(SET)?;
8654        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8655        let selection = if self.parse_keyword(WHERE) {
8656            Some(self.parse_expr()?)
8657        } else {
8658            None
8659        };
8660
8661        Ok(Statement::Update(UpdateStatement {
8662            table_name,
8663            alias,
8664            assignments,
8665            selection,
8666        }))
8667    }
8668
8669    /// Parse a `var = expr` assignment, used in an UPDATE statement
8670    fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8671        let id = self.parse_identifier()?;
8672        self.expect_token(&Token::Eq)?;
8673        let value = self.parse_expr()?;
8674        Ok(Assignment { id, value })
8675    }
8676
8677    fn parse_optional_args(
8678        &mut self,
8679        allow_order_by: bool,
8680    ) -> Result<FunctionArgs<Raw>, ParserError> {
8681        if self.consume_token(&Token::Star) {
8682            self.expect_token(&Token::RParen)?;
8683            Ok(FunctionArgs::Star)
8684        } else if self.consume_token(&Token::RParen) {
8685            Ok(FunctionArgs::args(vec![]))
8686        } else {
8687            let args = self.parse_comma_separated(Parser::parse_expr)?;
8688            // ORDER BY can only appear after at least one argument, and not after a
8689            // star. We can ignore checking for it in the other branches. See:
8690            // https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES
8691            let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8692                self.parse_comma_separated(Parser::parse_order_by_expr)?
8693            } else {
8694                vec![]
8695            };
8696            self.expect_token(&Token::RParen)?;
8697            Ok(FunctionArgs::Args { args, order_by })
8698        }
8699    }
8700
8701    /// Parse `AS OF`, if present.
8702    fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8703        if self.parse_keyword(AS) {
8704            self.expect_keyword(OF)?;
8705            if self.parse_keywords(&[AT, LEAST]) {
8706                match self.parse_expr() {
8707                    Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8708                    Err(e) => self.expected(
8709                        e.pos,
8710                        "a timestamp value after 'AS OF AT LEAST'",
8711                        self.peek_token(),
8712                    ),
8713                }
8714            } else {
8715                match self.parse_expr() {
8716                    Ok(expr) => Ok(Some(AsOf::At(expr))),
8717                    Err(e) => {
8718                        self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8719                    }
8720                }
8721            }
8722        } else {
8723            Ok(None)
8724        }
8725    }
8726
8727    /// Parse `UP TO`, if present
8728    fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
8729        if self.parse_keyword(UP) {
8730            self.expect_keyword(TO)?;
8731            self.parse_expr().map(Some)
8732        } else {
8733            Ok(None)
8734        }
8735    }
8736
8737    /// Parse `AS OF`, if present.
8738    ///
8739    /// In contrast to `parse_optional_as_of`, this parser only supports `AS OF <time>` syntax and
8740    /// directly returns an `u64`. It is only meant to be used for internal SQL syntax.
8741    fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
8742        fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
8743            let value = parser.parse_value().ok()?;
8744            let Value::Number(s) = value else { return None };
8745            s.parse().ok()
8746        }
8747
8748        if self.parse_keywords(&[AS, OF]) {
8749            match try_parse_u64(self) {
8750                Some(time) => Ok(Some(time)),
8751                None => {
8752                    self.prev_token();
8753                    self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
8754                }
8755            }
8756        } else {
8757            Ok(None)
8758        }
8759    }
8760
8761    /// Parse a comma-delimited list of projections after SELECT
8762    fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
8763        if self.consume_token(&Token::Star) {
8764            return Ok(SelectItem::Wildcard);
8765        }
8766        Ok(SelectItem::Expr {
8767            expr: self.parse_expr()?,
8768            alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
8769        })
8770    }
8771
8772    /// Parse an expression, optionally followed by ASC or DESC,
8773    /// and then `[NULLS { FIRST | LAST }]` (used in ORDER BY)
8774    fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
8775        let expr = self.parse_expr()?;
8776
8777        let asc = if self.parse_keyword(ASC) {
8778            Some(true)
8779        } else if self.parse_keyword(DESC) {
8780            Some(false)
8781        } else {
8782            None
8783        };
8784
8785        let nulls_last = if self.parse_keyword(NULLS) {
8786            let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
8787            Some(last)
8788        } else {
8789            None
8790        };
8791
8792        Ok(OrderByExpr {
8793            expr,
8794            asc,
8795            nulls_last,
8796        })
8797    }
8798
8799    fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
8800        let values = self.parse_comma_separated(|parser| {
8801            parser.expect_token(&Token::LParen)?;
8802            let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8803            parser.expect_token(&Token::RParen)?;
8804            Ok(exprs)
8805        })?;
8806        Ok(Values(values))
8807    }
8808
8809    fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
8810        self.expect_keyword(TRANSACTION)?;
8811        Ok(Statement::StartTransaction(StartTransactionStatement {
8812            modes: self.parse_transaction_modes(false)?,
8813        }))
8814    }
8815
8816    fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
8817        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8818        Ok(Statement::StartTransaction(StartTransactionStatement {
8819            modes: self.parse_transaction_modes(false)?,
8820        }))
8821    }
8822
8823    fn parse_transaction_modes(
8824        &mut self,
8825        mut required: bool,
8826    ) -> Result<Vec<TransactionMode>, ParserError> {
8827        let mut modes = vec![];
8828        loop {
8829            let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
8830                let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
8831                    TransactionIsolationLevel::ReadUncommitted
8832                } else if self.parse_keywords(&[READ, COMMITTED]) {
8833                    TransactionIsolationLevel::ReadCommitted
8834                } else if self.parse_keywords(&[REPEATABLE, READ]) {
8835                    TransactionIsolationLevel::RepeatableRead
8836                } else if self.parse_keyword(SERIALIZABLE) {
8837                    TransactionIsolationLevel::Serializable
8838                } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
8839                    TransactionIsolationLevel::StrongSessionSerializable
8840                } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
8841                    TransactionIsolationLevel::StrictSerializable
8842                } else {
8843                    self.expected(self.peek_pos(), "isolation level", self.peek_token())?
8844                };
8845                TransactionMode::IsolationLevel(iso_level)
8846            } else if self.parse_keywords(&[READ, ONLY]) {
8847                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8848            } else if self.parse_keywords(&[READ, WRITE]) {
8849                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8850            } else if required {
8851                self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
8852            } else {
8853                break;
8854            };
8855            modes.push(mode);
8856            // ANSI requires a comma after each transaction mode, but
8857            // PostgreSQL, for historical reasons, does not. We follow
8858            // PostgreSQL in making the comma optional, since that is strictly
8859            // more general.
8860            required = self.consume_token(&Token::Comma);
8861        }
8862        Ok(modes)
8863    }
8864
8865    fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
8866        Ok(Statement::Commit(CommitStatement {
8867            chain: self.parse_commit_rollback_chain()?,
8868        }))
8869    }
8870
8871    fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
8872        Ok(Statement::Rollback(RollbackStatement {
8873            chain: self.parse_commit_rollback_chain()?,
8874        }))
8875    }
8876
8877    fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
8878        let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8879        if self.parse_keyword(AND) {
8880            let chain = !self.parse_keyword(NO);
8881            self.expect_keyword(CHAIN)?;
8882            Ok(chain)
8883        } else {
8884            Ok(false)
8885        }
8886    }
8887
8888    fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
8889        parser_err!(
8890            self,
8891            self.peek_prev_pos(),
8892            "TAIL has been renamed to SUBSCRIBE"
8893        )
8894    }
8895
8896    fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
8897        let _ = self.parse_keyword(TO);
8898        let relation = if self.consume_token(&Token::LParen) {
8899            let query = self.parse_query()?;
8900            self.expect_token(&Token::RParen)?;
8901            SubscribeRelation::Query(query)
8902        } else {
8903            SubscribeRelation::Name(self.parse_raw_name()?)
8904        };
8905        let mut output = self.parse_subscribe_output()?;
8906        let options = if self.parse_keyword(WITH) {
8907            self.expect_token(&Token::LParen)?;
8908            let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
8909            self.expect_token(&Token::RParen)?;
8910            options
8911        } else {
8912            vec![]
8913        };
8914        let as_of = self.parse_optional_as_of()?;
8915        let up_to = self.parse_optional_up_to()?;
8916        // For backwards compatibility, we allow parsing output options
8917        // (`ENVELOPE`, `WITHIN TIMESTAMP ORDER BY`) at the end of the
8918        // statement, if they haven't already been specified where we prefer
8919        // them, before the `WITH` options and before the `AS OF`/`UP TO`
8920        // options. Our preferred syntax better aligns with the option ordering
8921        // for `CREATE SINK` and `SELECT`.
8922        if output == SubscribeOutput::Diffs {
8923            output = self.parse_subscribe_output()?;
8924        }
8925        Ok(Statement::Subscribe(SubscribeStatement {
8926            relation,
8927            options,
8928            as_of,
8929            up_to,
8930            output,
8931        }))
8932    }
8933
8934    fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
8935        let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
8936            PROGRESS => SubscribeOptionName::Progress,
8937            SNAPSHOT => SubscribeOptionName::Snapshot,
8938            _ => unreachable!(),
8939        };
8940        Ok(SubscribeOption {
8941            name,
8942            value: self.parse_optional_option_value()?,
8943        })
8944    }
8945
8946    fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
8947        if self.parse_keywords(&[ENVELOPE]) {
8948            let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
8949            self.expect_token(&Token::LParen)?;
8950            self.expect_keyword(KEY)?;
8951            let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
8952            let output = match keyword {
8953                UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
8954                DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
8955                _ => unreachable!("no other keyword allowed"),
8956            };
8957            self.expect_token(&Token::RParen)?;
8958            Ok(output)
8959        } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
8960            Ok(SubscribeOutput::WithinTimestampOrderBy {
8961                order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
8962            })
8963        } else {
8964            Ok(SubscribeOutput::Diffs)
8965        }
8966    }
8967
8968    /// Parse an `EXPLAIN` statement, assuming that the `EXPLAIN` token
8969    /// has already been consumed.
8970    fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8971        if self.parse_keyword(TIMESTAMP) {
8972            self.parse_explain_timestamp()
8973                .map_parser_err(StatementKind::ExplainTimestamp)
8974        } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
8975            self.parse_explain_pushdown()
8976                .map_parser_err(StatementKind::ExplainPushdown)
8977        } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
8978            self.parse_explain_analyze()
8979                .map_parser_err(StatementKind::ExplainAnalyzeObject)
8980        } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
8981            self.parse_explain_schema()
8982                .map_parser_err(StatementKind::ExplainSinkSchema)
8983        } else {
8984            self.parse_explain_plan()
8985                .map_parser_err(StatementKind::ExplainPlan)
8986        }
8987    }
8988
8989    fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
8990        let explainee = if self.parse_keyword(VIEW) {
8991            // Parse: `VIEW name`
8992            Explainee::View(self.parse_raw_name()?)
8993        } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
8994            // Parse: `MATERIALIZED VIEW name`
8995            Explainee::MaterializedView(self.parse_raw_name()?)
8996        } else if self.parse_keyword(INDEX) {
8997            // Parse: `INDEX name`
8998            Explainee::Index(self.parse_raw_name()?)
8999        } else if self.parse_keywords(&[REPLAN, VIEW]) {
9000            // Parse: `REPLAN VIEW name`
9001            Explainee::ReplanView(self.parse_raw_name()?)
9002        } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9003            // Parse: `REPLAN MATERIALIZED VIEW name`
9004            Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9005        } else if self.parse_keywords(&[REPLAN, INDEX]) {
9006            // Parse: `REPLAN INDEX name`
9007            Explainee::ReplanIndex(self.parse_raw_name()?)
9008        } else {
9009            let broken = self.parse_keyword(BROKEN);
9010
9011            if self.peek_keywords(&[CREATE, VIEW])
9012                || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9013            {
9014                // Parse: `BROKEN? CREATE [OR REPLACE] VIEW ...`
9015                let _ = self.parse_keyword(CREATE); // consume CREATE token
9016                let stmt = match self.parse_create_view()? {
9017                    Statement::CreateView(stmt) => stmt,
9018                    _ => panic!("Unexpected statement type return after parsing"),
9019                };
9020
9021                Explainee::CreateView(Box::new(stmt), broken)
9022            } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9023                || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9024            {
9025                // Parse: `BROKEN? CREATE [OR REPLACE] MATERIALIZED VIEW ...`
9026                let _ = self.parse_keyword(CREATE); // consume CREATE token
9027                let stmt = match self.parse_create_materialized_view()? {
9028                    Statement::CreateMaterializedView(stmt) => stmt,
9029                    _ => panic!("Unexpected statement type return after parsing"),
9030                };
9031
9032                Explainee::CreateMaterializedView(Box::new(stmt), broken)
9033            } else if self.peek_keywords(&[CREATE, INDEX])
9034                || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9035            {
9036                // Parse: `BROKEN? CREATE INDEX ...`
9037                let _ = self.parse_keyword(CREATE); // consume CREATE token
9038                let stmt = match self.parse_create_index()? {
9039                    Statement::CreateIndex(stmt) => stmt,
9040                    _ => panic!("Unexpected statement type return after parsing"),
9041                };
9042
9043                Explainee::CreateIndex(Box::new(stmt), broken)
9044            } else if self.peek_keyword(SUBSCRIBE) {
9045                // Parse: `BROKEN? SUBSCRIBE ...`
9046                let _ = self.parse_keyword(SUBSCRIBE); // consume SUBSCRIBE token
9047                let stmt = match self.parse_subscribe()? {
9048                    Statement::Subscribe(stmt) => stmt,
9049                    _ => panic!("Unexpected statement type return after parsing"),
9050                };
9051                Explainee::Subscribe(Box::new(stmt), broken)
9052            } else {
9053                // Parse: `BROKEN? query`
9054                let query = self.parse_select_statement()?;
9055                Explainee::Select(Box::new(query), broken)
9056            }
9057        };
9058        Ok(explainee)
9059    }
9060
9061    /// Parse an `EXPLAIN ... PLAN` statement, assuming that the `EXPLAIN` token
9062    /// has already been consumed.
9063    fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9064        let start = self.peek_pos();
9065        let (has_stage, stage) = match self.parse_one_of_keywords(&[
9066            RAW,
9067            DECORRELATED,
9068            LOCALLY,
9069            OPTIMIZED,
9070            PHYSICAL,
9071            OPTIMIZER,
9072            PLAN,
9073        ]) {
9074            Some(RAW) => {
9075                self.expect_keyword(PLAN)?;
9076                (true, Some(ExplainStage::RawPlan))
9077            }
9078            Some(DECORRELATED) => {
9079                self.expect_keyword(PLAN)?;
9080                (true, Some(ExplainStage::DecorrelatedPlan))
9081            }
9082            Some(LOCALLY) => {
9083                self.expect_keywords(&[OPTIMIZED, PLAN])?;
9084                (true, Some(ExplainStage::LocalPlan))
9085            }
9086            Some(OPTIMIZED) => {
9087                self.expect_keyword(PLAN)?;
9088                (true, Some(ExplainStage::GlobalPlan))
9089            }
9090            Some(PHYSICAL) => {
9091                self.expect_keyword(PLAN)?;
9092                (true, Some(ExplainStage::PhysicalPlan))
9093            }
9094            Some(OPTIMIZER) => {
9095                self.expect_keyword(TRACE)?;
9096                (true, Some(ExplainStage::Trace))
9097            }
9098            Some(PLAN) => {
9099                if self.parse_keyword(INSIGHTS) {
9100                    (true, Some(ExplainStage::PlanInsights))
9101                } else {
9102                    // Use the default plan for the explainee.
9103                    (true, None)
9104                }
9105            }
9106            None => {
9107                // Use the default plan for the explainee.
9108                (false, None)
9109            }
9110            _ => unreachable!(),
9111        };
9112
9113        let with_options = if self.parse_keyword(WITH) {
9114            if self.consume_token(&Token::LParen) {
9115                let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9116                self.expect_token(&Token::RParen)?;
9117                options
9118            } else {
9119                self.prev_token(); // push back WITH in case it's actually a CTE
9120                vec![]
9121            }
9122        } else {
9123            vec![]
9124        };
9125
9126        let format = if self.parse_keyword(AS) {
9127            match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9128                Some(TEXT) => Some(ExplainFormat::Text),
9129                Some(JSON) => Some(ExplainFormat::Json),
9130                Some(DOT) => Some(ExplainFormat::Dot),
9131                Some(VERBOSE) => {
9132                    self.expect_keyword(TEXT)?;
9133                    Some(ExplainFormat::VerboseText)
9134                }
9135                None => return Err(ParserError::new(self.index, "expected a format")),
9136                _ => unreachable!(),
9137            }
9138        } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9139            // if EXPLAIN PHYSICAL PLAN is explicitly specified without AS, default to VERBOSE TEXT
9140            Some(ExplainFormat::VerboseText)
9141        } else {
9142            None
9143        };
9144
9145        if has_stage {
9146            self.expect_keyword(FOR)?;
9147        }
9148
9149        let explainee = self.parse_explainee()?;
9150
9151        // Explainees that represent a view only work in association with an
9152        // explicitly defined stage.
9153        if matches!((explainee.is_view(), &stage), (true, None)) {
9154            let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9155            return Err(self.error(start, msg));
9156        }
9157
9158        Ok(Statement::ExplainPlan(ExplainPlanStatement {
9159            stage,
9160            with_options,
9161            format,
9162            explainee,
9163        }))
9164    }
9165
9166    fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9167        Ok(ExplainPlanOption {
9168            name: self.parse_explain_plan_option_name()?,
9169            value: self.parse_optional_option_value()?,
9170        })
9171    }
9172
9173    /// Parse an `EXPLAIN FILTER PUSHDOWN` statement, assuming that the `EXPLAIN
9174    /// PUSHDOWN` tokens have already been consumed.
9175    fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9176        self.expect_keyword(FOR)?;
9177
9178        let explainee = self.parse_explainee()?;
9179
9180        Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9181            explainee,
9182        }))
9183    }
9184
9185    fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9186        // EXPLAIN ANALYZE CLUSTER (MEMORY | CPU) [WITH SKEW] [AS SQL]
9187        if self.parse_keyword(CLUSTER) {
9188            let properties = self.parse_explain_analyze_computation_properties()?;
9189            let as_sql = self.parse_keywords(&[AS, SQL]);
9190            return Ok(Statement::ExplainAnalyzeCluster(
9191                ExplainAnalyzeClusterStatement { properties, as_sql },
9192            ));
9193        }
9194
9195        // EXPLAIN ANALYZE ((MEMORY | CPU) [WITH SKEW] | HINTS) FOR (INDEX ... | MATERIALIZED VIEW ...) [AS SQL]
9196
9197        let properties = if self.parse_keyword(HINTS) {
9198            ExplainAnalyzeProperty::Hints
9199        } else {
9200            ExplainAnalyzeProperty::Computation(
9201                self.parse_explain_analyze_computation_properties()?,
9202            )
9203        };
9204
9205        self.expect_keyword(FOR)?;
9206
9207        let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9208            INDEX => Explainee::Index(self.parse_raw_name()?),
9209            MATERIALIZED => {
9210                self.expect_keyword(VIEW)?;
9211                Explainee::MaterializedView(self.parse_raw_name()?)
9212            }
9213            _ => unreachable!(),
9214        };
9215
9216        let as_sql = self.parse_keywords(&[AS, SQL]);
9217
9218        Ok(Statement::ExplainAnalyzeObject(
9219            ExplainAnalyzeObjectStatement {
9220                properties,
9221                explainee,
9222                as_sql,
9223            },
9224        ))
9225    }
9226
9227    fn parse_explain_analyze_computation_properties(
9228        &mut self,
9229    ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9230        let mut computation_properties = vec![CPU, MEMORY];
9231        let (kw, property) =
9232            self.parse_explain_analyze_computation_property(&computation_properties)?;
9233        let mut properties = vec![property];
9234        computation_properties.retain(|p| p != &kw);
9235
9236        while self.consume_token(&Token::Comma) {
9237            let (kw, property) =
9238                self.parse_explain_analyze_computation_property(&computation_properties)?;
9239            computation_properties.retain(|p| p != &kw);
9240            properties.push(property);
9241        }
9242
9243        let skew = self.parse_keywords(&[WITH, SKEW]);
9244
9245        Ok(ExplainAnalyzeComputationProperties { properties, skew })
9246    }
9247
9248    fn parse_explain_analyze_computation_property(
9249        &mut self,
9250        properties: &[Keyword],
9251    ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9252        if properties.is_empty() {
9253            return Err(ParserError::new(
9254                self.peek_pos(),
9255                "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9256            ));
9257        }
9258
9259        match self.expect_one_of_keywords(properties)? {
9260            CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9261            MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9262            _ => unreachable!(),
9263        }
9264    }
9265
9266    /// Parse an `EXPLAIN TIMESTAMP` statement, assuming that the `EXPLAIN
9267    /// TIMESTAMP` tokens have already been consumed.
9268    fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9269        let format = if self.parse_keyword(AS) {
9270            match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9271                Some(TEXT) => Some(ExplainFormat::Text),
9272                Some(JSON) => Some(ExplainFormat::Json),
9273                None => return Err(ParserError::new(self.index, "expected a format")),
9274                _ => unreachable!(),
9275            }
9276        } else {
9277            None
9278        };
9279
9280        self.expect_keyword(FOR)?;
9281
9282        let query = self.parse_select_statement()?;
9283
9284        Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9285            format,
9286            select: query,
9287        }))
9288    }
9289    /// Parse an `EXPLAIN [KEY|VALUE] SCHEMA` statement assuming that the `EXPLAIN` token
9290    /// have already been consumed
9291    fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9292        let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9293            KEY => ExplainSinkSchemaFor::Key,
9294            VALUE => ExplainSinkSchemaFor::Value,
9295            _ => unreachable!(),
9296        };
9297
9298        self.expect_keyword(SCHEMA)?;
9299
9300        let format = if self.parse_keyword(AS) {
9301            // only json format is supported
9302            self.expect_keyword(JSON)?;
9303            Some(ExplainFormat::Json)
9304        } else {
9305            None
9306        };
9307
9308        self.expect_keywords(&[FOR, CREATE])?;
9309
9310        if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9311            Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9312                schema_for,
9313                format,
9314                statement,
9315            }))
9316        } else {
9317            unreachable!("only create sink can be returned here");
9318        }
9319    }
9320
9321    /// Parse a `DECLARE` statement, assuming that the `DECLARE` token
9322    /// has already been consumed.
9323    fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9324        let name = self
9325            .parse_identifier()
9326            .map_parser_err(StatementKind::Declare)?;
9327        self.expect_keyword(CURSOR)
9328            .map_parser_err(StatementKind::Declare)?;
9329        if self.parse_keyword(WITH) {
9330            let err = parser_err!(
9331                self,
9332                self.peek_prev_pos(),
9333                format!("WITH HOLD is unsupported for cursors")
9334            )
9335            .map_parser_err(StatementKind::Declare);
9336            self.expect_keyword(HOLD)
9337                .map_parser_err(StatementKind::Declare)?;
9338            return err;
9339        }
9340        // WITHOUT HOLD is optional and the default behavior so we can ignore it.
9341        let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9342        self.expect_keyword(FOR)
9343            .map_parser_err(StatementKind::Declare)?;
9344        let StatementParseResult { ast, sql } = self.parse_statement()?;
9345        Ok(Statement::Declare(DeclareStatement {
9346            name,
9347            stmt: Box::new(ast),
9348            sql: sql.to_string(),
9349        }))
9350    }
9351
9352    /// Parse a `CLOSE` statement, assuming that the `CLOSE` token
9353    /// has already been consumed.
9354    fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9355        let name = self.parse_identifier()?;
9356        Ok(Statement::Close(CloseStatement { name }))
9357    }
9358
9359    /// Parse a `PREPARE` statement, assuming that the `PREPARE` token
9360    /// has already been consumed.
9361    fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9362        let name = self
9363            .parse_identifier()
9364            .map_parser_err(StatementKind::Prepare)?;
9365        self.expect_keyword(AS)
9366            .map_parser_err(StatementKind::Prepare)?;
9367        let pos = self.peek_pos();
9368        //
9369        let StatementParseResult { ast, sql } = self.parse_statement()?;
9370        if !matches!(
9371            ast,
9372            Statement::Select(_)
9373                | Statement::Insert(_)
9374                | Statement::Delete(_)
9375                | Statement::Update(_)
9376                | Statement::Fetch(_),
9377        ) {
9378            return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9379        }
9380        Ok(Statement::Prepare(PrepareStatement {
9381            name,
9382            stmt: Box::new(ast),
9383            sql: sql.to_string(),
9384        }))
9385    }
9386
9387    /// Parse a `EXECUTE` statement, assuming that the `EXECUTE` token
9388    /// has already been consumed.
9389    fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9390        let name = self.parse_identifier()?;
9391        let params = if self.consume_token(&Token::LParen) {
9392            let params = self.parse_comma_separated(Parser::parse_expr)?;
9393            self.expect_token(&Token::RParen)?;
9394            params
9395        } else {
9396            Vec::new()
9397        };
9398        Ok(Statement::Execute(ExecuteStatement { name, params }))
9399    }
9400
9401    /// Parse a `DEALLOCATE` statement, assuming that the `DEALLOCATE` token
9402    /// has already been consumed.
9403    fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9404        let _ = self.parse_keyword(PREPARE);
9405        let name = if self.parse_keyword(ALL) {
9406            None
9407        } else {
9408            Some(self.parse_identifier()?)
9409        };
9410        Ok(Statement::Deallocate(DeallocateStatement { name }))
9411    }
9412
9413    /// Parse a `FETCH` statement, assuming that the `FETCH` token
9414    /// has already been consumed.
9415    fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9416        let _ = self.parse_keyword(FORWARD);
9417        let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9418            Some(FetchDirection::ForwardCount(count))
9419        } else if self.parse_keyword(ALL) {
9420            Some(FetchDirection::ForwardAll)
9421        } else {
9422            None
9423        };
9424        let _ = self.parse_keyword(FROM);
9425        let name = self.parse_identifier()?;
9426        let options = if self.parse_keyword(WITH) {
9427            self.expect_token(&Token::LParen)?;
9428            let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9429            self.expect_token(&Token::RParen)?;
9430            options
9431        } else {
9432            vec![]
9433        };
9434        Ok(Statement::Fetch(FetchStatement {
9435            name,
9436            count,
9437            options,
9438        }))
9439    }
9440
9441    fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9442        self.expect_keyword(TIMEOUT)?;
9443        Ok(FetchOption {
9444            name: FetchOptionName::Timeout,
9445            value: self.parse_optional_option_value()?,
9446        })
9447    }
9448
9449    /// Parse a `RAISE` statement, assuming that the `RAISE` token
9450    /// has already been consumed.
9451    fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9452        let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9453            Some(DEBUG) => NoticeSeverity::Debug,
9454            Some(INFO) => NoticeSeverity::Info,
9455            Some(LOG) => NoticeSeverity::Log,
9456            Some(NOTICE) => NoticeSeverity::Notice,
9457            Some(WARNING) => NoticeSeverity::Warning,
9458            Some(_) => unreachable!(),
9459            None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9460        };
9461
9462        Ok(Statement::Raise(RaiseStatement { severity }))
9463    }
9464
9465    /// Parse a `GRANT` statement, assuming that the `GRANT` token
9466    /// has already been consumed.
9467    fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9468        match self.parse_privilege_specification() {
9469            Some(privileges) => self
9470                .parse_grant_privilege(privileges)
9471                .map_parser_err(StatementKind::GrantPrivileges),
9472            None => self
9473                .parse_grant_role()
9474                .map_parser_err(StatementKind::GrantRole),
9475        }
9476    }
9477
9478    /// Parse a `GRANT PRIVILEGE` statement, assuming that the `GRANT` token
9479    /// and all privileges have already been consumed.
9480    fn parse_grant_privilege(
9481        &mut self,
9482        privileges: PrivilegeSpecification,
9483    ) -> Result<Statement<Raw>, ParserError> {
9484        self.expect_keyword(ON)?;
9485        let target = self.expect_grant_target_specification("GRANT")?;
9486        self.expect_keyword(TO)?;
9487        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9488        Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9489            privileges,
9490            target,
9491            roles,
9492        }))
9493    }
9494
9495    /// Parse a `GRANT ROLE` statement, assuming that the `GRANT` token
9496    /// has already been consumed.
9497    fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9498        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9499        self.expect_keyword(TO)?;
9500        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9501        Ok(Statement::GrantRole(GrantRoleStatement {
9502            role_names,
9503            member_names,
9504        }))
9505    }
9506
9507    /// Parse a `REVOKE` statement, assuming that the `REVOKE` token
9508    /// has already been consumed.
9509    fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9510        match self.parse_privilege_specification() {
9511            Some(privileges) => self
9512                .parse_revoke_privilege(privileges)
9513                .map_parser_err(StatementKind::RevokePrivileges),
9514            None => self
9515                .parse_revoke_role()
9516                .map_parser_err(StatementKind::RevokeRole),
9517        }
9518    }
9519
9520    /// Parse a `REVOKE PRIVILEGE` statement, assuming that the `REVOKE` token
9521    /// and all privileges have already been consumed.
9522    fn parse_revoke_privilege(
9523        &mut self,
9524        privileges: PrivilegeSpecification,
9525    ) -> Result<Statement<Raw>, ParserError> {
9526        self.expect_keyword(ON)?;
9527        let target = self.expect_grant_target_specification("REVOKE")?;
9528        self.expect_keyword(FROM)?;
9529        let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9530        Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9531            privileges,
9532            target,
9533            roles,
9534        }))
9535    }
9536
9537    /// Parse a `REVOKE ROLE` statement, assuming that the `REVOKE` token
9538    /// has already been consumed.
9539    fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9540        let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9541        self.expect_keyword(FROM)?;
9542        let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9543        Ok(Statement::RevokeRole(RevokeRoleStatement {
9544            role_names,
9545            member_names,
9546        }))
9547    }
9548
9549    fn expect_grant_target_specification(
9550        &mut self,
9551        statement_type: &str,
9552    ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9553        if self.parse_keyword(SYSTEM) {
9554            return Ok(GrantTargetSpecification::System);
9555        }
9556
9557        let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9558            let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9559            let object_spec_inner = if self.parse_keyword(IN) {
9560                if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9561                    return parser_err!(
9562                        self,
9563                        self.peek_prev_pos(),
9564                        format!("IN invalid for {object_type}S")
9565                    );
9566                }
9567                match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9568                    DATABASE => GrantTargetSpecificationInner::All(
9569                        GrantTargetAllSpecification::AllDatabases {
9570                            databases: self.parse_comma_separated(Parser::parse_database_name)?,
9571                        },
9572                    ),
9573                    SCHEMA => {
9574                        if object_type == ObjectType::Schema {
9575                            self.prev_token();
9576                            self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9577                        }
9578                        GrantTargetSpecificationInner::All(
9579                            GrantTargetAllSpecification::AllSchemas {
9580                                schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9581                            },
9582                        )
9583                    }
9584                    _ => unreachable!(),
9585                }
9586            } else {
9587                GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9588            };
9589            (object_type, object_spec_inner)
9590        } else {
9591            let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9592            let object_spec_inner = GrantTargetSpecificationInner::Objects {
9593                names: self
9594                    .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9595            };
9596            (object_type, object_spec_inner)
9597        };
9598
9599        Ok(GrantTargetSpecification::Object {
9600            object_type,
9601            object_spec_inner,
9602        })
9603    }
9604
9605    /// Bail out if the current token is not an object type suitable for a GRANT/REVOKE, or consume
9606    /// and return it if it is.
9607    fn expect_grant_revoke_object_type(
9608        &mut self,
9609        statement_type: &str,
9610    ) -> Result<ObjectType, ParserError> {
9611        // If the object type is omitted, then it is assumed to be a table.
9612        let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9613        self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9614    }
9615
9616    /// Bail out if the current token is not a plural object type suitable for a GRANT/REVOKE, or consume
9617    /// and return it if it is.
9618    fn expect_grant_revoke_plural_object_type(
9619        &mut self,
9620        statement_type: &str,
9621    ) -> Result<ObjectType, ParserError> {
9622        let object_type = self.expect_plural_object_type().map_err(|_| {
9623            // Limit the error message to allowed object types.
9624            self.expected::<_, ObjectType>(
9625                self.peek_pos(),
9626                "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9627                self.peek_token(),
9628            )
9629                .unwrap_err()
9630        })?;
9631        self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
9632        Ok(object_type)
9633    }
9634
9635    fn expect_grant_revoke_object_type_inner(
9636        &self,
9637        statement_type: &str,
9638        object_type: ObjectType,
9639    ) -> Result<ObjectType, ParserError> {
9640        match object_type {
9641            ObjectType::View
9642            | ObjectType::MaterializedView
9643            | ObjectType::Source
9644            | ObjectType::ContinualTask => {
9645                parser_err!(
9646                    self,
9647                    self.peek_prev_pos(),
9648                    format!(
9649                        "For object type {object_type}, you must specify 'TABLE' or omit the object type"
9650                    )
9651                )
9652            }
9653            ObjectType::Sink
9654            | ObjectType::Index
9655            | ObjectType::ClusterReplica
9656            | ObjectType::Role
9657            | ObjectType::Func
9658            | ObjectType::Subsource => {
9659                parser_err!(
9660                    self,
9661                    self.peek_prev_pos(),
9662                    format!("Unsupported {statement_type} on {object_type}")
9663                )
9664            }
9665            ObjectType::Table
9666            | ObjectType::Type
9667            | ObjectType::Cluster
9668            | ObjectType::Secret
9669            | ObjectType::Connection
9670            | ObjectType::Database
9671            | ObjectType::Schema
9672            | ObjectType::NetworkPolicy => Ok(object_type),
9673        }
9674    }
9675
9676    /// Bail out if the current token is not an object type, or consume and return it if it is.
9677    fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
9678        Ok(
9679            match self.expect_one_of_keywords(&[
9680                TABLE,
9681                VIEW,
9682                MATERIALIZED,
9683                SOURCE,
9684                SINK,
9685                INDEX,
9686                TYPE,
9687                ROLE,
9688                USER,
9689                CLUSTER,
9690                SECRET,
9691                CONNECTION,
9692                DATABASE,
9693                SCHEMA,
9694                FUNCTION,
9695                CONTINUAL,
9696                NETWORK,
9697            ])? {
9698                TABLE => ObjectType::Table,
9699                VIEW => ObjectType::View,
9700                MATERIALIZED => {
9701                    if let Err(e) = self.expect_keyword(VIEW) {
9702                        self.prev_token();
9703                        return Err(e);
9704                    }
9705                    ObjectType::MaterializedView
9706                }
9707                SOURCE => ObjectType::Source,
9708                SINK => ObjectType::Sink,
9709                INDEX => ObjectType::Index,
9710                TYPE => ObjectType::Type,
9711                ROLE | USER => ObjectType::Role,
9712                CLUSTER => {
9713                    if self.parse_keyword(REPLICA) {
9714                        ObjectType::ClusterReplica
9715                    } else {
9716                        ObjectType::Cluster
9717                    }
9718                }
9719                SECRET => ObjectType::Secret,
9720                CONNECTION => ObjectType::Connection,
9721                DATABASE => ObjectType::Database,
9722                SCHEMA => ObjectType::Schema,
9723                FUNCTION => ObjectType::Func,
9724                CONTINUAL => {
9725                    if let Err(e) = self.expect_keyword(TASK) {
9726                        self.prev_token();
9727                        return Err(e);
9728                    }
9729                    ObjectType::ContinualTask
9730                }
9731                NETWORK => {
9732                    if let Err(e) = self.expect_keyword(POLICY) {
9733                        self.prev_token();
9734                        return Err(e);
9735                    }
9736                    ObjectType::NetworkPolicy
9737                }
9738                _ => unreachable!(),
9739            },
9740        )
9741    }
9742
9743    /// Look for an object type and return it if it matches.
9744    fn parse_object_type(&mut self) -> Option<ObjectType> {
9745        Some(
9746            match self.parse_one_of_keywords(&[
9747                TABLE,
9748                VIEW,
9749                MATERIALIZED,
9750                SOURCE,
9751                SINK,
9752                INDEX,
9753                TYPE,
9754                ROLE,
9755                USER,
9756                CLUSTER,
9757                SECRET,
9758                CONNECTION,
9759                DATABASE,
9760                SCHEMA,
9761                FUNCTION,
9762            ])? {
9763                TABLE => ObjectType::Table,
9764                VIEW => ObjectType::View,
9765                MATERIALIZED => {
9766                    if self.parse_keyword(VIEW) {
9767                        ObjectType::MaterializedView
9768                    } else {
9769                        self.prev_token();
9770                        return None;
9771                    }
9772                }
9773                SOURCE => ObjectType::Source,
9774                SINK => ObjectType::Sink,
9775                INDEX => ObjectType::Index,
9776                TYPE => ObjectType::Type,
9777                ROLE | USER => ObjectType::Role,
9778                CLUSTER => {
9779                    if self.parse_keyword(REPLICA) {
9780                        ObjectType::ClusterReplica
9781                    } else {
9782                        ObjectType::Cluster
9783                    }
9784                }
9785                SECRET => ObjectType::Secret,
9786                CONNECTION => ObjectType::Connection,
9787                DATABASE => ObjectType::Database,
9788                SCHEMA => ObjectType::Schema,
9789                FUNCTION => ObjectType::Func,
9790                _ => unreachable!(),
9791            },
9792        )
9793    }
9794
9795    /// Bail out if the current token is not an object type in the plural form, or consume and return it if it is.
9796    fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
9797        Ok(
9798            match self.expect_one_of_keywords(&[
9799                TABLES,
9800                VIEWS,
9801                MATERIALIZED,
9802                SOURCES,
9803                SINKS,
9804                INDEXES,
9805                TYPES,
9806                ROLES,
9807                USERS,
9808                CLUSTER,
9809                CLUSTERS,
9810                SECRETS,
9811                CONNECTIONS,
9812                DATABASES,
9813                SCHEMAS,
9814                POLICIES,
9815            ])? {
9816                TABLES => ObjectType::Table,
9817                VIEWS => ObjectType::View,
9818                MATERIALIZED => {
9819                    if let Err(e) = self.expect_keyword(VIEWS) {
9820                        self.prev_token();
9821                        return Err(e);
9822                    }
9823                    ObjectType::MaterializedView
9824                }
9825                SOURCES => ObjectType::Source,
9826                SINKS => ObjectType::Sink,
9827                INDEXES => ObjectType::Index,
9828                TYPES => ObjectType::Type,
9829                ROLES | USERS => ObjectType::Role,
9830                CLUSTER => {
9831                    if let Err(e) = self.expect_keyword(REPLICAS) {
9832                        self.prev_token();
9833                        return Err(e);
9834                    }
9835                    ObjectType::ClusterReplica
9836                }
9837                CLUSTERS => ObjectType::Cluster,
9838                SECRETS => ObjectType::Secret,
9839                CONNECTIONS => ObjectType::Connection,
9840                DATABASES => ObjectType::Database,
9841                SCHEMAS => ObjectType::Schema,
9842                POLICIES => ObjectType::NetworkPolicy,
9843                _ => unreachable!(),
9844            },
9845        )
9846    }
9847
9848    /// Look for an object type in the plural form and return it if it matches.
9849    fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
9850        Some(
9851            match self.parse_one_of_keywords(&[
9852                TABLES,
9853                VIEWS,
9854                MATERIALIZED,
9855                SOURCES,
9856                SINKS,
9857                INDEXES,
9858                TYPES,
9859                ROLES,
9860                USERS,
9861                CLUSTER,
9862                CLUSTERS,
9863                SECRETS,
9864                CONNECTIONS,
9865                DATABASES,
9866                SCHEMAS,
9867                SUBSOURCES,
9868                CONTINUAL,
9869                NETWORK,
9870            ])? {
9871                TABLES => ObjectType::Table,
9872                VIEWS => ObjectType::View,
9873                MATERIALIZED => {
9874                    if self.parse_keyword(VIEWS) {
9875                        ObjectType::MaterializedView
9876                    } else {
9877                        self.prev_token();
9878                        return None;
9879                    }
9880                }
9881                SOURCES => ObjectType::Source,
9882                SINKS => ObjectType::Sink,
9883                INDEXES => ObjectType::Index,
9884                TYPES => ObjectType::Type,
9885                ROLES | USERS => ObjectType::Role,
9886                CLUSTER => {
9887                    if self.parse_keyword(REPLICAS) {
9888                        ObjectType::ClusterReplica
9889                    } else {
9890                        self.prev_token();
9891                        return None;
9892                    }
9893                }
9894                CLUSTERS => ObjectType::Cluster,
9895                SECRETS => ObjectType::Secret,
9896                CONNECTIONS => ObjectType::Connection,
9897                DATABASES => ObjectType::Database,
9898                SCHEMAS => ObjectType::Schema,
9899                SUBSOURCES => ObjectType::Subsource,
9900                CONTINUAL => {
9901                    if self.parse_keyword(TASKS) {
9902                        ObjectType::ContinualTask
9903                    } else {
9904                        self.prev_token();
9905                        return None;
9906                    }
9907                }
9908                NETWORK => {
9909                    if self.parse_keyword(POLICIES) {
9910                        ObjectType::NetworkPolicy
9911                    } else {
9912                        self.prev_token();
9913                        return None;
9914                    }
9915                }
9916                _ => unreachable!(),
9917            },
9918        )
9919    }
9920
9921    /// Bail out if the current token is not a privilege object type, or consume and
9922    /// return it if it is.
9923    fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
9924        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9925            return parser_err!(
9926                self,
9927                self.peek_prev_pos(),
9928                format!("For object type {object_type}, you must specify 'TABLES'")
9929            );
9930        }
9931        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9932            self.prev_token();
9933            return parser_err!(
9934                self,
9935                self.peek_prev_pos(),
9936                format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9937            );
9938        }
9939
9940        Ok(
9941            match self.expect_one_of_keywords(&[
9942                TABLES,
9943                TYPES,
9944                CLUSTERS,
9945                SECRETS,
9946                CONNECTIONS,
9947                DATABASES,
9948                SCHEMAS,
9949            ])? {
9950                TABLES => ObjectType::Table,
9951                TYPES => ObjectType::Type,
9952                CLUSTERS => ObjectType::Cluster,
9953                SECRETS => ObjectType::Secret,
9954                CONNECTIONS => ObjectType::Connection,
9955                DATABASES => ObjectType::Database,
9956                SCHEMAS => ObjectType::Schema,
9957                _ => unreachable!(),
9958            },
9959        )
9960    }
9961
9962    /// Bail out if the current token is not a privilege object type in the plural form, or consume and
9963    /// return it if it is.
9964    fn expect_plural_system_object_type_for_privileges(
9965        &mut self,
9966    ) -> Result<SystemObjectType, ParserError> {
9967        if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9968            return parser_err!(
9969                self,
9970                self.peek_prev_pos(),
9971                format!("For object type {object_type}, you must specify 'TABLES'")
9972            );
9973        }
9974        if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9975            self.prev_token();
9976            return parser_err!(
9977                self,
9978                self.peek_prev_pos(),
9979                format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9980            );
9981        }
9982
9983        Ok(
9984            match self.expect_one_of_keywords(&[
9985                SYSTEM,
9986                TABLES,
9987                TYPES,
9988                CLUSTERS,
9989                SECRETS,
9990                CONNECTIONS,
9991                DATABASES,
9992                SCHEMAS,
9993            ])? {
9994                SYSTEM => SystemObjectType::System,
9995                TABLES => SystemObjectType::Object(ObjectType::Table),
9996                TYPES => SystemObjectType::Object(ObjectType::Type),
9997                CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
9998                SECRETS => SystemObjectType::Object(ObjectType::Secret),
9999                CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10000                DATABASES => SystemObjectType::Object(ObjectType::Database),
10001                SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10002                _ => unreachable!(),
10003            },
10004        )
10005    }
10006
10007    /// Look for a privilege and return it if it matches.
10008    fn parse_privilege(&mut self) -> Option<Privilege> {
10009        Some(
10010            match self.parse_one_of_keywords(&[
10011                INSERT,
10012                SELECT,
10013                UPDATE,
10014                DELETE,
10015                USAGE,
10016                CREATE,
10017                CREATEROLE,
10018                CREATEDB,
10019                CREATECLUSTER,
10020                CREATENETWORKPOLICY,
10021            ])? {
10022                INSERT => Privilege::INSERT,
10023                SELECT => Privilege::SELECT,
10024                UPDATE => Privilege::UPDATE,
10025                DELETE => Privilege::DELETE,
10026                USAGE => Privilege::USAGE,
10027                CREATE => Privilege::CREATE,
10028                CREATEROLE => Privilege::CREATEROLE,
10029                CREATEDB => Privilege::CREATEDB,
10030                CREATECLUSTER => Privilege::CREATECLUSTER,
10031                CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10032                _ => unreachable!(),
10033            },
10034        )
10035    }
10036
10037    /// Parse one or more privileges separated by a ','.
10038    fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10039        if self.parse_keyword(ALL) {
10040            let _ = self.parse_keyword(PRIVILEGES);
10041            return Some(PrivilegeSpecification::All);
10042        }
10043
10044        let mut privileges = Vec::new();
10045        while let Some(privilege) = self.parse_privilege() {
10046            privileges.push(privilege);
10047            if !self.consume_token(&Token::Comma) {
10048                break;
10049            }
10050        }
10051
10052        if privileges.is_empty() {
10053            None
10054        } else {
10055            Some(PrivilegeSpecification::Privileges(privileges))
10056        }
10057    }
10058
10059    /// Bail out if the current token is not a role specification, or consume and return it if it is.
10060    fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10061        let _ = self.parse_keyword(GROUP);
10062        self.parse_identifier()
10063    }
10064
10065    /// Parse a `REASSIGN OWNED` statement, assuming that the `REASSIGN` token
10066    /// has already been consumed.
10067    fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10068        self.expect_keywords(&[OWNED, BY])?;
10069        let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10070        self.expect_keyword(TO)?;
10071        let new_role = self.parse_identifier()?;
10072        Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10073            old_roles,
10074            new_role,
10075        }))
10076    }
10077
10078    fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10079        self.expect_keyword(ON)?;
10080
10081        let object = match self.expect_one_of_keywords(&[
10082            TABLE,
10083            VIEW,
10084            COLUMN,
10085            MATERIALIZED,
10086            SOURCE,
10087            SINK,
10088            INDEX,
10089            FUNCTION,
10090            CONNECTION,
10091            TYPE,
10092            SECRET,
10093            ROLE,
10094            DATABASE,
10095            SCHEMA,
10096            CLUSTER,
10097            CONTINUAL,
10098            NETWORK,
10099        ])? {
10100            TABLE => {
10101                let name = self.parse_raw_name()?;
10102                CommentObjectType::Table { name }
10103            }
10104            VIEW => {
10105                let name = self.parse_raw_name()?;
10106                CommentObjectType::View { name }
10107            }
10108            MATERIALIZED => {
10109                self.expect_keyword(VIEW)?;
10110                let name = self.parse_raw_name()?;
10111                CommentObjectType::MaterializedView { name }
10112            }
10113            SOURCE => {
10114                let name = self.parse_raw_name()?;
10115                CommentObjectType::Source { name }
10116            }
10117            SINK => {
10118                let name = self.parse_raw_name()?;
10119                CommentObjectType::Sink { name }
10120            }
10121            INDEX => {
10122                let name = self.parse_raw_name()?;
10123                CommentObjectType::Index { name }
10124            }
10125            FUNCTION => {
10126                let name = self.parse_raw_name()?;
10127                CommentObjectType::Func { name }
10128            }
10129            CONNECTION => {
10130                let name = self.parse_raw_name()?;
10131                CommentObjectType::Connection { name }
10132            }
10133            TYPE => {
10134                let ty = self.parse_data_type()?;
10135                CommentObjectType::Type { ty }
10136            }
10137            SECRET => {
10138                let name = self.parse_raw_name()?;
10139                CommentObjectType::Secret { name }
10140            }
10141            ROLE => {
10142                let name = self.parse_identifier()?;
10143                CommentObjectType::Role { name }
10144            }
10145            DATABASE => {
10146                let name = self.parse_database_name()?;
10147                CommentObjectType::Database { name }
10148            }
10149            SCHEMA => {
10150                let name = self.parse_schema_name()?;
10151                CommentObjectType::Schema { name }
10152            }
10153            CLUSTER => {
10154                if self.parse_keyword(REPLICA) {
10155                    let name = self.parse_cluster_replica_name()?;
10156                    CommentObjectType::ClusterReplica { name }
10157                } else {
10158                    let name = self.parse_raw_ident()?;
10159                    CommentObjectType::Cluster { name }
10160                }
10161            }
10162            COLUMN => {
10163                let name = self.parse_column_name()?;
10164                CommentObjectType::Column { name }
10165            }
10166            CONTINUAL => {
10167                self.expect_keyword(TASK)?;
10168                let name = self.parse_raw_name()?;
10169                CommentObjectType::ContinualTask { name }
10170            }
10171            NETWORK => {
10172                self.expect_keyword(POLICY)?;
10173                let name = self.parse_raw_network_policy_name()?;
10174                CommentObjectType::NetworkPolicy { name }
10175            }
10176            _ => unreachable!(),
10177        };
10178
10179        self.expect_keyword(IS)?;
10180        let comment = match self.next_token() {
10181            Some(Token::Keyword(NULL)) => None,
10182            Some(Token::String(s)) => Some(s),
10183            other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10184        };
10185
10186        Ok(Statement::Comment(CommentStatement { object, comment }))
10187    }
10188
10189    pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10190    where
10191        S: TryInto<IdentString>,
10192        <S as TryInto<IdentString>>::Error: fmt::Display,
10193    {
10194        Ident::new(s).map_err(|e| ParserError {
10195            pos: self.peek_prev_pos(),
10196            message: e.to_string(),
10197        })
10198    }
10199}
10200
10201impl CheckedRecursion for Parser<'_> {
10202    fn recursion_guard(&self) -> &RecursionGuard {
10203        &self.recursion_guard
10204    }
10205}
10206
10207/// Represents an expression or query (a "fragment") with parentheses around it,
10208/// when it is unknown whether the fragment belongs to a larger expression or
10209/// query.
10210enum ParenthesizedFragment {
10211    Query(Query<Raw>),
10212    Exprs(Vec<Expr<Raw>>),
10213}
10214
10215impl ParenthesizedFragment {
10216    /// Force the fragment into an expression.
10217    fn into_expr(self) -> Expr<Raw> {
10218        match self {
10219            ParenthesizedFragment::Exprs(exprs) => {
10220                // The `ParenthesizedFragment` represents that there were
10221                // parentheses surrounding `exprs`, so...
10222                if exprs.len() == 1 {
10223                    // ...if there was only one expression, the parentheses
10224                    // were simple nesting...
10225                    Expr::Nested(Box::new(exprs.into_element()))
10226                } else {
10227                    // ...and if there were multiple expressions, the
10228                    // parentheses formed an implicit row constructor.
10229                    Expr::Row { exprs }
10230                }
10231            }
10232            // Queries become subquery expressions.
10233            ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10234        }
10235    }
10236}
10237
10238// Include the `Parser::parse_~` implementations for simple options derived by
10239// the crate's build.rs script.
10240include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));