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