mz_sql_parser/
parser.rs

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