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