risingwave_sqlparser/
parser.rs

1// Licensed under the Apache License, Version 2.0 (the "License");
2// you may not use this file except in compliance with the License.
3// You may obtain a copy of the License at
4//
5//     http://www.apache.org/licenses/LICENSE-2.0
6//
7// Unless required by applicable law or agreed to in writing, software
8// distributed under the License is distributed on an "AS IS" BASIS,
9// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10// See the License for the specific language governing permissions and
11// limitations under the License.
12
13//! SQL Parser
14
15use std::fmt;
16
17use ddl::WebhookSourceInfo;
18use itertools::Itertools;
19use tracing::{debug, instrument};
20use winnow::combinator::{
21    alt, cut_err, dispatch, fail, opt, peek, preceded, repeat, separated, separated_pair,
22};
23use winnow::{ModalResult, Parser as _};
24
25use crate::ast::*;
26use crate::keywords::{self, Keyword};
27use crate::parser_v2::{
28    ParserExt as _, dollar_quoted_string, keyword, literal_i64, literal_u32, literal_u64,
29    single_quoted_string,
30};
31use crate::tokenizer::*;
32use crate::{impl_parse_to, parser_v2};
33
34pub(crate) const UPSTREAM_SOURCE_KEY: &str = "connector";
35pub(crate) const WEBHOOK_CONNECTOR: &str = "webhook";
36
37const WEBHOOK_WAIT_FOR_PERSISTENCE: &str = "webhook.wait_for_persistence";
38const WEBHOOK_IS_BATCHED: &str = "is_batched";
39
40#[derive(Debug, Clone, PartialEq)]
41pub enum ParserError {
42    TokenizerError(String),
43    ParserError(String),
44}
45
46impl ParserError {
47    pub fn inner_msg(self) -> String {
48        match self {
49            ParserError::TokenizerError(s) | ParserError::ParserError(s) => s,
50        }
51    }
52}
53
54#[derive(Debug, thiserror::Error)]
55#[error("{0}")]
56pub struct StrError(pub String);
57
58// Use `Parser::expected` instead, if possible
59#[macro_export]
60macro_rules! parser_err {
61    ($($arg:tt)*) => {
62        return Err(winnow::error::ErrMode::Backtrack(<winnow::error::ContextError as winnow::error::FromExternalError<_, _>>::from_external_error(
63            &Parser::default(),
64            $crate::parser::StrError(format!($($arg)*)),
65        )))
66    };
67}
68
69impl From<StrError> for winnow::error::ErrMode<winnow::error::ContextError> {
70    fn from(e: StrError) -> Self {
71        winnow::error::ErrMode::Backtrack(<winnow::error::ContextError as winnow::error::FromExternalError<_, _>>::from_external_error(
72            &Parser::default(),
73            e,
74        ))
75    }
76}
77
78// Returns a successful result if the optional expression is some
79macro_rules! return_ok_if_some {
80    ($e:expr) => {{
81        if let Some(v) = $e {
82            return Ok(v);
83        }
84    }};
85}
86
87#[derive(PartialEq)]
88pub enum IsOptional {
89    Optional,
90    Mandatory,
91}
92
93use IsOptional::*;
94
95pub enum IsLateral {
96    Lateral,
97    NotLateral,
98}
99
100use IsLateral::*;
101
102use crate::ast::ddl::{AlterCompactionGroupOperation, AlterFragmentOperation};
103
104pub type IncludeOption = Vec<IncludeOptionItem>;
105
106#[derive(Eq, Clone, Debug, PartialEq, Hash)]
107pub struct IncludeOptionItem {
108    pub column_type: Ident,
109    pub column_alias: Option<Ident>,
110    pub inner_field: Option<String>,
111    pub header_inner_expect_type: Option<DataType>,
112}
113
114#[derive(Debug)]
115pub enum WildcardOrExpr {
116    Expr(Expr),
117    /// Expr is an arbitrary expression, returning either a table or a column.
118    /// Idents are the prefix of `*`, which are consecutive field accesses.
119    /// e.g. `(table.v1).*` or `(table).v1.*`
120    ///
121    /// See also [`Expr::FieldIdentifier`] for behaviors of parentheses.
122    ExprQualifiedWildcard(Expr, Vec<Ident>),
123    /// `QualifiedWildcard` and `Wildcard` can be followed by EXCEPT (columns)
124    QualifiedWildcard(ObjectName, Option<Vec<Expr>>),
125    Wildcard(Option<Vec<Expr>>),
126}
127
128impl From<WildcardOrExpr> for FunctionArgExpr {
129    fn from(wildcard_expr: WildcardOrExpr) -> Self {
130        match wildcard_expr {
131            WildcardOrExpr::Expr(expr) => Self::Expr(expr),
132            WildcardOrExpr::ExprQualifiedWildcard(expr, prefix) => {
133                Self::ExprQualifiedWildcard(expr, prefix)
134            }
135            WildcardOrExpr::QualifiedWildcard(prefix, except) => {
136                Self::QualifiedWildcard(prefix, except)
137            }
138            WildcardOrExpr::Wildcard(except) => Self::Wildcard(except),
139        }
140    }
141}
142
143impl From<TokenizerError> for ParserError {
144    fn from(e: TokenizerError) -> Self {
145        ParserError::TokenizerError(e.to_string())
146    }
147}
148
149impl fmt::Display for ParserError {
150    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
151        write!(
152            f,
153            "sql parser error: {}",
154            match self {
155                ParserError::TokenizerError(s) => s,
156                ParserError::ParserError(s) => s,
157            }
158        )
159    }
160}
161
162impl std::error::Error for ParserError {}
163
164type ColumnsDefTuple = (
165    Vec<ColumnDef>,
166    Vec<TableConstraint>,
167    Vec<SourceWatermark>,
168    Option<usize>,
169);
170
171/// Reference:
172/// <https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-PRECEDENCE>
173#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
174pub enum Precedence {
175    Zero = 0,
176    LogicalOr, // 5 in upstream
177    LogicalXor,
178    LogicalAnd, // 10 in upstream
179    UnaryNot,   // 15 in upstream
180    Is,         // 17 in upstream
181    Cmp,
182    Like,    // 19 in upstream
183    Between, // 20 in upstream
184    Other,
185    PlusMinus, // 30 in upstream
186    MulDiv,    // 40 in upstream
187    Exp,
188    At,
189    Collate,
190    UnaryPosNeg,
191    Array,
192    DoubleColon, // 50 in upstream
193}
194
195#[derive(Clone, Copy, Default)]
196pub struct Parser<'a>(pub(crate) &'a [TokenWithLocation]);
197
198impl Parser<'_> {
199    /// Parse a SQL statement and produce an Abstract Syntax Tree (AST)
200    #[instrument(level = "debug")]
201    pub fn parse_sql(sql: &str) -> Result<Vec<Statement>, ParserError> {
202        let mut tokenizer = Tokenizer::new(sql);
203        let tokens = tokenizer.tokenize_with_location()?;
204        let parser = Parser(&tokens);
205        let stmts = Parser::parse_statements.parse(parser).map_err(|e| {
206            // append SQL context to the error message, e.g.:
207            // LINE 1: SELECT 1::int(2);
208            let loc = match tokens.get(e.offset()) {
209                Some(token) => token.location.clone(),
210                None => {
211                    // get location of EOF
212                    Location {
213                        line: sql.lines().count() as u64,
214                        column: sql.lines().last().map_or(0, |l| l.len() as u64) + 1,
215                    }
216                }
217            };
218            let prefix = format!("LINE {}: ", loc.line);
219            let sql_line = sql.split('\n').nth(loc.line as usize - 1).unwrap();
220            let cursor = " ".repeat(prefix.len() + loc.column as usize - 1);
221            ParserError::ParserError(format!(
222                "{}\n{}{}\n{}^",
223                e.inner().to_string().replace('\n', ": "),
224                prefix,
225                sql_line,
226                cursor
227            ))
228        })?;
229        Ok(stmts)
230    }
231
232    /// Parse exactly one statement from a string.
233    pub fn parse_exactly_one(sql: &str) -> Result<Statement, ParserError> {
234        Parser::parse_sql(sql)
235            .map_err(|e| {
236                ParserError::ParserError(format!("failed to parse definition sql: {}", e))
237            })?
238            .into_iter()
239            .exactly_one()
240            .map_err(|e| {
241                ParserError::ParserError(format!(
242                    "expecting exactly one statement in definition: {}",
243                    e
244                ))
245            })
246    }
247
248    /// Parse object name from a string.
249    pub fn parse_object_name_str(s: &str) -> Result<ObjectName, ParserError> {
250        let mut tokenizer = Tokenizer::new(s);
251        let tokens = tokenizer.tokenize_with_location()?;
252        let parser = Parser(&tokens);
253        Parser::parse_object_name
254            .parse(parser)
255            .map_err(|e| ParserError::ParserError(e.inner().to_string()))
256    }
257
258    /// Parse function description from a string.
259    pub fn parse_function_desc_str(func: &str) -> Result<FunctionDesc, ParserError> {
260        let mut tokenizer = Tokenizer::new(func);
261        let tokens = tokenizer.tokenize_with_location()?;
262        let parser = Parser(&tokens);
263        Parser::parse_function_desc
264            .parse(parser)
265            .map_err(|e| ParserError::ParserError(e.inner().to_string()))
266    }
267
268    /// Parse a list of semicolon-separated statements.
269    fn parse_statements(&mut self) -> ModalResult<Vec<Statement>> {
270        let mut stmts = Vec::new();
271        let mut expecting_statement_delimiter = false;
272        loop {
273            // ignore empty statements (between successive statement delimiters)
274            while self.consume_token(&Token::SemiColon) {
275                expecting_statement_delimiter = false;
276            }
277
278            if self.peek_token() == Token::EOF {
279                break;
280            }
281            if expecting_statement_delimiter {
282                return self.expected("end of statement");
283            }
284
285            let statement = self.parse_statement()?;
286            stmts.push(statement);
287            expecting_statement_delimiter = true;
288        }
289        debug!("parsed statements:\n{:#?}", stmts);
290        Ok(stmts)
291    }
292
293    /// Parse a single top-level statement (such as SELECT, INSERT, CREATE, etc.),
294    /// stopping before the statement separator, if any.
295    pub fn parse_statement(&mut self) -> ModalResult<Statement> {
296        let checkpoint = *self;
297        let token = self.next_token();
298        match token.token {
299            Token::Word(w) => match w.keyword {
300                Keyword::EXPLAIN => Ok(self.parse_explain()?),
301                Keyword::ANALYZE => Ok(self.parse_analyze()?),
302                Keyword::SELECT | Keyword::WITH | Keyword::VALUES => {
303                    *self = checkpoint;
304                    Ok(Statement::Query(Box::new(self.parse_query()?)))
305                }
306                Keyword::DECLARE => Ok(self.parse_declare()?),
307                Keyword::FETCH => Ok(self.parse_fetch_cursor()?),
308                Keyword::CLOSE => Ok(self.parse_close_cursor()?),
309                Keyword::TRUNCATE => Ok(self.parse_truncate()?),
310                Keyword::REFRESH => Ok(self.parse_refresh()?),
311                Keyword::CREATE => Ok(self.parse_create()?),
312                Keyword::DISCARD => Ok(self.parse_discard()?),
313                Keyword::DROP => Ok(self.parse_drop()?),
314                Keyword::DELETE => Ok(self.parse_delete()?),
315                Keyword::INSERT => Ok(self.parse_insert()?),
316                Keyword::UPDATE => Ok(self.parse_update()?),
317                Keyword::ALTER => Ok(self.parse_alter()?),
318                Keyword::COPY => Ok(self.parse_copy()?),
319                Keyword::SET => Ok(self.parse_set()?),
320                Keyword::SHOW => {
321                    if self.parse_keyword(Keyword::CREATE) {
322                        Ok(self.parse_show_create()?)
323                    } else {
324                        Ok(self.parse_show()?)
325                    }
326                }
327                Keyword::CANCEL => Ok(self.parse_cancel_job()?),
328                Keyword::KILL => Ok(self.parse_kill_process()?),
329                Keyword::DESCRIBE => Ok(self.parse_describe()?),
330                Keyword::GRANT => Ok(self.parse_grant()?),
331                Keyword::REVOKE => Ok(self.parse_revoke()?),
332                Keyword::START => Ok(self.parse_start_transaction()?),
333                Keyword::ABORT => Ok(Statement::Abort),
334                // `BEGIN` is a nonstandard but common alias for the
335                // standard `START TRANSACTION` statement. It is supported
336                // by at least PostgreSQL and MySQL.
337                Keyword::BEGIN => Ok(self.parse_begin()?),
338                Keyword::COMMIT => Ok(self.parse_commit()?),
339                Keyword::ROLLBACK => Ok(self.parse_rollback()?),
340                // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
341                // syntaxes. They are used for Postgres prepared statement.
342                Keyword::DEALLOCATE => Ok(self.parse_deallocate()?),
343                Keyword::EXECUTE => Ok(self.parse_execute()?),
344                Keyword::PREPARE => Ok(self.parse_prepare()?),
345                Keyword::COMMENT => Ok(self.parse_comment()?),
346                Keyword::FLUSH => Ok(Statement::Flush),
347                Keyword::WAIT => Ok(self.parse_wait()?),
348                Keyword::BACKUP => Ok(Statement::Backup),
349                Keyword::RECOVER => Ok(Statement::Recover),
350                Keyword::USE => Ok(self.parse_use()?),
351                Keyword::VACUUM => Ok(self.parse_vacuum()?),
352                _ => self.expected_at(checkpoint, "statement"),
353            },
354            Token::LParen => {
355                *self = checkpoint;
356                Ok(Statement::Query(Box::new(self.parse_query()?)))
357            }
358            _ => self.expected_at(checkpoint, "statement"),
359        }
360    }
361
362    pub fn parse_truncate(&mut self) -> ModalResult<Statement> {
363        let _ = self.parse_keyword(Keyword::TABLE);
364        let table_name = self.parse_object_name()?;
365        Ok(Statement::Truncate { table_name })
366    }
367
368    pub fn parse_refresh(&mut self) -> ModalResult<Statement> {
369        self.expect_keyword(Keyword::TABLE)?;
370        let table_name = self.parse_object_name()?;
371        Ok(Statement::Refresh { table_name })
372    }
373
374    pub fn parse_analyze(&mut self) -> ModalResult<Statement> {
375        let table_name = self.parse_object_name()?;
376
377        Ok(Statement::Analyze { table_name })
378    }
379
380    pub fn parse_vacuum(&mut self) -> ModalResult<Statement> {
381        let full = self.parse_keyword(Keyword::FULL);
382        let object_name = self.parse_object_name()?;
383
384        Ok(Statement::Vacuum { object_name, full })
385    }
386
387    /// Tries to parse a wildcard expression. If it is not a wildcard, parses an expression.
388    ///
389    /// A wildcard expression either means:
390    /// - Selecting all fields from a struct. In this case, it is a
391    ///   [`WildcardOrExpr::ExprQualifiedWildcard`]. Similar to [`Expr::FieldIdentifier`], It must
392    ///   contain parentheses.
393    /// - Selecting all columns from a table. In this case, it is a
394    ///   [`WildcardOrExpr::QualifiedWildcard`] or a [`WildcardOrExpr::Wildcard`].
395    pub fn parse_wildcard_or_expr(&mut self) -> ModalResult<WildcardOrExpr> {
396        let checkpoint = *self;
397
398        match self.next_token().token {
399            Token::Word(w) if self.peek_token() == Token::Period => {
400                // Since there's no parenthesis, `w` must be a column or a table
401                // So what follows must be dot-delimited identifiers, e.g. `a.b.c.*`
402                let wildcard_expr = self.parse_simple_wildcard_expr(checkpoint)?;
403                return self.word_concat_wildcard_expr(w.to_ident()?, wildcard_expr);
404            }
405            Token::Mul => {
406                return Ok(WildcardOrExpr::Wildcard(self.parse_except()?));
407            }
408            // parses wildcard field selection expression.
409            // Code is similar to `parse_struct_selection`
410            Token::LParen => {
411                let mut expr = self.parse_expr()?;
412                if self.consume_token(&Token::RParen) {
413                    // Unwrap parentheses
414                    while let Expr::Nested(inner) = expr {
415                        expr = *inner;
416                    }
417                    // Now that we have an expr, what follows must be
418                    // dot-delimited identifiers, e.g. `b.c.*` in `(a).b.c.*`
419                    let wildcard_expr = self.parse_simple_wildcard_expr(checkpoint)?;
420                    return self.expr_concat_wildcard_expr(expr, wildcard_expr);
421                }
422            }
423            _ => (),
424        };
425
426        *self = checkpoint;
427        self.parse_expr().map(WildcardOrExpr::Expr)
428    }
429
430    /// Concats `ident` and `wildcard_expr` in `ident.wildcard_expr`
431    pub fn word_concat_wildcard_expr(
432        &mut self,
433        ident: Ident,
434        simple_wildcard_expr: WildcardOrExpr,
435    ) -> ModalResult<WildcardOrExpr> {
436        let mut idents = vec![ident];
437        let mut except_cols = vec![];
438        match simple_wildcard_expr {
439            WildcardOrExpr::QualifiedWildcard(ids, except) => {
440                idents.extend(ids.0);
441                if let Some(cols) = except {
442                    except_cols = cols;
443                }
444            }
445            WildcardOrExpr::Wildcard(except) => {
446                if let Some(cols) = except {
447                    except_cols = cols;
448                }
449            }
450            WildcardOrExpr::ExprQualifiedWildcard(_, _) => unreachable!(),
451            WildcardOrExpr::Expr(e) => return Ok(WildcardOrExpr::Expr(e)),
452        }
453        Ok(WildcardOrExpr::QualifiedWildcard(
454            ObjectName(idents),
455            if except_cols.is_empty() {
456                None
457            } else {
458                Some(except_cols)
459            },
460        ))
461    }
462
463    /// Concats `expr` and `wildcard_expr` in `(expr).wildcard_expr`.
464    pub fn expr_concat_wildcard_expr(
465        &mut self,
466        expr: Expr,
467        simple_wildcard_expr: WildcardOrExpr,
468    ) -> ModalResult<WildcardOrExpr> {
469        if let WildcardOrExpr::Expr(e) = simple_wildcard_expr {
470            return Ok(WildcardOrExpr::Expr(e));
471        }
472
473        // similar to `parse_struct_selection`
474        let mut idents = vec![];
475        let expr = match expr {
476            // expr is `(foo)`
477            Expr::Identifier(_) => expr,
478            // expr is `(foo.v1)`
479            Expr::CompoundIdentifier(_) => expr,
480            // expr is `((1,2,3)::foo)`
481            Expr::Cast { .. } => expr,
482            // expr is `(func())`
483            Expr::Function(_) => expr,
484            // expr is `((foo.v1).v2)`
485            Expr::FieldIdentifier(expr, ids) => {
486                // Put `ids` to the latter part!
487                idents.extend(ids);
488                *expr
489            }
490            // expr is other things, e.g., `(1+2)`. It will become an unexpected period error at
491            // upper level.
492            _ => return Ok(WildcardOrExpr::Expr(expr)),
493        };
494
495        match simple_wildcard_expr {
496            WildcardOrExpr::QualifiedWildcard(ids, except) => {
497                if except.is_some() {
498                    return self.expected("Expr quantified wildcard does not support except");
499                }
500                idents.extend(ids.0);
501            }
502            WildcardOrExpr::Wildcard(except) => {
503                if except.is_some() {
504                    return self.expected("Expr quantified wildcard does not support except");
505                }
506            }
507            WildcardOrExpr::ExprQualifiedWildcard(_, _) => unreachable!(),
508            WildcardOrExpr::Expr(_) => unreachable!(),
509        }
510        Ok(WildcardOrExpr::ExprQualifiedWildcard(expr, idents))
511    }
512
513    /// Tries to parses a wildcard expression without any parentheses.
514    ///
515    /// If wildcard is not found, go back to `index` and parse an expression.
516    pub fn parse_simple_wildcard_expr(&mut self, checkpoint: Self) -> ModalResult<WildcardOrExpr> {
517        let mut id_parts = vec![];
518        while self.consume_token(&Token::Period) {
519            let ckpt = *self;
520            let token = self.next_token();
521            match token.token {
522                Token::Word(w) => id_parts.push(w.to_ident()?),
523                Token::Mul => {
524                    return if id_parts.is_empty() {
525                        Ok(WildcardOrExpr::Wildcard(self.parse_except()?))
526                    } else {
527                        Ok(WildcardOrExpr::QualifiedWildcard(
528                            ObjectName(id_parts),
529                            self.parse_except()?,
530                        ))
531                    };
532                }
533                _ => {
534                    *self = ckpt;
535                    return self.expected("an identifier or a '*' after '.'");
536                }
537            }
538        }
539        *self = checkpoint;
540        self.parse_expr().map(WildcardOrExpr::Expr)
541    }
542
543    pub fn parse_except(&mut self) -> ModalResult<Option<Vec<Expr>>> {
544        if !self.parse_keyword(Keyword::EXCEPT) {
545            return Ok(None);
546        }
547        if !self.consume_token(&Token::LParen) {
548            return self.expected("EXCEPT should be followed by (");
549        }
550        let exprs = self.parse_comma_separated(Parser::parse_expr)?;
551        if self.consume_token(&Token::RParen) {
552            Ok(Some(exprs))
553        } else {
554            self.expected("( should be followed by ) after column names")
555        }
556    }
557
558    /// Parse a new expression
559    pub fn parse_expr(&mut self) -> ModalResult<Expr> {
560        self.parse_subexpr(Precedence::Zero)
561    }
562
563    /// Parse tokens until the precedence changes
564    pub fn parse_subexpr(&mut self, precedence: Precedence) -> ModalResult<Expr> {
565        debug!("parsing expr, current token: {:?}", self.peek_token().token);
566        let mut expr = self.parse_prefix()?;
567        debug!("prefix: {:?}", expr);
568        loop {
569            let next_precedence = self.get_next_precedence()?;
570            debug!("precedence: {precedence:?}, next precedence: {next_precedence:?}");
571
572            if precedence >= next_precedence {
573                break;
574            }
575
576            expr = self.parse_infix(expr, next_precedence)?;
577        }
578        Ok(expr)
579    }
580
581    /// Parse an expression prefix
582    pub fn parse_prefix(&mut self) -> ModalResult<Expr> {
583        // PostgreSQL allows any string literal to be preceded by a type name, indicating that the
584        // string literal represents a literal of that type. Some examples:
585        //
586        //      DATE '2020-05-20'
587        //      TIMESTAMP WITH TIME ZONE '2020-05-20 7:43:54'
588        //      BOOL 'true'
589        //
590        // The first two are standard SQL, while the latter is a PostgreSQL extension. Complicating
591        // matters is the fact that INTERVAL string literals may optionally be followed by special
592        // keywords, e.g.:
593        //
594        //      INTERVAL '7' DAY
595        //
596        // Note also that naively `SELECT date` looks like a syntax error because the `date` type
597        // name is not followed by a string literal, but in fact in PostgreSQL it is a valid
598        // expression that should parse as the column name "date".
599        return_ok_if_some!(self.maybe_parse(|parser| {
600            match parser.parse_data_type()? {
601                DataType::Interval => parser.parse_literal_interval(),
602                // PostgreSQL allows almost any identifier to be used as custom data type name,
603                // and we support that in `parse_data_type()`. But unlike Postgres we don't
604                // have a list of globally reserved keywords (since they vary across dialects),
605                // so given `NOT 'a' LIKE 'b'`, we'd accept `NOT` as a possible custom data type
606                // name, resulting in `NOT 'a'` being recognized as a `TypedString` instead of
607                // an unary negation `NOT ('a' LIKE 'b')`. To solve this, we don't accept the
608                // `type 'string'` syntax for the custom data types at all.
609                DataType::Custom(..) => parser_err!("dummy"),
610                data_type => Ok(Expr::TypedString {
611                    data_type,
612                    value: parser.parse_literal_string()?,
613                }),
614            }
615        }));
616
617        let checkpoint = *self;
618        let token = self.next_token();
619        let expr = match token.token.clone() {
620            Token::Word(w) => match w.keyword {
621                Keyword::TRUE | Keyword::FALSE | Keyword::NULL => {
622                    *self = checkpoint;
623                    Ok(Expr::Value(self.ensure_parse_value()?))
624                }
625                Keyword::CASE => self.parse_case_expr(),
626                Keyword::CAST => self.parse_cast_expr(),
627                Keyword::TRY_CAST => self.parse_try_cast_expr(),
628                Keyword::EXISTS => self.parse_exists_expr(),
629                Keyword::EXTRACT => self.parse_extract_expr(),
630                Keyword::SUBSTRING => self.parse_substring_expr(),
631                Keyword::POSITION => self.parse_position_expr(),
632                Keyword::OVERLAY => self.parse_overlay_expr(),
633                Keyword::TRIM => self.parse_trim_expr(),
634                Keyword::INTERVAL => self.parse_literal_interval(),
635                Keyword::NOT => Ok(Expr::UnaryOp {
636                    op: UnaryOperator::Not,
637                    expr: Box::new(self.parse_subexpr(Precedence::UnaryNot)?),
638                }),
639                Keyword::ROW => self.parse_row_expr(),
640                Keyword::ARRAY if self.peek_token() == Token::LParen => {
641                    // similar to `exists(subquery)`
642                    self.expect_token(&Token::LParen)?;
643                    let exists_node = Expr::ArraySubquery(Box::new(self.parse_query()?));
644                    self.expect_token(&Token::RParen)?;
645                    Ok(exists_node)
646                }
647                Keyword::ARRAY if self.peek_token() == Token::LBracket => self.parse_array_expr(),
648                Keyword::MAP if self.peek_token() == Token::LBrace => self.parse_map_expr(),
649                // `LEFT` and `RIGHT` are reserved as identifier but okay as function
650                Keyword::LEFT | Keyword::RIGHT => {
651                    *self = checkpoint;
652                    self.parse_function()
653                }
654                Keyword::OPERATOR if self.peek_token().token == Token::LParen => {
655                    let op = UnaryOperator::PGQualified(Box::new(self.parse_qualified_operator()?));
656                    Ok(Expr::UnaryOp {
657                        op,
658                        expr: Box::new(self.parse_subexpr(Precedence::Other)?),
659                    })
660                }
661                keyword @ (Keyword::ALL | Keyword::ANY | Keyword::SOME) => {
662                    self.expect_token(&Token::LParen)?;
663                    // In upstream's PR of parser-rs, there is `self.parser_subexpr(precedence)` here.
664                    // But it will fail to parse `select 1 = any(null and true);`.
665                    let sub = self.parse_expr()?;
666                    self.expect_token(&Token::RParen)?;
667
668                    // TODO: support `all/any/some(subquery)`.
669                    if let Expr::Subquery(_) = &sub {
670                        parser_err!("ANY/SOME/ALL(Subquery) is not implemented");
671                    }
672
673                    Ok(match keyword {
674                        Keyword::ALL => Expr::AllOp(Box::new(sub)),
675                        // `SOME` is a synonym for `ANY`.
676                        Keyword::ANY | Keyword::SOME => Expr::SomeOp(Box::new(sub)),
677                        _ => unreachable!(),
678                    })
679                }
680                k if keywords::RESERVED_FOR_COLUMN_OR_TABLE_NAME.contains(&k) => {
681                    parser_err!("syntax error at or near {token}")
682                }
683                Keyword::AGGREGATE => {
684                    *self = checkpoint;
685                    self.parse_function()
686                }
687                // Here `w` is a word, check if it's a part of a multi-part
688                // identifier, a function call, or a simple identifier:
689                _ => match self.peek_token().token {
690                    Token::LParen | Token::Period => {
691                        *self = checkpoint;
692                        if let Ok(object_name) = self.parse_object_name()
693                            && !matches!(self.peek_token().token, Token::LParen)
694                        {
695                            Ok(Expr::CompoundIdentifier(object_name.0))
696                        } else {
697                            *self = checkpoint;
698                            self.parse_function()
699                        }
700                    }
701                    _ => Ok(Expr::Identifier(w.to_ident()?)),
702                },
703            }, // End of Token::Word
704
705            tok @ Token::Minus | tok @ Token::Plus => {
706                let op = if tok == Token::Plus {
707                    UnaryOperator::Plus
708                } else {
709                    UnaryOperator::Minus
710                };
711                let mut sub_expr = self.parse_subexpr(Precedence::UnaryPosNeg)?;
712                if let Expr::Value(Value::Number(ref mut s)) = sub_expr {
713                    if tok == Token::Minus {
714                        *s = format!("-{}", s);
715                    }
716                    return Ok(sub_expr);
717                }
718                Ok(Expr::UnaryOp {
719                    op,
720                    expr: Box::new(sub_expr),
721                })
722            }
723            Token::Op(name) => {
724                let op = UnaryOperator::Custom(name);
725                // Counter-intuitively, `|/ 4 + 12` means `|/ (4+12)` rather than `(|/4) + 12` in
726                // PostgreSQL.
727                Ok(Expr::UnaryOp {
728                    op,
729                    expr: Box::new(self.parse_subexpr(Precedence::Other)?),
730                })
731            }
732            Token::Number(_)
733            | Token::SingleQuotedString(_)
734            | Token::DollarQuotedString(_)
735            | Token::NationalStringLiteral(_)
736            | Token::HexStringLiteral(_)
737            | Token::CstyleEscapesString(_) => {
738                *self = checkpoint;
739                Ok(Expr::Value(self.ensure_parse_value()?))
740            }
741            Token::Parameter(number) => self.parse_param(number),
742            Token::Pipe => {
743                let args = self.parse_comma_separated(Parser::parse_identifier)?;
744                self.expect_token(&Token::Pipe)?;
745                let body = self.parse_expr()?;
746                Ok(Expr::LambdaFunction {
747                    args,
748                    body: Box::new(body),
749                })
750            }
751            Token::LParen => {
752                let expr = if matches!(self.peek_token().token, Token::Word(w) if w.keyword == Keyword::SELECT || w.keyword == Keyword::WITH)
753                {
754                    Expr::Subquery(Box::new(self.parse_query()?))
755                } else {
756                    let mut exprs = self.parse_comma_separated(Parser::parse_expr)?;
757                    if exprs.len() == 1 {
758                        Expr::Nested(Box::new(exprs.pop().unwrap()))
759                    } else {
760                        Expr::Row(exprs)
761                    }
762                };
763                self.expect_token(&Token::RParen)?;
764                if self.peek_token() == Token::Period && matches!(expr, Expr::Nested(_)) {
765                    self.parse_struct_selection(expr)
766                } else {
767                    Ok(expr)
768                }
769            }
770            _ => self.expected_at(checkpoint, "an expression"),
771        }?;
772
773        if self.parse_keyword(Keyword::COLLATE) {
774            Ok(Expr::Collate {
775                expr: Box::new(expr),
776                collation: self.parse_object_name()?,
777            })
778        } else {
779            Ok(expr)
780        }
781    }
782
783    fn parse_param(&mut self, param: String) -> ModalResult<Expr> {
784        let Ok(index) = param.parse() else {
785            parser_err!("Parameter symbol has a invalid index {}.", param);
786        };
787        Ok(Expr::Parameter { index })
788    }
789
790    /// Parses a field selection expression. See also [`Expr::FieldIdentifier`].
791    pub fn parse_struct_selection(&mut self, expr: Expr) -> ModalResult<Expr> {
792        let mut nested_expr = expr;
793        // Unwrap parentheses
794        while let Expr::Nested(inner) = nested_expr {
795            nested_expr = *inner;
796        }
797        let fields = self.parse_fields()?;
798        Ok(Expr::FieldIdentifier(Box::new(nested_expr), fields))
799    }
800
801    /// Parses consecutive field identifiers after a period. i.e., `.foo.bar.baz`
802    pub fn parse_fields(&mut self) -> ModalResult<Vec<Ident>> {
803        repeat(.., preceded(Token::Period, cut_err(Self::parse_identifier))).parse_next(self)
804    }
805
806    pub fn parse_qualified_operator(&mut self) -> ModalResult<QualifiedOperator> {
807        self.expect_token(&Token::LParen)?;
808
809        let checkpoint = *self;
810        let schema = match self.parse_identifier_non_reserved() {
811            Ok(ident) => {
812                self.expect_token(&Token::Period)?;
813                Some(ident)
814            }
815            Err(_) => {
816                *self = checkpoint;
817                None
818            }
819        };
820
821        // https://www.postgresql.org/docs/15/sql-syntax-lexical.html#SQL-SYNTAX-OPERATORS
822        const OP_CHARS: &[char] = &[
823            '+', '-', '*', '/', '<', '>', '=', '~', '!', '@', '#', '%', '^', '&', '|', '`', '?',
824        ];
825        let name = {
826            // Unlike PostgreSQL, we only take 1 token here rather than any sequence of `OP_CHARS`.
827            // This is enough because we do not support custom operators like `x *@ y` anyways,
828            // and all builtin sequences are already single tokens.
829            //
830            // To support custom operators and be fully compatible with PostgreSQL later, the
831            // tokenizer should also be updated.
832            let checkpoint = *self;
833            let token = self.next_token();
834            let name = token.token.to_string();
835            if !name.trim_matches(OP_CHARS).is_empty() {
836                return self
837                    .expected_at(checkpoint, &format!("one of {}", OP_CHARS.iter().join(" ")));
838            }
839            name
840        };
841
842        self.expect_token(&Token::RParen)?;
843        Ok(QualifiedOperator { schema, name })
844    }
845
846    /// Parse a function call.
847    pub fn parse_function(&mut self) -> ModalResult<Expr> {
848        // [aggregate:]
849        let scalar_as_agg = if self.parse_keyword(Keyword::AGGREGATE) {
850            self.expect_token(&Token::Colon)?;
851            true
852        } else {
853            false
854        };
855        let name = self.parse_object_name()?;
856        let arg_list = self.parse_argument_list()?;
857
858        let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
859            self.expect_token(&Token::LParen)?;
860            self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
861            let order_by = self.parse_order_by_expr()?;
862            self.expect_token(&Token::RParen)?;
863            Some(Box::new(order_by))
864        } else {
865            None
866        };
867
868        let filter = if self.parse_keyword(Keyword::FILTER) {
869            self.expect_token(&Token::LParen)?;
870            self.expect_keyword(Keyword::WHERE)?;
871            let filter_expr = self.parse_expr()?;
872            self.expect_token(&Token::RParen)?;
873            Some(Box::new(filter_expr))
874        } else {
875            None
876        };
877
878        let over = if self.parse_keyword(Keyword::OVER) {
879            if self.peek_token() == Token::LParen {
880                // Inline window specification: OVER (...)
881                self.expect_token(&Token::LParen)?;
882                let window_spec = self.parse_window_spec()?;
883                self.expect_token(&Token::RParen)?;
884                Some(Window::Spec(window_spec))
885            } else {
886                // Named window: OVER window_name
887                let window_name = self.parse_identifier()?;
888                Some(Window::Name(window_name))
889            }
890        } else {
891            None
892        };
893
894        Ok(Expr::Function(Function {
895            scalar_as_agg,
896            name,
897            arg_list,
898            within_group,
899            filter,
900            over,
901        }))
902    }
903
904    pub fn parse_window_frame_units(&mut self) -> ModalResult<WindowFrameUnits> {
905        dispatch! { peek(keyword);
906            Keyword::ROWS => keyword.value(WindowFrameUnits::Rows),
907            Keyword::RANGE => keyword.value(WindowFrameUnits::Range),
908            Keyword::GROUPS => keyword.value(WindowFrameUnits::Groups),
909            Keyword::SESSION => keyword.value(WindowFrameUnits::Session),
910            _ => fail,
911        }
912        .expect("ROWS, RANGE, or GROUPS")
913        .parse_next(self)
914    }
915
916    pub fn parse_window_frame(&mut self) -> ModalResult<WindowFrame> {
917        let units = self.parse_window_frame_units()?;
918        let bounds = if self.parse_keyword(Keyword::BETWEEN) {
919            // `BETWEEN <frame_start> AND <frame_end>`
920            let start = self.parse_window_frame_bound()?;
921            self.expect_keyword(Keyword::AND)?;
922            let end = Some(self.parse_window_frame_bound()?);
923            WindowFrameBounds::Bounds { start, end }
924        } else if self.parse_keywords(&[Keyword::WITH, Keyword::GAP]) {
925            // `WITH GAP <gap>`, only for session frames
926            WindowFrameBounds::Gap(Box::new(self.parse_expr()?))
927        } else {
928            // `<frame_start>`
929            WindowFrameBounds::Bounds {
930                start: self.parse_window_frame_bound()?,
931                end: None,
932            }
933        };
934        let exclusion = if self.parse_keyword(Keyword::EXCLUDE) {
935            Some(self.parse_window_frame_exclusion()?)
936        } else {
937            None
938        };
939        Ok(WindowFrame {
940            units,
941            bounds,
942            exclusion,
943        })
944    }
945
946    /// Parse `CURRENT ROW` or `{ <non-negative numeric | datetime | interval> | UNBOUNDED } { PRECEDING | FOLLOWING }`
947    pub fn parse_window_frame_bound(&mut self) -> ModalResult<WindowFrameBound> {
948        if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
949            Ok(WindowFrameBound::CurrentRow)
950        } else {
951            let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
952                None
953            } else {
954                Some(Box::new(self.parse_expr()?))
955            };
956            if self.parse_keyword(Keyword::PRECEDING) {
957                Ok(WindowFrameBound::Preceding(rows))
958            } else if self.parse_keyword(Keyword::FOLLOWING) {
959                Ok(WindowFrameBound::Following(rows))
960            } else {
961                self.expected("PRECEDING or FOLLOWING")
962            }
963        }
964    }
965
966    pub fn parse_window_frame_exclusion(&mut self) -> ModalResult<WindowFrameExclusion> {
967        if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
968            Ok(WindowFrameExclusion::CurrentRow)
969        } else if self.parse_keyword(Keyword::GROUP) {
970            Ok(WindowFrameExclusion::Group)
971        } else if self.parse_keyword(Keyword::TIES) {
972            Ok(WindowFrameExclusion::Ties)
973        } else if self.parse_keywords(&[Keyword::NO, Keyword::OTHERS]) {
974            Ok(WindowFrameExclusion::NoOthers)
975        } else {
976            self.expected("CURRENT ROW, GROUP, TIES, or NO OTHERS")
977        }
978    }
979
980    /// parse a group by expr. a group by expr can be one of group sets, roll up, cube, or simple
981    /// expr.
982    fn parse_group_by_expr(&mut self) -> ModalResult<Expr> {
983        if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
984            self.expect_token(&Token::LParen)?;
985            let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
986            self.expect_token(&Token::RParen)?;
987            Ok(Expr::GroupingSets(result))
988        } else if self.parse_keyword(Keyword::CUBE) {
989            self.expect_token(&Token::LParen)?;
990            let result = self.parse_comma_separated(|p| p.parse_tuple(true, false))?;
991            self.expect_token(&Token::RParen)?;
992            Ok(Expr::Cube(result))
993        } else if self.parse_keyword(Keyword::ROLLUP) {
994            self.expect_token(&Token::LParen)?;
995            let result = self.parse_comma_separated(|p| p.parse_tuple(true, false))?;
996            self.expect_token(&Token::RParen)?;
997            Ok(Expr::Rollup(result))
998        } else {
999            self.parse_expr()
1000        }
1001    }
1002
1003    /// parse a tuple with `(` and `)`.
1004    /// If `lift_singleton` is true, then a singleton tuple is lifted to a tuple of length 1,
1005    /// otherwise it will fail. If `allow_empty` is true, then an empty tuple is allowed.
1006    fn parse_tuple(&mut self, lift_singleton: bool, allow_empty: bool) -> ModalResult<Vec<Expr>> {
1007        if lift_singleton {
1008            if self.consume_token(&Token::LParen) {
1009                let result = if allow_empty && self.consume_token(&Token::RParen) {
1010                    vec![]
1011                } else {
1012                    let result = self.parse_comma_separated(Parser::parse_expr)?;
1013                    self.expect_token(&Token::RParen)?;
1014                    result
1015                };
1016                Ok(result)
1017            } else {
1018                Ok(vec![self.parse_expr()?])
1019            }
1020        } else {
1021            self.expect_token(&Token::LParen)?;
1022            let result = if allow_empty && self.consume_token(&Token::RParen) {
1023                vec![]
1024            } else {
1025                let result = self.parse_comma_separated(Parser::parse_expr)?;
1026                self.expect_token(&Token::RParen)?;
1027                result
1028            };
1029            Ok(result)
1030        }
1031    }
1032
1033    pub fn parse_case_expr(&mut self) -> ModalResult<Expr> {
1034        parser_v2::expr_case(self)
1035    }
1036
1037    /// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
1038    pub fn parse_cast_expr(&mut self) -> ModalResult<Expr> {
1039        parser_v2::expr_cast(self)
1040    }
1041
1042    /// Parse a SQL TRY_CAST function e.g. `TRY_CAST(expr AS FLOAT)`
1043    pub fn parse_try_cast_expr(&mut self) -> ModalResult<Expr> {
1044        parser_v2::expr_try_cast(self)
1045    }
1046
1047    /// Parse a SQL EXISTS expression e.g. `WHERE EXISTS(SELECT ...)`.
1048    pub fn parse_exists_expr(&mut self) -> ModalResult<Expr> {
1049        self.expect_token(&Token::LParen)?;
1050        let exists_node = Expr::Exists(Box::new(self.parse_query()?));
1051        self.expect_token(&Token::RParen)?;
1052        Ok(exists_node)
1053    }
1054
1055    pub fn parse_extract_expr(&mut self) -> ModalResult<Expr> {
1056        parser_v2::expr_extract(self)
1057    }
1058
1059    pub fn parse_substring_expr(&mut self) -> ModalResult<Expr> {
1060        parser_v2::expr_substring(self)
1061    }
1062
1063    /// `POSITION(<expr> IN <expr>)`
1064    pub fn parse_position_expr(&mut self) -> ModalResult<Expr> {
1065        parser_v2::expr_position(self)
1066    }
1067
1068    /// `OVERLAY(<expr> PLACING <expr> FROM <expr> [ FOR <expr> ])`
1069    pub fn parse_overlay_expr(&mut self) -> ModalResult<Expr> {
1070        parser_v2::expr_overlay(self)
1071    }
1072
1073    /// `TRIM ([WHERE] ['text'] FROM 'text')`\
1074    /// `TRIM ([WHERE] [FROM] 'text' [, 'text'])`
1075    pub fn parse_trim_expr(&mut self) -> ModalResult<Expr> {
1076        self.expect_token(&Token::LParen)?;
1077        let mut trim_where = None;
1078        if let Token::Word(word) = self.peek_token().token
1079            && [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword)
1080        {
1081            trim_where = Some(self.parse_trim_where()?);
1082        }
1083
1084        let (mut trim_what, expr) = if self.parse_keyword(Keyword::FROM) {
1085            (None, self.parse_expr()?)
1086        } else {
1087            let mut expr = self.parse_expr()?;
1088            if self.parse_keyword(Keyword::FROM) {
1089                let trim_what = std::mem::replace(&mut expr, self.parse_expr()?);
1090                (Some(Box::new(trim_what)), expr)
1091            } else {
1092                (None, expr)
1093            }
1094        };
1095
1096        if trim_what.is_none() && self.consume_token(&Token::Comma) {
1097            trim_what = Some(Box::new(self.parse_expr()?));
1098        }
1099        self.expect_token(&Token::RParen)?;
1100
1101        Ok(Expr::Trim {
1102            expr: Box::new(expr),
1103            trim_where,
1104            trim_what,
1105        })
1106    }
1107
1108    pub fn parse_trim_where(&mut self) -> ModalResult<TrimWhereField> {
1109        dispatch! { peek(keyword);
1110            Keyword::BOTH => keyword.value(TrimWhereField::Both),
1111            Keyword::LEADING => keyword.value(TrimWhereField::Leading),
1112            Keyword::TRAILING => keyword.value(TrimWhereField::Trailing),
1113            _ => fail
1114        }
1115        .expect("BOTH, LEADING, or TRAILING")
1116        .parse_next(self)
1117    }
1118
1119    /// Parses an array expression `[ex1, ex2, ..]`
1120    pub fn parse_array_expr(&mut self) -> ModalResult<Expr> {
1121        let mut expected_depth = None;
1122        let exprs = self.parse_array_inner(0, &mut expected_depth)?;
1123        Ok(Expr::Array(Array {
1124            elem: exprs,
1125            // Top-level array is named.
1126            named: true,
1127        }))
1128    }
1129
1130    fn parse_array_inner(
1131        &mut self,
1132        depth: usize,
1133        expected_depth: &mut Option<usize>,
1134    ) -> ModalResult<Vec<Expr>> {
1135        self.expect_token(&Token::LBracket)?;
1136        if let Some(expected_depth) = *expected_depth
1137            && depth > expected_depth
1138        {
1139            return self.expected("]");
1140        }
1141        let exprs = if self.peek_token() == Token::LBracket {
1142            self.parse_comma_separated(|parser| {
1143                let exprs = parser.parse_array_inner(depth + 1, expected_depth)?;
1144                Ok(Expr::Array(Array {
1145                    elem: exprs,
1146                    named: false,
1147                }))
1148            })?
1149        } else {
1150            if let Some(expected_depth) = *expected_depth {
1151                if depth < expected_depth {
1152                    return self.expected("[");
1153                }
1154            } else {
1155                *expected_depth = Some(depth);
1156            }
1157            if self.consume_token(&Token::RBracket) {
1158                return Ok(vec![]);
1159            }
1160            self.parse_comma_separated(Self::parse_expr)?
1161        };
1162        self.expect_token(&Token::RBracket)?;
1163        Ok(exprs)
1164    }
1165
1166    /// Parses a map expression `MAP {k1:v1, k2:v2, ..}`
1167    pub fn parse_map_expr(&mut self) -> ModalResult<Expr> {
1168        self.expect_token(&Token::LBrace)?;
1169        if self.consume_token(&Token::RBrace) {
1170            return Ok(Expr::Map { entries: vec![] });
1171        }
1172        let entries = self.parse_comma_separated(|parser| {
1173            let key = parser.parse_expr()?;
1174            parser.expect_token(&Token::Colon)?;
1175            let value = parser.parse_expr()?;
1176            Ok((key, value))
1177        })?;
1178        self.expect_token(&Token::RBrace)?;
1179        Ok(Expr::Map { entries })
1180    }
1181
1182    // This function parses date/time fields for interval qualifiers.
1183    pub fn parse_date_time_field(&mut self) -> ModalResult<DateTimeField> {
1184        dispatch! { peek(keyword);
1185            Keyword::YEAR => keyword.value(DateTimeField::Year),
1186            Keyword::MONTH => keyword.value(DateTimeField::Month),
1187            Keyword::DAY => keyword.value(DateTimeField::Day),
1188            Keyword::HOUR => keyword.value(DateTimeField::Hour),
1189            Keyword::MINUTE => keyword.value(DateTimeField::Minute),
1190            Keyword::SECOND => keyword.value(DateTimeField::Second),
1191            _ => fail,
1192        }
1193        .expect("date/time field")
1194        .parse_next(self)
1195    }
1196
1197    // This function parses date/time fields for the EXTRACT function-like operator. PostgreSQL
1198    // allows arbitrary inputs including invalid ones.
1199    //
1200    // ```
1201    //   select extract(day from null::date);
1202    //   select extract(invalid from null::date);
1203    //   select extract("invaLId" from null::date);
1204    //   select extract('invaLId' from null::date);
1205    // ```
1206    pub fn parse_date_time_field_in_extract(&mut self) -> ModalResult<String> {
1207        let checkpoint = *self;
1208        let token = self.next_token();
1209        match token.token {
1210            Token::Word(w) => Ok(w.value.to_uppercase()),
1211            Token::SingleQuotedString(s) => Ok(s.to_uppercase()),
1212            _ => {
1213                *self = checkpoint;
1214                self.expected("date/time field")
1215            }
1216        }
1217    }
1218
1219    /// Parse an INTERVAL literal.
1220    ///
1221    /// Some syntactically valid intervals:
1222    ///
1223    ///   1. `INTERVAL '1' DAY`
1224    ///   2. `INTERVAL '1-1' YEAR TO MONTH`
1225    ///   3. `INTERVAL '1' SECOND`
1226    ///   4. `INTERVAL '1:1:1.1' HOUR (5) TO SECOND (5)`
1227    ///   5. `INTERVAL '1.1' SECOND (2, 2)`
1228    ///   6. `INTERVAL '1:1' HOUR (5) TO MINUTE (5)`
1229    ///
1230    /// Note that we do not currently attempt to parse the quoted value.
1231    pub fn parse_literal_interval(&mut self) -> ModalResult<Expr> {
1232        // The SQL standard allows an optional sign before the value string, but
1233        // it is not clear if any implementations support that syntax, so we
1234        // don't currently try to parse it. (The sign can instead be included
1235        // inside the value string.)
1236
1237        // The first token in an interval is a string literal which specifies
1238        // the duration of the interval.
1239        let value = self.parse_literal_string()?;
1240
1241        // Following the string literal is a qualifier which indicates the units
1242        // of the duration specified in the string literal.
1243        //
1244        // Note that PostgreSQL allows omitting the qualifier, so we provide
1245        // this more general implementation.
1246        let leading_field = match self.peek_token().token {
1247            Token::Word(kw)
1248                if [
1249                    Keyword::YEAR,
1250                    Keyword::MONTH,
1251                    Keyword::DAY,
1252                    Keyword::HOUR,
1253                    Keyword::MINUTE,
1254                    Keyword::SECOND,
1255                ]
1256                .contains(&kw.keyword) =>
1257            {
1258                Some(self.parse_date_time_field()?)
1259            }
1260            _ => None,
1261        };
1262
1263        let (leading_precision, last_field, fsec_precision) =
1264            if leading_field == Some(DateTimeField::Second) {
1265                // SQL mandates special syntax for `SECOND TO SECOND` literals.
1266                // Instead of
1267                //     `SECOND [(<leading precision>)] TO SECOND[(<fractional seconds precision>)]`
1268                // one must use the special format:
1269                //     `SECOND [( <leading precision> [ , <fractional seconds precision>] )]`
1270                let last_field = None;
1271                let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
1272                (leading_precision, last_field, fsec_precision)
1273            } else {
1274                let leading_precision = self.parse_optional_precision()?;
1275                if self.parse_keyword(Keyword::TO) {
1276                    let last_field = Some(self.parse_date_time_field()?);
1277                    let fsec_precision = if last_field == Some(DateTimeField::Second) {
1278                        self.parse_optional_precision()?
1279                    } else {
1280                        None
1281                    };
1282                    (leading_precision, last_field, fsec_precision)
1283                } else {
1284                    (leading_precision, None, None)
1285                }
1286            };
1287
1288        Ok(Expr::Value(Value::Interval {
1289            value,
1290            leading_field,
1291            leading_precision,
1292            last_field,
1293            fractional_seconds_precision: fsec_precision,
1294        }))
1295    }
1296
1297    /// Parse an operator following an expression
1298    pub fn parse_infix(&mut self, expr: Expr, precedence: Precedence) -> ModalResult<Expr> {
1299        let checkpoint = *self;
1300        let tok = self.next_token();
1301        debug!("parsing infix {:?}", tok.token);
1302        let regular_binary_operator = match &tok.token {
1303            Token::Eq => Some(BinaryOperator::Eq),
1304            Token::Neq => Some(BinaryOperator::NotEq),
1305            Token::Gt => Some(BinaryOperator::Gt),
1306            Token::GtEq => Some(BinaryOperator::GtEq),
1307            Token::Lt => Some(BinaryOperator::Lt),
1308            Token::LtEq => Some(BinaryOperator::LtEq),
1309            Token::Plus => Some(BinaryOperator::Plus),
1310            Token::Minus => Some(BinaryOperator::Minus),
1311            Token::Mul => Some(BinaryOperator::Multiply),
1312            Token::Mod => Some(BinaryOperator::Modulo),
1313            Token::Pipe => Some(BinaryOperator::Custom("|".to_owned())),
1314            Token::Caret => Some(BinaryOperator::Pow),
1315            Token::Div => Some(BinaryOperator::Divide),
1316            Token::Op(name) => Some(BinaryOperator::Custom(name.clone())),
1317            Token::Word(w) => match w.keyword {
1318                Keyword::AND => Some(BinaryOperator::And),
1319                Keyword::OR => Some(BinaryOperator::Or),
1320                Keyword::XOR => Some(BinaryOperator::Xor),
1321                Keyword::OPERATOR if self.peek_token() == Token::LParen => Some(
1322                    BinaryOperator::PGQualified(Box::new(self.parse_qualified_operator()?)),
1323                ),
1324                _ => None,
1325            },
1326            _ => None,
1327        };
1328
1329        if let Some(op) = regular_binary_operator {
1330            // // `all/any/some` only appears to the right of the binary op.
1331            // if let Some(keyword) =
1332            //     self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
1333            // {
1334            //     self.expect_token(&Token::LParen)?;
1335            //     // In upstream's PR of parser-rs, there is `self.parser_subexpr(precedence)` here.
1336            //     // But it will fail to parse `select 1 = any(null and true);`.
1337            //     let right = self.parse_expr()?;
1338            //     self.expect_token(&Token::RParen)?;
1339
1340            //     // TODO: support `all/any/some(subquery)`.
1341            //     if let Expr::Subquery(_) = &right {
1342            //         parser_err!("ANY/SOME/ALL(Subquery) is not implemented");
1343            //     }
1344
1345            //     let right = match keyword {
1346            //         Keyword::ALL => Box::new(Expr::AllOp(Box::new(right))),
1347            //         // `SOME` is a synonym for `ANY`.
1348            //         Keyword::ANY | Keyword::SOME => Box::new(Expr::SomeOp(Box::new(right))),
1349            //         _ => unreachable!(),
1350            //     };
1351
1352            //     Ok(Expr::BinaryOp {
1353            //         left: Box::new(expr),
1354            //         op,
1355            //         right,
1356            //     })
1357            // } else {
1358            Ok(Expr::BinaryOp {
1359                left: Box::new(expr),
1360                op,
1361                right: Box::new(self.parse_subexpr(precedence)?),
1362            })
1363            // }
1364        } else if let Token::Word(w) = &tok.token {
1365            match w.keyword {
1366                Keyword::IS => {
1367                    if self.parse_keyword(Keyword::TRUE) {
1368                        Ok(Expr::IsTrue(Box::new(expr)))
1369                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
1370                        Ok(Expr::IsNotTrue(Box::new(expr)))
1371                    } else if self.parse_keyword(Keyword::FALSE) {
1372                        Ok(Expr::IsFalse(Box::new(expr)))
1373                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
1374                        Ok(Expr::IsNotFalse(Box::new(expr)))
1375                    } else if self.parse_keyword(Keyword::UNKNOWN) {
1376                        Ok(Expr::IsUnknown(Box::new(expr)))
1377                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
1378                        Ok(Expr::IsNotUnknown(Box::new(expr)))
1379                    } else if self.parse_keyword(Keyword::NULL) {
1380                        Ok(Expr::IsNull(Box::new(expr)))
1381                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
1382                        Ok(Expr::IsNotNull(Box::new(expr)))
1383                    } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
1384                        let expr2 = self.parse_expr()?;
1385                        Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
1386                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
1387                    {
1388                        let expr2 = self.parse_expr()?;
1389                        Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
1390                    } else {
1391                        let negated = self.parse_keyword(Keyword::NOT);
1392
1393                        if self.parse_keyword(Keyword::JSON) {
1394                            self.parse_is_json(expr, negated)
1395                        } else {
1396                            self.expected(
1397                                "[NOT] { TRUE | FALSE | UNKNOWN | NULL | DISTINCT FROM | JSON } after IS",
1398                            )
1399                        }
1400                    }
1401                }
1402                Keyword::AT => {
1403                    assert_eq!(precedence, Precedence::At);
1404                    let time_zone = Box::new(
1405                        preceded(
1406                            (Keyword::TIME, Keyword::ZONE),
1407                            cut_err(|p: &mut Self| p.parse_subexpr(precedence)),
1408                        )
1409                        .parse_next(self)?,
1410                    );
1411                    Ok(Expr::AtTimeZone {
1412                        timestamp: Box::new(expr),
1413                        time_zone,
1414                    })
1415                }
1416                keyword @ (Keyword::ALL | Keyword::ANY | Keyword::SOME) => {
1417                    self.expect_token(&Token::LParen)?;
1418                    // In upstream's PR of parser-rs, there is `self.parser_subexpr(precedence)` here.
1419                    // But it will fail to parse `select 1 = any(null and true);`.
1420                    let sub = self.parse_expr()?;
1421                    self.expect_token(&Token::RParen)?;
1422
1423                    // TODO: support `all/any/some(subquery)`.
1424                    if let Expr::Subquery(_) = &sub {
1425                        parser_err!("ANY/SOME/ALL(Subquery) is not implemented");
1426                    }
1427
1428                    Ok(match keyword {
1429                        Keyword::ALL => Expr::AllOp(Box::new(sub)),
1430                        // `SOME` is a synonym for `ANY`.
1431                        Keyword::ANY | Keyword::SOME => Expr::SomeOp(Box::new(sub)),
1432                        _ => unreachable!(),
1433                    })
1434                }
1435                Keyword::NOT
1436                | Keyword::IN
1437                | Keyword::BETWEEN
1438                | Keyword::LIKE
1439                | Keyword::ILIKE
1440                | Keyword::SIMILAR => {
1441                    *self = checkpoint;
1442                    let negated = self.parse_keyword(Keyword::NOT);
1443                    if self.parse_keyword(Keyword::IN) {
1444                        self.parse_in(expr, negated)
1445                    } else if self.parse_keyword(Keyword::BETWEEN) {
1446                        self.parse_between(expr, negated)
1447                    } else if self.parse_keyword(Keyword::LIKE) {
1448                        Ok(Expr::Like {
1449                            negated,
1450                            expr: Box::new(expr),
1451                            pattern: Box::new(self.parse_subexpr(Precedence::Like)?),
1452                            escape_char: self.parse_escape()?,
1453                        })
1454                    } else if self.parse_keyword(Keyword::ILIKE) {
1455                        Ok(Expr::ILike {
1456                            negated,
1457                            expr: Box::new(expr),
1458                            pattern: Box::new(self.parse_subexpr(Precedence::Like)?),
1459                            escape_char: self.parse_escape()?,
1460                        })
1461                    } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
1462                        Ok(Expr::SimilarTo {
1463                            negated,
1464                            expr: Box::new(expr),
1465                            pattern: Box::new(self.parse_subexpr(Precedence::Like)?),
1466                            escape_char: self.parse_escape()?,
1467                        })
1468                    } else {
1469                        self.expected("IN, BETWEEN or SIMILAR TO after NOT")
1470                    }
1471                }
1472                // Can only happen if `get_next_precedence` got out of sync with this function
1473                _ => parser_err!("No infix parser for token {:?}", tok),
1474            }
1475        } else if Token::DoubleColon == tok {
1476            self.parse_pg_cast(expr)
1477        } else if Token::LBracket == tok {
1478            self.parse_array_index(expr)
1479        } else {
1480            // Can only happen if `get_next_precedence` got out of sync with this function
1481            parser_err!("No infix parser for token {:?}", tok)
1482        }
1483    }
1484
1485    /// parse the ESCAPE CHAR portion of LIKE, ILIKE, and SIMILAR TO
1486    pub fn parse_escape(&mut self) -> ModalResult<Option<EscapeChar>> {
1487        if self.parse_keyword(Keyword::ESCAPE) {
1488            let s = self.parse_literal_string()?;
1489            let mut chs = s.chars();
1490            if let Some(ch) = chs.next() {
1491                if chs.next().is_some() {
1492                    parser_err!("Escape string must be empty or one character, found {s:?}")
1493                } else {
1494                    Ok(Some(EscapeChar::escape(ch)))
1495                }
1496            } else {
1497                Ok(Some(EscapeChar::empty()))
1498            }
1499        } else {
1500            Ok(None)
1501        }
1502    }
1503
1504    /// We parse both `array[1,9][1]`, `array[1,9][1:2]`, `array[1,9][:2]`, `array[1,9][1:]` and
1505    /// `array[1,9][:]` in this function.
1506    pub fn parse_array_index(&mut self, expr: Expr) -> ModalResult<Expr> {
1507        let new_expr = match self.peek_token().token {
1508            Token::Colon => {
1509                // [:] or [:N]
1510                assert!(self.consume_token(&Token::Colon));
1511                let end = match self.peek_token().token {
1512                    Token::RBracket => None,
1513                    _ => {
1514                        let end_index = Box::new(self.parse_expr()?);
1515                        Some(end_index)
1516                    }
1517                };
1518                Expr::ArrayRangeIndex {
1519                    obj: Box::new(expr),
1520                    start: None,
1521                    end,
1522                }
1523            }
1524            _ => {
1525                // [N], [N:], [N:M]
1526                let index = Box::new(self.parse_expr()?);
1527                match self.peek_token().token {
1528                    Token::Colon => {
1529                        // [N:], [N:M]
1530                        assert!(self.consume_token(&Token::Colon));
1531                        match self.peek_token().token {
1532                            Token::RBracket => {
1533                                // [N:]
1534                                Expr::ArrayRangeIndex {
1535                                    obj: Box::new(expr),
1536                                    start: Some(index),
1537                                    end: None,
1538                                }
1539                            }
1540                            _ => {
1541                                // [N:M]
1542                                let end = Some(Box::new(self.parse_expr()?));
1543                                Expr::ArrayRangeIndex {
1544                                    obj: Box::new(expr),
1545                                    start: Some(index),
1546                                    end,
1547                                }
1548                            }
1549                        }
1550                    }
1551                    _ => {
1552                        // [N]
1553                        Expr::Index {
1554                            obj: Box::new(expr),
1555                            index,
1556                        }
1557                    }
1558                }
1559            }
1560        };
1561        self.expect_token(&Token::RBracket)?;
1562        // recursively checking for more indices
1563        if self.consume_token(&Token::LBracket) {
1564            self.parse_array_index(new_expr)
1565        } else {
1566            Ok(new_expr)
1567        }
1568    }
1569
1570    /// Parses the optional constraints following the `IS [NOT] JSON` predicate
1571    pub fn parse_is_json(&mut self, expr: Expr, negated: bool) -> ModalResult<Expr> {
1572        let item_type = match self.peek_token().token {
1573            Token::Word(w) => match w.keyword {
1574                Keyword::VALUE => Some(JsonPredicateType::Value),
1575                Keyword::ARRAY => Some(JsonPredicateType::Array),
1576                Keyword::OBJECT => Some(JsonPredicateType::Object),
1577                Keyword::SCALAR => Some(JsonPredicateType::Scalar),
1578                _ => None,
1579            },
1580            _ => None,
1581        };
1582        if item_type.is_some() {
1583            self.next_token();
1584        }
1585        let item_type = item_type.unwrap_or_default();
1586
1587        let unique_keys = self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]);
1588        if unique_keys.is_some() {
1589            self.expect_keyword(Keyword::UNIQUE)?;
1590            _ = self.parse_keyword(Keyword::KEYS);
1591        }
1592        let unique_keys = unique_keys.is_some_and(|w| w == Keyword::WITH);
1593
1594        Ok(Expr::IsJson {
1595            expr: Box::new(expr),
1596            negated,
1597            item_type,
1598            unique_keys,
1599        })
1600    }
1601
1602    /// Parses the parens following the `[ NOT ] IN` operator
1603    pub fn parse_in(&mut self, expr: Expr, negated: bool) -> ModalResult<Expr> {
1604        self.expect_token(&Token::LParen)?;
1605        let in_op = if matches!(self.peek_token().token, Token::Word(w) if w.keyword == Keyword::SELECT || w.keyword == Keyword::WITH)
1606        {
1607            Expr::InSubquery {
1608                expr: Box::new(expr),
1609                subquery: Box::new(self.parse_query()?),
1610                negated,
1611            }
1612        } else {
1613            Expr::InList {
1614                expr: Box::new(expr),
1615                list: self.parse_comma_separated(Parser::parse_expr)?,
1616                negated,
1617            }
1618        };
1619        self.expect_token(&Token::RParen)?;
1620        Ok(in_op)
1621    }
1622
1623    /// Parses `BETWEEN <low> AND <high>`, assuming the `BETWEEN` keyword was already consumed
1624    pub fn parse_between(&mut self, expr: Expr, negated: bool) -> ModalResult<Expr> {
1625        // Stop parsing subexpressions for <low> and <high> on tokens with
1626        // precedence lower than that of `BETWEEN`, such as `AND`, `IS`, etc.
1627        let low = self.parse_subexpr(Precedence::Between)?;
1628        self.expect_keyword(Keyword::AND)?;
1629        let high = self.parse_subexpr(Precedence::Between)?;
1630        Ok(Expr::Between {
1631            expr: Box::new(expr),
1632            negated,
1633            low: Box::new(low),
1634            high: Box::new(high),
1635        })
1636    }
1637
1638    /// Parse a postgresql casting style which is in the form of `expr::datatype`
1639    pub fn parse_pg_cast(&mut self, expr: Expr) -> ModalResult<Expr> {
1640        Ok(Expr::Cast {
1641            expr: Box::new(expr),
1642            data_type: self.parse_data_type()?,
1643        })
1644    }
1645
1646    /// Get the precedence of the next token
1647    pub fn get_next_precedence(&self) -> ModalResult<Precedence> {
1648        use Precedence as P;
1649
1650        let token = self.peek_token();
1651        debug!("get_next_precedence() {:?}", token);
1652        match token.token {
1653            Token::Word(w) if w.keyword == Keyword::OR => Ok(P::LogicalOr),
1654            Token::Word(w) if w.keyword == Keyword::XOR => Ok(P::LogicalXor),
1655            Token::Word(w) if w.keyword == Keyword::AND => Ok(P::LogicalAnd),
1656            Token::Word(w) if w.keyword == Keyword::AT => {
1657                match (self.peek_nth_token(1).token, self.peek_nth_token(2).token) {
1658                    (Token::Word(w), Token::Word(w2))
1659                        if w.keyword == Keyword::TIME && w2.keyword == Keyword::ZONE =>
1660                    {
1661                        Ok(P::At)
1662                    }
1663                    _ => Ok(P::Zero),
1664                }
1665            }
1666
1667            Token::Word(w) if w.keyword == Keyword::NOT => match self.peek_nth_token(1).token {
1668                // The precedence of NOT varies depending on keyword that
1669                // follows it. If it is followed by IN, BETWEEN, or LIKE,
1670                // it takes on the precedence of those tokens. Otherwise it
1671                // is not an infix operator, and therefore has zero
1672                // precedence.
1673                Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(P::Between),
1674                Token::Word(w) if w.keyword == Keyword::IN => Ok(P::Between),
1675                Token::Word(w) if w.keyword == Keyword::LIKE => Ok(P::Like),
1676                Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(P::Like),
1677                Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(P::Like),
1678                _ => Ok(P::Zero),
1679            },
1680
1681            Token::Word(w) if w.keyword == Keyword::IS => Ok(P::Is),
1682            Token::Word(w) if w.keyword == Keyword::ISNULL => Ok(P::Is),
1683            Token::Word(w) if w.keyword == Keyword::NOTNULL => Ok(P::Is),
1684            Token::Eq | Token::Lt | Token::LtEq | Token::Neq | Token::Gt | Token::GtEq => {
1685                Ok(P::Cmp)
1686            }
1687            Token::Word(w) if w.keyword == Keyword::IN => Ok(P::Between),
1688            Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(P::Between),
1689            Token::Word(w) if w.keyword == Keyword::LIKE => Ok(P::Like),
1690            Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(P::Like),
1691            Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(P::Like),
1692            Token::Word(w) if w.keyword == Keyword::ALL => Ok(P::Other),
1693            Token::Word(w) if w.keyword == Keyword::ANY => Ok(P::Other),
1694            Token::Word(w) if w.keyword == Keyword::SOME => Ok(P::Other),
1695            Token::Op(_) => Ok(P::Other),
1696            Token::Word(w)
1697                if w.keyword == Keyword::OPERATOR && self.peek_nth_token(1) == Token::LParen =>
1698            {
1699                Ok(P::Other)
1700            }
1701            // In some languages (incl. rust, c), bitwise operators have precedence:
1702            //   or < xor < and < shift
1703            // But in PostgreSQL, they are just left to right. So `2 | 3 & 4` is 0.
1704            Token::Pipe => Ok(P::Other),
1705            Token::Plus | Token::Minus => Ok(P::PlusMinus),
1706            Token::Mul | Token::Div | Token::Mod => Ok(P::MulDiv),
1707            Token::Caret => Ok(P::Exp),
1708            Token::LBracket => Ok(P::Array),
1709            Token::DoubleColon => Ok(P::DoubleColon),
1710            _ => Ok(P::Zero),
1711        }
1712    }
1713
1714    /// Return the first non-whitespace token that has not yet been processed
1715    /// (or None if reached end-of-file)
1716    pub fn peek_token(&self) -> TokenWithLocation {
1717        self.peek_nth_token(0)
1718    }
1719
1720    /// Return nth non-whitespace token that has not yet been processed
1721    pub fn peek_nth_token(&self, mut n: usize) -> TokenWithLocation {
1722        let mut index = 0;
1723        loop {
1724            let token = self.0.get(index);
1725            index += 1;
1726            match token.map(|x| &x.token) {
1727                Some(Token::Whitespace(_)) => continue,
1728                _ => {
1729                    if n == 0 {
1730                        return token.cloned().unwrap_or(TokenWithLocation::eof());
1731                    }
1732                    n -= 1;
1733                }
1734            }
1735        }
1736    }
1737
1738    /// Return the first non-whitespace token that has not yet been processed
1739    /// (or None if reached end-of-file) and mark it as processed. OK to call
1740    /// repeatedly after reaching EOF.
1741    pub fn next_token(&mut self) -> TokenWithLocation {
1742        loop {
1743            let Some(token) = self.0.first() else {
1744                return TokenWithLocation::eof();
1745            };
1746            self.0 = &self.0[1..];
1747            match token.token {
1748                Token::Whitespace(_) => continue,
1749                _ => return token.clone(),
1750            }
1751        }
1752    }
1753
1754    /// Return the first unprocessed token, possibly whitespace.
1755    pub fn next_token_no_skip(&mut self) -> Option<&TokenWithLocation> {
1756        if self.0.is_empty() {
1757            None
1758        } else {
1759            let (first, rest) = self.0.split_at(1);
1760            self.0 = rest;
1761            Some(&first[0])
1762        }
1763    }
1764
1765    /// Report an expected error at the current position.
1766    pub fn expected<T>(&self, expected: &str) -> ModalResult<T> {
1767        parser_err!("expected {}, found: {}", expected, self.peek_token().token)
1768    }
1769
1770    /// Revert the parser to a previous position and report an expected error.
1771    pub fn expected_at<T>(&mut self, checkpoint: Self, expected: &str) -> ModalResult<T> {
1772        *self = checkpoint;
1773        self.expected(expected)
1774    }
1775
1776    /// Check if the expected match is the next token.
1777    /// The equality check is case-insensitive.
1778    pub fn parse_word(&mut self, expected: &str) -> bool {
1779        match self.peek_token().token {
1780            Token::Word(w) if w.value.to_uppercase() == expected => {
1781                self.next_token();
1782                true
1783            }
1784            _ => false,
1785        }
1786    }
1787
1788    pub fn expect_word(&mut self, expected: &str) -> ModalResult<()> {
1789        if self.parse_word(expected) {
1790            Ok(())
1791        } else {
1792            self.expected(expected)
1793        }
1794    }
1795
1796    /// Look for an expected keyword and consume it if it exists
1797    #[must_use]
1798    pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
1799        match self.peek_token().token {
1800            Token::Word(w) if expected == w.keyword => {
1801                self.next_token();
1802                true
1803            }
1804            _ => false,
1805        }
1806    }
1807
1808    /// Look for an expected sequence of keywords and consume them if they exist
1809    #[must_use]
1810    pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
1811        let checkpoint = *self;
1812        for &keyword in keywords {
1813            if !self.parse_keyword(keyword) {
1814                // println!("parse_keywords aborting .. did not find {:?}", keyword);
1815                // reset index and return immediately
1816                *self = checkpoint;
1817                return false;
1818            }
1819        }
1820        true
1821    }
1822
1823    /// Look for one of the given keywords and return the one that matches.
1824    #[must_use]
1825    pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
1826        match self.peek_token().token {
1827            Token::Word(w) => {
1828                keywords
1829                    .iter()
1830                    .find(|keyword| **keyword == w.keyword)
1831                    .map(|keyword| {
1832                        self.next_token();
1833                        *keyword
1834                    })
1835            }
1836            _ => None,
1837        }
1838    }
1839
1840    pub fn peek_nth_any_of_keywords(&mut self, n: usize, keywords: &[Keyword]) -> bool {
1841        match self.peek_nth_token(n).token {
1842            Token::Word(w) => keywords.contains(&w.keyword),
1843            _ => false,
1844        }
1845    }
1846
1847    /// Bail out if the current token is not one of the expected keywords, or consume it if it is
1848    pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> ModalResult<Keyword> {
1849        if let Some(keyword) = self.parse_one_of_keywords(keywords) {
1850            Ok(keyword)
1851        } else {
1852            let keywords: Vec<String> = keywords.iter().map(|x| format!("{:?}", x)).collect();
1853            self.expected(&format!("one of {}", keywords.join(" or ")))
1854        }
1855    }
1856
1857    /// Bail out if the current token is not an expected keyword, or consume it if it is
1858    pub fn expect_keyword(&mut self, expected: Keyword) -> ModalResult<()> {
1859        if self.parse_keyword(expected) {
1860            Ok(())
1861        } else {
1862            self.expected(format!("{:?}", &expected).as_str())
1863        }
1864    }
1865
1866    /// Bail out if the following tokens are not the expected sequence of
1867    /// keywords, or consume them if they are.
1868    pub fn expect_keywords(&mut self, expected: &[Keyword]) -> ModalResult<()> {
1869        for &kw in expected {
1870            self.expect_keyword(kw)?;
1871        }
1872        Ok(())
1873    }
1874
1875    /// Consume the next token if it matches the expected token, otherwise return false
1876    #[must_use]
1877    pub fn consume_token(&mut self, expected: &Token) -> bool {
1878        if self.peek_token() == *expected {
1879            self.next_token();
1880            true
1881        } else {
1882            false
1883        }
1884    }
1885
1886    /// Bail out if the current token is not an expected keyword, or consume it if it is
1887    pub fn expect_token(&mut self, expected: &Token) -> ModalResult<()> {
1888        if self.consume_token(expected) {
1889            Ok(())
1890        } else {
1891            self.expected(&expected.to_string())
1892        }
1893    }
1894
1895    /// Parse a comma-separated list of 1+ items accepted by `F`
1896    pub fn parse_comma_separated<T, F>(&mut self, mut f: F) -> ModalResult<Vec<T>>
1897    where
1898        F: FnMut(&mut Self) -> ModalResult<T>,
1899    {
1900        let mut values = vec![];
1901        loop {
1902            values.push(f(self)?);
1903            if !self.consume_token(&Token::Comma) {
1904                break;
1905            }
1906        }
1907        Ok(values)
1908    }
1909
1910    /// Run a parser method `f`, reverting back to the current position
1911    /// if unsuccessful.
1912    #[must_use]
1913    fn maybe_parse<T, F>(&mut self, mut f: F) -> Option<T>
1914    where
1915        F: FnMut(&mut Self) -> ModalResult<T>,
1916    {
1917        let checkpoint = *self;
1918        match f(self) {
1919            Ok(t) => Some(t),
1920            _ => {
1921                *self = checkpoint;
1922                None
1923            }
1924        }
1925    }
1926
1927    /// Parse either `ALL` or `DISTINCT`. Returns `true` if `DISTINCT` is parsed and results in a
1928    /// `ParserError` if both `ALL` and `DISTINCT` are fround.
1929    pub fn parse_all_or_distinct(&mut self) -> ModalResult<bool> {
1930        let all = self.parse_keyword(Keyword::ALL);
1931        let distinct = self.parse_keyword(Keyword::DISTINCT);
1932        if all && distinct {
1933            parser_err!("Cannot specify both ALL and DISTINCT")
1934        } else {
1935            Ok(distinct)
1936        }
1937    }
1938
1939    /// Parse either `ALL` or `DISTINCT` or `DISTINCT ON (<expr>)`.
1940    pub fn parse_all_or_distinct_on(&mut self) -> ModalResult<Distinct> {
1941        if self.parse_keywords(&[Keyword::DISTINCT, Keyword::ON]) {
1942            self.expect_token(&Token::LParen)?;
1943            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1944            self.expect_token(&Token::RParen)?;
1945            return Ok(Distinct::DistinctOn(exprs));
1946        } else if self.parse_keyword(Keyword::DISTINCT) {
1947            return Ok(Distinct::Distinct);
1948        };
1949        _ = self.parse_keyword(Keyword::ALL);
1950        Ok(Distinct::All)
1951    }
1952
1953    /// Parse a SQL CREATE statement
1954    pub fn parse_create(&mut self) -> ModalResult<Statement> {
1955        let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
1956        let temporary = self
1957            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
1958            .is_some();
1959        if self.parse_keyword(Keyword::TABLE) {
1960            self.parse_create_table(or_replace, temporary)
1961        } else if self.parse_keyword(Keyword::VIEW) {
1962            self.parse_create_view(false, or_replace)
1963        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
1964            self.parse_create_view(true, or_replace)
1965        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::SOURCE]) {
1966            parser_err!("CREATE MATERIALIZED SOURCE has been deprecated, use CREATE TABLE instead")
1967        } else if self.parse_keyword(Keyword::SOURCE) {
1968            self.parse_create_source(or_replace, temporary)
1969        } else if self.parse_keyword(Keyword::SINK) {
1970            self.parse_create_sink(or_replace)
1971        } else if self.parse_keyword(Keyword::SUBSCRIPTION) {
1972            self.parse_create_subscription(or_replace)
1973        } else if self.parse_keyword(Keyword::CONNECTION) {
1974            self.parse_create_connection()
1975        } else if self.parse_keyword(Keyword::FUNCTION) {
1976            self.parse_create_function(or_replace, temporary)
1977        } else if self.parse_keyword(Keyword::AGGREGATE) {
1978            self.parse_create_aggregate(or_replace)
1979        } else if or_replace {
1980            self.expected(
1981                "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or [MATERIALIZED] SOURCE or SINK or FUNCTION after CREATE OR REPLACE",
1982            )
1983        } else if self.parse_keyword(Keyword::INDEX) {
1984            self.parse_create_index(false)
1985        } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
1986            self.parse_create_index(true)
1987        } else if self.parse_keyword(Keyword::SCHEMA) {
1988            self.parse_create_schema()
1989        } else if self.parse_keyword(Keyword::DATABASE) {
1990            self.parse_create_database()
1991        } else if self.parse_keyword(Keyword::USER) {
1992            self.parse_create_user()
1993        } else if self.parse_keyword(Keyword::SECRET) {
1994            self.parse_create_secret()
1995        } else {
1996            self.expected("an object type after CREATE")
1997        }
1998    }
1999
2000    pub fn parse_create_schema(&mut self) -> ModalResult<Statement> {
2001        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2002        let (schema_name, owner) = if self.parse_keyword(Keyword::AUTHORIZATION) {
2003            let owner = self.parse_object_name()?;
2004            (owner.clone(), Some(owner))
2005        } else {
2006            let schema_name = self.parse_object_name()?;
2007            let owner = if self.parse_keyword(Keyword::AUTHORIZATION) {
2008                Some(self.parse_object_name()?)
2009            } else {
2010                None
2011            };
2012            (schema_name, owner)
2013        };
2014        Ok(Statement::CreateSchema {
2015            schema_name,
2016            if_not_exists,
2017            owner,
2018        })
2019    }
2020
2021    pub fn parse_create_database(&mut self) -> ModalResult<Statement> {
2022        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2023        let db_name = self.parse_object_name()?;
2024        let _ = self.parse_keyword(Keyword::WITH);
2025
2026        let mut owner = None;
2027        let mut resource_group = None;
2028        let mut barrier_interval_ms = None;
2029        let mut checkpoint_frequency = None;
2030
2031        loop {
2032            if let Some(keyword) =
2033                self.parse_one_of_keywords(&[Keyword::OWNER, Keyword::RESOURCE_GROUP])
2034            {
2035                match keyword {
2036                    Keyword::OWNER => {
2037                        if owner.is_some() {
2038                            parser_err!("duplicate OWNER clause in CREATE DATABASE");
2039                        }
2040
2041                        let _ = self.consume_token(&Token::Eq);
2042                        owner = Some(self.parse_object_name()?);
2043                    }
2044                    Keyword::RESOURCE_GROUP => {
2045                        if resource_group.is_some() {
2046                            parser_err!("duplicate RESOURCE_GROUP clause in CREATE DATABASE");
2047                        }
2048
2049                        let _ = self.consume_token(&Token::Eq);
2050                        resource_group = Some(self.parse_set_variable()?);
2051                    }
2052                    _ => unreachable!(),
2053                }
2054            } else if self.parse_word("BARRIER_INTERVAL_MS") {
2055                if barrier_interval_ms.is_some() {
2056                    parser_err!("duplicate BARRIER_INTERVAL_MS clause in CREATE DATABASE");
2057                }
2058
2059                let _ = self.consume_token(&Token::Eq);
2060                barrier_interval_ms = Some(self.parse_literal_u32()?);
2061            } else if self.parse_word("CHECKPOINT_FREQUENCY") {
2062                if checkpoint_frequency.is_some() {
2063                    parser_err!("duplicate CHECKPOINT_FREQUENCY clause in CREATE DATABASE");
2064                }
2065
2066                let _ = self.consume_token(&Token::Eq);
2067                checkpoint_frequency = Some(self.parse_literal_u64()?);
2068            } else {
2069                break;
2070            }
2071        }
2072
2073        Ok(Statement::CreateDatabase {
2074            db_name,
2075            if_not_exists,
2076            owner,
2077            resource_group,
2078            barrier_interval_ms,
2079            checkpoint_frequency,
2080        })
2081    }
2082
2083    pub fn parse_create_view(
2084        &mut self,
2085        materialized: bool,
2086        or_replace: bool,
2087    ) -> ModalResult<Statement> {
2088        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2089        // Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
2090        // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
2091        let name = self.parse_object_name()?;
2092        let columns = self.parse_parenthesized_column_list(Optional)?;
2093        let with_options = self.parse_options_with_preceding_keyword(Keyword::WITH)?;
2094        self.expect_keyword(Keyword::AS)?;
2095        let query = Box::new(self.parse_query()?);
2096        let emit_mode = if materialized {
2097            self.parse_emit_mode()?
2098        } else {
2099            None
2100        };
2101        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
2102        Ok(Statement::CreateView {
2103            if_not_exists,
2104            name,
2105            columns,
2106            query,
2107            materialized,
2108            or_replace,
2109            with_options,
2110            emit_mode,
2111        })
2112    }
2113
2114    // CREATE [OR REPLACE]?
2115    // [TEMPORARY] SOURCE
2116    // [IF NOT EXISTS]?
2117    // <source_name: Ident>
2118    // [COLUMNS]?
2119    // [WITH (properties)]?
2120    // ROW FORMAT <row_format: Ident>
2121    // [ROW SCHEMA LOCATION <row_schema_location: String>]?
2122    pub fn parse_create_source(
2123        &mut self,
2124        _or_replace: bool,
2125        temporary: bool,
2126    ) -> ModalResult<Statement> {
2127        impl_parse_to!(if_not_exists => [Keyword::IF, Keyword::NOT, Keyword::EXISTS], self);
2128        impl_parse_to!(source_name: ObjectName, self);
2129
2130        // parse columns
2131        let (columns, constraints, source_watermarks, wildcard_idx) =
2132            self.parse_columns_with_watermark()?;
2133        let include_options = self.parse_include_options()?;
2134
2135        let with_options = self.parse_with_properties()?;
2136        let option = with_options
2137            .iter()
2138            .find(|&opt| opt.name.real_value() == UPSTREAM_SOURCE_KEY);
2139        let connector: String = option.map(|opt| opt.value.to_string()).unwrap_or_default();
2140        let cdc_source_job = connector.contains("-cdc");
2141        if cdc_source_job && (!columns.is_empty() || !constraints.is_empty()) {
2142            parser_err!("CDC source cannot define columns and constraints");
2143        }
2144
2145        // row format for nexmark source must be native
2146        // default row format for datagen source is native
2147        let format_encode = self.parse_format_encode_with_connector(&connector, cdc_source_job)?;
2148
2149        let stmt = CreateSourceStatement {
2150            temporary,
2151            if_not_exists,
2152            columns,
2153            wildcard_idx,
2154            constraints,
2155            source_name,
2156            with_properties: WithProperties(with_options),
2157            format_encode,
2158            source_watermarks,
2159            include_column_options: include_options,
2160        };
2161
2162        Ok(Statement::CreateSource { stmt })
2163    }
2164
2165    // CREATE [OR REPLACE]?
2166    // SINK
2167    // [IF NOT EXISTS]?
2168    // <sink_name: Ident>
2169    // FROM
2170    // <materialized_view: Ident>
2171    // [WITH (properties)]?
2172    pub fn parse_create_sink(&mut self, _or_replace: bool) -> ModalResult<Statement> {
2173        Ok(Statement::CreateSink {
2174            stmt: CreateSinkStatement::parse_to(self)?,
2175        })
2176    }
2177
2178    // CREATE
2179    // SUBSCRIPTION
2180    // [IF NOT EXISTS]?
2181    // <subscription_name: Ident>
2182    // FROM
2183    // <materialized_view: Ident>
2184    // [WITH (properties)]?
2185    pub fn parse_create_subscription(&mut self, _or_replace: bool) -> ModalResult<Statement> {
2186        Ok(Statement::CreateSubscription {
2187            stmt: CreateSubscriptionStatement::parse_to(self)?,
2188        })
2189    }
2190
2191    // CREATE
2192    // CONNECTION
2193    // [IF NOT EXISTS]?
2194    // <connection_name: Ident>
2195    // [WITH (properties)]?
2196    pub fn parse_create_connection(&mut self) -> ModalResult<Statement> {
2197        Ok(Statement::CreateConnection {
2198            stmt: CreateConnectionStatement::parse_to(self)?,
2199        })
2200    }
2201
2202    pub fn parse_create_function(
2203        &mut self,
2204        or_replace: bool,
2205        temporary: bool,
2206    ) -> ModalResult<Statement> {
2207        impl_parse_to!(if_not_exists => [Keyword::IF, Keyword::NOT, Keyword::EXISTS], self);
2208
2209        let FunctionDesc { name, args } = self.parse_function_desc()?;
2210
2211        let return_type = if self.parse_keyword(Keyword::RETURNS) {
2212            if self.parse_keyword(Keyword::TABLE) {
2213                self.expect_token(&Token::LParen)?;
2214                let mut values = vec![];
2215                loop {
2216                    values.push(self.parse_table_column_def()?);
2217                    let comma = self.consume_token(&Token::Comma);
2218                    if self.consume_token(&Token::RParen) {
2219                        // allow a trailing comma, even though it's not in standard
2220                        break;
2221                    } else if !comma {
2222                        return self.expected("',' or ')'");
2223                    }
2224                }
2225                Some(CreateFunctionReturns::Table(values))
2226            } else {
2227                Some(CreateFunctionReturns::Value(self.parse_data_type()?))
2228            }
2229        } else {
2230            None
2231        };
2232
2233        let params = self.parse_create_function_body()?;
2234        let with_options = self.parse_options_with_preceding_keyword(Keyword::WITH)?;
2235        let with_options = with_options.try_into()?;
2236        Ok(Statement::CreateFunction {
2237            or_replace,
2238            temporary,
2239            if_not_exists,
2240            name,
2241            args,
2242            returns: return_type,
2243            params,
2244            with_options,
2245        })
2246    }
2247
2248    fn parse_create_aggregate(&mut self, or_replace: bool) -> ModalResult<Statement> {
2249        impl_parse_to!(if_not_exists => [Keyword::IF, Keyword::NOT, Keyword::EXISTS], self);
2250
2251        let name = self.parse_object_name()?;
2252        self.expect_token(&Token::LParen)?;
2253        let args = self.parse_comma_separated(Parser::parse_function_arg)?;
2254        self.expect_token(&Token::RParen)?;
2255
2256        self.expect_keyword(Keyword::RETURNS)?;
2257        let returns = self.parse_data_type()?;
2258
2259        let append_only = self.parse_keywords(&[Keyword::APPEND, Keyword::ONLY]);
2260        let params = self.parse_create_function_body()?;
2261
2262        Ok(Statement::CreateAggregate {
2263            or_replace,
2264            if_not_exists,
2265            name,
2266            args,
2267            returns,
2268            append_only,
2269            params,
2270        })
2271    }
2272
2273    pub fn parse_declare(&mut self) -> ModalResult<Statement> {
2274        Ok(Statement::DeclareCursor {
2275            stmt: DeclareCursorStatement::parse_to(self)?,
2276        })
2277    }
2278
2279    pub fn parse_fetch_cursor(&mut self) -> ModalResult<Statement> {
2280        Ok(Statement::FetchCursor {
2281            stmt: FetchCursorStatement::parse_to(self)?,
2282        })
2283    }
2284
2285    pub fn parse_close_cursor(&mut self) -> ModalResult<Statement> {
2286        Ok(Statement::CloseCursor {
2287            stmt: CloseCursorStatement::parse_to(self)?,
2288        })
2289    }
2290
2291    fn parse_table_column_def(&mut self) -> ModalResult<TableColumnDef> {
2292        Ok(TableColumnDef {
2293            name: self.parse_identifier_non_reserved()?,
2294            data_type: self.parse_data_type()?,
2295        })
2296    }
2297
2298    fn parse_function_arg(&mut self) -> ModalResult<OperateFunctionArg> {
2299        let mode = if self.parse_keyword(Keyword::IN) {
2300            Some(ArgMode::In)
2301        } else if self.parse_keyword(Keyword::OUT) {
2302            Some(ArgMode::Out)
2303        } else if self.parse_keyword(Keyword::INOUT) {
2304            Some(ArgMode::InOut)
2305        } else {
2306            None
2307        };
2308
2309        // parse: [ argname ] argtype
2310        let mut name = None;
2311        let mut data_type = self.parse_data_type()?;
2312        if let DataType::Custom(n) = &data_type
2313            && !matches!(self.peek_token().token, Token::Comma | Token::RParen)
2314        {
2315            // the first token is actually a name
2316            name = Some(n.0[0].clone());
2317            data_type = self.parse_data_type()?;
2318        }
2319
2320        let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
2321        {
2322            Some(self.parse_expr()?)
2323        } else {
2324            None
2325        };
2326        Ok(OperateFunctionArg {
2327            mode,
2328            name,
2329            data_type,
2330            default_expr,
2331        })
2332    }
2333
2334    fn parse_create_function_body(&mut self) -> ModalResult<CreateFunctionBody> {
2335        let mut body = CreateFunctionBody::default();
2336        loop {
2337            fn ensure_not_set<T>(field: &Option<T>, name: &str) -> ModalResult<()> {
2338                if field.is_some() {
2339                    parser_err!("{name} specified more than once");
2340                }
2341                Ok(())
2342            }
2343            if self.parse_keyword(Keyword::AS) {
2344                ensure_not_set(&body.as_, "AS")?;
2345                body.as_ = Some(self.parse_function_definition()?);
2346            } else if self.parse_keyword(Keyword::LANGUAGE) {
2347                ensure_not_set(&body.language, "LANGUAGE")?;
2348                body.language = Some(self.parse_identifier()?);
2349            } else if self.parse_keyword(Keyword::RUNTIME) {
2350                ensure_not_set(&body.runtime, "RUNTIME")?;
2351                body.runtime = Some(self.parse_identifier()?);
2352            } else if self.parse_keyword(Keyword::IMMUTABLE) {
2353                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
2354                body.behavior = Some(FunctionBehavior::Immutable);
2355            } else if self.parse_keyword(Keyword::STABLE) {
2356                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
2357                body.behavior = Some(FunctionBehavior::Stable);
2358            } else if self.parse_keyword(Keyword::VOLATILE) {
2359                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
2360                body.behavior = Some(FunctionBehavior::Volatile);
2361            } else if self.parse_keyword(Keyword::RETURN) {
2362                ensure_not_set(&body.return_, "RETURN")?;
2363                body.return_ = Some(self.parse_expr()?);
2364            } else if self.parse_keyword(Keyword::USING) {
2365                ensure_not_set(&body.using, "USING")?;
2366                body.using = Some(self.parse_create_function_using()?);
2367            } else {
2368                return Ok(body);
2369            }
2370        }
2371    }
2372
2373    fn parse_create_function_using(&mut self) -> ModalResult<CreateFunctionUsing> {
2374        let keyword = self.expect_one_of_keywords(&[Keyword::LINK, Keyword::BASE64])?;
2375
2376        match keyword {
2377            Keyword::LINK => {
2378                let uri = self.parse_literal_string()?;
2379                Ok(CreateFunctionUsing::Link(uri))
2380            }
2381            Keyword::BASE64 => {
2382                let base64 = self.parse_literal_string()?;
2383                Ok(CreateFunctionUsing::Base64(base64))
2384            }
2385            _ => unreachable!("{}", keyword),
2386        }
2387    }
2388
2389    // CREATE USER name [ [ WITH ] option [ ... ] ]
2390    // where option can be:
2391    //       SUPERUSER | NOSUPERUSER
2392    //     | CREATEDB | NOCREATEDB
2393    //     | CREATEUSER | NOCREATEUSER
2394    //     | LOGIN | NOLOGIN
2395    //     | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL | OAUTH
2396    fn parse_create_user(&mut self) -> ModalResult<Statement> {
2397        Ok(Statement::CreateUser(CreateUserStatement::parse_to(self)?))
2398    }
2399
2400    fn parse_create_secret(&mut self) -> ModalResult<Statement> {
2401        Ok(Statement::CreateSecret {
2402            stmt: CreateSecretStatement::parse_to(self)?,
2403        })
2404    }
2405
2406    pub fn parse_with_properties(&mut self) -> ModalResult<Vec<SqlOption>> {
2407        self.parse_options_with_preceding_keyword(Keyword::WITH)
2408    }
2409
2410    pub fn parse_discard(&mut self) -> ModalResult<Statement> {
2411        self.expect_keyword(Keyword::ALL)?;
2412        Ok(Statement::Discard(DiscardType::All))
2413    }
2414
2415    pub fn parse_drop(&mut self) -> ModalResult<Statement> {
2416        if self.parse_keyword(Keyword::FUNCTION) {
2417            return self.parse_drop_function();
2418        } else if self.parse_keyword(Keyword::AGGREGATE) {
2419            return self.parse_drop_aggregate();
2420        }
2421        Ok(Statement::Drop(DropStatement::parse_to(self)?))
2422    }
2423
2424    /// ```sql
2425    /// DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
2426    /// [ CASCADE | RESTRICT ]
2427    /// ```
2428    fn parse_drop_function(&mut self) -> ModalResult<Statement> {
2429        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
2430        let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
2431        let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
2432            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
2433            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
2434            _ => None,
2435        };
2436        Ok(Statement::DropFunction {
2437            if_exists,
2438            func_desc,
2439            option,
2440        })
2441    }
2442
2443    /// ```sql
2444    /// DROP AGGREGATE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
2445    /// [ CASCADE | RESTRICT ]
2446    /// ```
2447    fn parse_drop_aggregate(&mut self) -> ModalResult<Statement> {
2448        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
2449        let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
2450        let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
2451            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
2452            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
2453            _ => None,
2454        };
2455        Ok(Statement::DropAggregate {
2456            if_exists,
2457            func_desc,
2458            option,
2459        })
2460    }
2461
2462    fn parse_function_desc(&mut self) -> ModalResult<FunctionDesc> {
2463        let name = self.parse_object_name()?;
2464
2465        let args = if self.consume_token(&Token::LParen) {
2466            if self.consume_token(&Token::RParen) {
2467                Some(vec![])
2468            } else {
2469                let args = self.parse_comma_separated(Parser::parse_function_arg)?;
2470                self.expect_token(&Token::RParen)?;
2471                Some(args)
2472            }
2473        } else {
2474            None
2475        };
2476
2477        Ok(FunctionDesc { name, args })
2478    }
2479
2480    pub fn parse_create_index(&mut self, unique: bool) -> ModalResult<Statement> {
2481        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2482        let index_name = self.parse_object_name()?;
2483        self.expect_keyword(Keyword::ON)?;
2484        let table_name = self.parse_object_name()?;
2485        let method = if self.parse_keyword(Keyword::USING) {
2486            let method = self.parse_identifier()?;
2487            Some(method)
2488        } else {
2489            None
2490        };
2491        self.expect_token(&Token::LParen)?;
2492        let columns = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2493        self.expect_token(&Token::RParen)?;
2494        let mut include = vec![];
2495        if self.parse_keyword(Keyword::INCLUDE) {
2496            self.expect_token(&Token::LParen)?;
2497            include = self.parse_comma_separated(Parser::parse_identifier_non_reserved)?;
2498            self.expect_token(&Token::RParen)?;
2499        }
2500        let mut distributed_by = vec![];
2501        if self.parse_keywords(&[Keyword::DISTRIBUTED, Keyword::BY]) {
2502            self.expect_token(&Token::LParen)?;
2503            distributed_by = self.parse_comma_separated(Parser::parse_expr)?;
2504            self.expect_token(&Token::RParen)?;
2505        }
2506        let with_properties = WithProperties(self.parse_with_properties()?);
2507
2508        Ok(Statement::CreateIndex {
2509            name: index_name,
2510            table_name,
2511            method,
2512            columns,
2513            include,
2514            distributed_by,
2515            unique,
2516            if_not_exists,
2517            with_properties,
2518        })
2519    }
2520
2521    pub fn parse_with_version_columns(&mut self) -> ModalResult<Vec<Ident>> {
2522        if self.parse_keywords(&[Keyword::WITH, Keyword::VERSION, Keyword::COLUMN]) {
2523            self.expect_token(&Token::LParen)?;
2524            let columns =
2525                self.parse_comma_separated(|parser| parser.parse_identifier_non_reserved())?;
2526            self.expect_token(&Token::RParen)?;
2527            Ok(columns)
2528        } else {
2529            Ok(Vec::new())
2530        }
2531    }
2532
2533    pub fn parse_on_conflict(&mut self) -> ModalResult<Option<OnConflict>> {
2534        if self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT]) {
2535            self.parse_handle_conflict_behavior()
2536        } else {
2537            Ok(None)
2538        }
2539    }
2540
2541    pub fn parse_create_table(
2542        &mut self,
2543        or_replace: bool,
2544        temporary: bool,
2545    ) -> ModalResult<Statement> {
2546        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2547        let table_name = self.parse_object_name()?;
2548        // parse optional column list (schema) and watermarks on source.
2549        let (columns, constraints, source_watermarks, wildcard_idx) =
2550            self.parse_columns_with_watermark()?;
2551
2552        let append_only = if self.parse_keyword(Keyword::APPEND) {
2553            self.expect_keyword(Keyword::ONLY)?;
2554            true
2555        } else {
2556            false
2557        };
2558
2559        let on_conflict = self.parse_on_conflict()?;
2560
2561        let with_version_columns = self.parse_with_version_columns()?;
2562        let include_options = self.parse_include_options()?;
2563
2564        // PostgreSQL supports `WITH ( options )`, before `AS`
2565        let with_options = self.parse_with_properties()?;
2566
2567        let option = with_options
2568            .iter()
2569            .find(|&opt| opt.name.real_value() == UPSTREAM_SOURCE_KEY);
2570        let connector = option.map(|opt| opt.value.to_string());
2571        let contain_webhook =
2572            connector.is_some() && connector.as_ref().unwrap().contains(WEBHOOK_CONNECTOR);
2573
2574        // webhook connector does not require row format
2575        let format_encode = if let Some(connector) = connector
2576            && !contain_webhook
2577        {
2578            Some(self.parse_format_encode_with_connector(&connector, false)?)
2579        } else {
2580            None // Table is NOT created with an external connector.
2581        };
2582        // Parse optional `AS ( query )`
2583        let query = if self.parse_keyword(Keyword::AS) {
2584            if !source_watermarks.is_empty() {
2585                parser_err!("Watermarks can't be defined on table created by CREATE TABLE AS");
2586            }
2587            Some(Box::new(self.parse_query()?))
2588        } else {
2589            None
2590        };
2591
2592        let cdc_table_info = if self.parse_keyword(Keyword::FROM) {
2593            let source_name = self.parse_object_name()?;
2594            self.expect_keyword(Keyword::TABLE)?;
2595            let external_table_name = self.parse_literal_string()?;
2596            Some(CdcTableInfo {
2597                source_name,
2598                external_table_name,
2599            })
2600        } else {
2601            None
2602        };
2603
2604        let webhook_wait_for_persistence = with_options
2605            .iter()
2606            .find(|&opt| opt.name.real_value() == WEBHOOK_WAIT_FOR_PERSISTENCE)
2607            .map(|opt| opt.value.to_string().eq_ignore_ascii_case("true"))
2608            .unwrap_or(true);
2609        let webhook_is_batched = with_options
2610            .iter()
2611            .find(|&opt| opt.name.real_value() == WEBHOOK_IS_BATCHED)
2612            .map(|opt| opt.value.to_string().eq_ignore_ascii_case("true"))
2613            .unwrap_or(false);
2614
2615        let webhook_info = if self.parse_keyword(Keyword::VALIDATE) {
2616            if !contain_webhook {
2617                parser_err!("VALIDATE is only supported for tables created with webhook source");
2618            }
2619
2620            let secret_ref = if self.parse_keyword(Keyword::SECRET) {
2621                let secret_ref = self.parse_secret_ref()?;
2622                if secret_ref.ref_as == SecretRefAsType::File {
2623                    parser_err!("Secret for SECURE_COMPARE() does not support AS FILE");
2624                };
2625                Some(secret_ref)
2626            } else {
2627                None
2628            };
2629
2630            self.expect_keyword(Keyword::AS)?;
2631            let signature_expr = self.parse_function()?;
2632
2633            Some(WebhookSourceInfo {
2634                secret_ref,
2635                signature_expr: Some(signature_expr),
2636                wait_for_persistence: webhook_wait_for_persistence,
2637                is_batched: webhook_is_batched,
2638            })
2639        } else if contain_webhook {
2640            Some(WebhookSourceInfo {
2641                secret_ref: None,
2642                signature_expr: None,
2643                wait_for_persistence: webhook_wait_for_persistence,
2644                is_batched: webhook_is_batched,
2645            })
2646        } else {
2647            None
2648        };
2649
2650        let engine = if self.parse_keyword(Keyword::ENGINE) {
2651            self.expect_token(&Token::Eq)?;
2652            let engine_name = self.parse_object_name()?;
2653            if "iceberg".eq_ignore_ascii_case(&engine_name.real_value()) {
2654                Engine::Iceberg
2655            } else if "hummock".eq_ignore_ascii_case(&engine_name.real_value()) {
2656                Engine::Hummock
2657            } else {
2658                parser_err!("Unsupported engine: {}", engine_name);
2659            }
2660        } else {
2661            Engine::Hummock
2662        };
2663
2664        Ok(Statement::CreateTable {
2665            name: table_name,
2666            temporary,
2667            columns,
2668            wildcard_idx,
2669            constraints,
2670            with_options,
2671            or_replace,
2672            if_not_exists,
2673            format_encode,
2674            source_watermarks,
2675            append_only,
2676            on_conflict,
2677            with_version_columns,
2678            query,
2679            cdc_table_info,
2680            include_column_options: include_options,
2681            webhook_info,
2682            engine,
2683        })
2684    }
2685
2686    pub fn parse_include_options(&mut self) -> ModalResult<IncludeOption> {
2687        let mut options = vec![];
2688        while self.parse_keyword(Keyword::INCLUDE) {
2689            let column_type = self.parse_identifier()?;
2690
2691            let mut column_inner_field = None;
2692            let mut header_inner_expect_type = None;
2693            if let Token::SingleQuotedString(inner_field) = self.peek_token().token {
2694                self.next_token();
2695                column_inner_field = Some(inner_field);
2696
2697                // `verify` rejects `DataType::Custom` so that a following `INCLUDE` (or even `WITH`)
2698                // will not be misrecognized as a DataType.
2699                //
2700                // For example, the following look structurally the same because `INCLUDE` is not a
2701                // reserved keyword. (`AS` is reserved.)
2702                // * `INCLUDE header 'foo' varchar`
2703                // * `INCLUDE header 'foo' INCLUDE`
2704                //
2705                // To be honest `bytea` shall be a `DataType::Custom` rather than a keyword, and the
2706                // logic here shall be:
2707                // ```
2708                // match dt {
2709                //     DataType::Custom(name) => allowed.contains(name.real_value()),
2710                //     _ => true,
2711                // }
2712                // ```
2713                // An allowlist is better than a denylist, as the following token may be other than
2714                // `INCLUDE` or `WITH` in the future.
2715                //
2716                // If this sounds too complicated - it means we should have designed this extension
2717                // syntax differently to make ambiguity handling easier.
2718                header_inner_expect_type =
2719                    opt(parser_v2::data_type.verify(|dt| !matches!(dt, DataType::Custom(_))))
2720                        .parse_next(self)?;
2721            }
2722
2723            let mut column_alias = None;
2724            if self.parse_keyword(Keyword::AS) {
2725                column_alias = Some(self.parse_identifier()?);
2726            }
2727
2728            options.push(IncludeOptionItem {
2729                column_type,
2730                inner_field: column_inner_field,
2731                column_alias,
2732                header_inner_expect_type,
2733            });
2734
2735            // tolerate previous bug #18800 of displaying with comma separation
2736            let _ = self.consume_token(&Token::Comma);
2737        }
2738        Ok(options)
2739    }
2740
2741    pub fn parse_columns_with_watermark(&mut self) -> ModalResult<ColumnsDefTuple> {
2742        let mut columns = vec![];
2743        let mut constraints = vec![];
2744        let mut watermarks = vec![];
2745        let mut wildcard_idx = None;
2746        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
2747            return Ok((columns, constraints, watermarks, wildcard_idx));
2748        }
2749
2750        loop {
2751            if self.consume_token(&Token::Mul) {
2752                if wildcard_idx.is_none() {
2753                    wildcard_idx = Some(columns.len());
2754                } else {
2755                    parser_err!("At most 1 wildcard is allowed in source definition");
2756                }
2757            } else if let Some(constraint) = self.parse_optional_table_constraint()? {
2758                constraints.push(constraint);
2759            } else if let Some(watermark) = self.parse_optional_watermark()? {
2760                watermarks.push(watermark);
2761                if watermarks.len() > 1 {
2762                    // TODO(yuhao): allow multiple watermark on source.
2763                    parser_err!("Only 1 watermark is allowed to be defined on source.");
2764                }
2765            } else if let Token::Word(_) = self.peek_token().token {
2766                columns.push(self.parse_column_def()?);
2767            } else {
2768                return self.expected("column name or constraint definition");
2769            }
2770            let comma = self.consume_token(&Token::Comma);
2771            if self.consume_token(&Token::RParen) {
2772                // allow a trailing comma, even though it's not in standard
2773                break;
2774            } else if !comma {
2775                return self.expected("',' or ')' after column definition");
2776            }
2777        }
2778
2779        Ok((columns, constraints, watermarks, wildcard_idx))
2780    }
2781
2782    fn parse_column_def(&mut self) -> ModalResult<ColumnDef> {
2783        let name = self.parse_identifier_non_reserved()?;
2784        let data_type = if let Token::Word(_) = self.peek_token().token {
2785            Some(self.parse_data_type()?)
2786        } else {
2787            None
2788        };
2789
2790        let collation = if self.parse_keyword(Keyword::COLLATE) {
2791            Some(self.parse_object_name()?)
2792        } else {
2793            None
2794        };
2795        let mut options = vec![];
2796        loop {
2797            if self.parse_keyword(Keyword::CONSTRAINT) {
2798                let name = Some(self.parse_identifier_non_reserved()?);
2799                if let Some(option) = self.parse_optional_column_option()? {
2800                    options.push(ColumnOptionDef { name, option });
2801                } else {
2802                    return self.expected("constraint details after CONSTRAINT <name>");
2803                }
2804            } else if let Some(option) = self.parse_optional_column_option()? {
2805                options.push(ColumnOptionDef { name: None, option });
2806            } else {
2807                break;
2808            };
2809        }
2810        Ok(ColumnDef {
2811            name,
2812            data_type,
2813            collation,
2814            options,
2815        })
2816    }
2817
2818    pub fn parse_optional_column_option(&mut self) -> ModalResult<Option<ColumnOption>> {
2819        if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
2820            Ok(Some(ColumnOption::NotNull))
2821        } else if self.parse_keyword(Keyword::NULL) {
2822            Ok(Some(ColumnOption::Null))
2823        } else if self.parse_keyword(Keyword::DEFAULT) {
2824            if self.parse_keyword(Keyword::INTERNAL) {
2825                Ok(Some(ColumnOption::DefaultValueInternal {
2826                    // Placeholder. Will fill during definition purification for schema change.
2827                    persisted: Default::default(),
2828                    expr: None,
2829                }))
2830            } else {
2831                Ok(Some(ColumnOption::DefaultValue(self.parse_expr()?)))
2832            }
2833        } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
2834            Ok(Some(ColumnOption::Unique { is_primary: true }))
2835        } else if self.parse_keyword(Keyword::UNIQUE) {
2836            Ok(Some(ColumnOption::Unique { is_primary: false }))
2837        } else if self.parse_keyword(Keyword::REFERENCES) {
2838            let foreign_table = self.parse_object_name()?;
2839            // PostgreSQL allows omitting the column list and
2840            // uses the primary key column of the foreign table by default
2841            let referred_columns = self.parse_parenthesized_column_list(Optional)?;
2842            let mut on_delete = None;
2843            let mut on_update = None;
2844            loop {
2845                if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
2846                    on_delete = Some(self.parse_referential_action()?);
2847                } else if on_update.is_none()
2848                    && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
2849                {
2850                    on_update = Some(self.parse_referential_action()?);
2851                } else {
2852                    break;
2853                }
2854            }
2855            Ok(Some(ColumnOption::ForeignKey {
2856                foreign_table,
2857                referred_columns,
2858                on_delete,
2859                on_update,
2860            }))
2861        } else if self.parse_keyword(Keyword::CHECK) {
2862            self.expect_token(&Token::LParen)?;
2863            let expr = self.parse_expr()?;
2864            self.expect_token(&Token::RParen)?;
2865            Ok(Some(ColumnOption::Check(expr)))
2866        } else if self.parse_keyword(Keyword::AS) {
2867            Ok(Some(ColumnOption::GeneratedColumns(self.parse_expr()?)))
2868        } else {
2869            Ok(None)
2870        }
2871    }
2872
2873    pub fn parse_handle_conflict_behavior(&mut self) -> ModalResult<Option<OnConflict>> {
2874        if self.parse_keyword(Keyword::OVERWRITE) {
2875            // compatible with v1.9 - v2.0
2876            Ok(Some(OnConflict::UpdateFull))
2877        } else if self.parse_keyword(Keyword::IGNORE) {
2878            // compatible with v1.9 - v2.0
2879            Ok(Some(OnConflict::Nothing))
2880        } else if self.parse_keywords(&[
2881            Keyword::DO,
2882            Keyword::UPDATE,
2883            Keyword::IF,
2884            Keyword::NOT,
2885            Keyword::NULL,
2886        ]) {
2887            Ok(Some(OnConflict::UpdateIfNotNull))
2888        } else if self.parse_keywords(&[Keyword::DO, Keyword::UPDATE, Keyword::FULL]) {
2889            Ok(Some(OnConflict::UpdateFull))
2890        } else if self.parse_keywords(&[Keyword::DO, Keyword::NOTHING]) {
2891            Ok(Some(OnConflict::Nothing))
2892        } else {
2893            Ok(None)
2894        }
2895    }
2896
2897    pub fn parse_referential_action(&mut self) -> ModalResult<ReferentialAction> {
2898        if self.parse_keyword(Keyword::RESTRICT) {
2899            Ok(ReferentialAction::Restrict)
2900        } else if self.parse_keyword(Keyword::CASCADE) {
2901            Ok(ReferentialAction::Cascade)
2902        } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
2903            Ok(ReferentialAction::SetNull)
2904        } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
2905            Ok(ReferentialAction::NoAction)
2906        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
2907            Ok(ReferentialAction::SetDefault)
2908        } else {
2909            self.expected("one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT")
2910        }
2911    }
2912
2913    pub fn parse_optional_watermark(&mut self) -> ModalResult<Option<SourceWatermark>> {
2914        if self.parse_keyword(Keyword::WATERMARK) {
2915            self.expect_keyword(Keyword::FOR)?;
2916            let column = self.parse_identifier_non_reserved()?;
2917            self.expect_keyword(Keyword::AS)?;
2918            let expr = self.parse_expr()?;
2919            let with_ttl = self.parse_keywords(&[Keyword::WITH, Keyword::TTL]);
2920            Ok(Some(SourceWatermark {
2921                column,
2922                expr,
2923                with_ttl,
2924            }))
2925        } else {
2926            Ok(None)
2927        }
2928    }
2929
2930    pub fn parse_optional_table_constraint(&mut self) -> ModalResult<Option<TableConstraint>> {
2931        let name = if self.parse_keyword(Keyword::CONSTRAINT) {
2932            Some(self.parse_identifier_non_reserved()?)
2933        } else {
2934            None
2935        };
2936        let checkpoint = *self;
2937        let token = self.next_token();
2938        match token.token {
2939            Token::Word(w) if w.keyword == Keyword::PRIMARY || w.keyword == Keyword::UNIQUE => {
2940                let is_primary = w.keyword == Keyword::PRIMARY;
2941                if is_primary {
2942                    self.expect_keyword(Keyword::KEY)?;
2943                }
2944                let columns = self.parse_parenthesized_column_list(Mandatory)?;
2945                Ok(Some(TableConstraint::Unique {
2946                    name,
2947                    columns,
2948                    is_primary,
2949                }))
2950            }
2951            Token::Word(w) if w.keyword == Keyword::FOREIGN => {
2952                self.expect_keyword(Keyword::KEY)?;
2953                let columns = self.parse_parenthesized_column_list(Mandatory)?;
2954                self.expect_keyword(Keyword::REFERENCES)?;
2955                let foreign_table = self.parse_object_name()?;
2956                let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
2957                let mut on_delete = None;
2958                let mut on_update = None;
2959                loop {
2960                    if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
2961                        on_delete = Some(self.parse_referential_action()?);
2962                    } else if on_update.is_none()
2963                        && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
2964                    {
2965                        on_update = Some(self.parse_referential_action()?);
2966                    } else {
2967                        break;
2968                    }
2969                }
2970                Ok(Some(TableConstraint::ForeignKey {
2971                    name,
2972                    columns,
2973                    foreign_table,
2974                    referred_columns,
2975                    on_delete,
2976                    on_update,
2977                }))
2978            }
2979            Token::Word(w) if w.keyword == Keyword::CHECK => {
2980                self.expect_token(&Token::LParen)?;
2981                let expr = Box::new(self.parse_expr()?);
2982                self.expect_token(&Token::RParen)?;
2983                Ok(Some(TableConstraint::Check { name, expr }))
2984            }
2985            _ => {
2986                *self = checkpoint;
2987                if name.is_some() {
2988                    self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK")
2989                } else {
2990                    Ok(None)
2991                }
2992            }
2993        }
2994    }
2995
2996    pub fn parse_options_with_preceding_keyword(
2997        &mut self,
2998        keyword: Keyword,
2999    ) -> ModalResult<Vec<SqlOption>> {
3000        if self.parse_keyword(keyword) {
3001            self.expect_token(&Token::LParen)?;
3002            self.parse_options_inner()
3003        } else {
3004            Ok(vec![])
3005        }
3006    }
3007
3008    pub fn parse_options(&mut self) -> ModalResult<Vec<SqlOption>> {
3009        if self.peek_token() == Token::LParen {
3010            self.next_token();
3011            self.parse_options_inner()
3012        } else {
3013            Ok(vec![])
3014        }
3015    }
3016
3017    // has parsed a LParen
3018    pub fn parse_options_inner(&mut self) -> ModalResult<Vec<SqlOption>> {
3019        let mut values = vec![];
3020        loop {
3021            values.push(Parser::parse_sql_option(self)?);
3022            let comma = self.consume_token(&Token::Comma);
3023            if self.consume_token(&Token::RParen) {
3024                // allow a trailing comma, even though it's not in standard
3025                break;
3026            } else if !comma {
3027                return self.expected("',' or ')' after option definition");
3028            }
3029        }
3030        Ok(values)
3031    }
3032
3033    pub fn parse_sql_option(&mut self) -> ModalResult<SqlOption> {
3034        const CONNECTION_REF_KEY: &str = "connection";
3035        const BACKFILL_ORDER: &str = "backfill_order";
3036
3037        let name = self.parse_object_name()?;
3038        self.expect_token(&Token::Eq)?;
3039        let value = {
3040            if name.real_value().eq_ignore_ascii_case(CONNECTION_REF_KEY) {
3041                let connection_name = self.parse_object_name()?;
3042                // tolerate previous buggy Display that outputs `connection = connection foo`
3043                let connection_name = match connection_name.0.as_slice() {
3044                    [ident] if ident.real_value() == CONNECTION_REF_KEY => {
3045                        self.parse_object_name()?
3046                    }
3047                    _ => connection_name,
3048                };
3049                SqlOptionValue::ConnectionRef(ConnectionRefValue { connection_name })
3050            } else if name.real_value().eq_ignore_ascii_case(BACKFILL_ORDER) {
3051                let order = self.parse_backfill_order_strategy()?;
3052                SqlOptionValue::BackfillOrder(order)
3053            } else {
3054                self.parse_value_and_obj_ref::<false>()?
3055            }
3056        };
3057        Ok(SqlOption { name, value })
3058    }
3059
3060    // <config_param> { TO | = } { <value> | DEFAULT }
3061    // <config_param> is not a keyword, but an identifier
3062    pub fn parse_config_param(&mut self) -> ModalResult<ConfigParam> {
3063        self.parse_config_param_inner(Self::parse_set_variable)
3064    }
3065
3066    fn parse_config_param_inner(
3067        &mut self,
3068        parse_value: fn(&mut Self) -> ModalResult<SetVariableValue>,
3069    ) -> ModalResult<ConfigParam> {
3070        let param = self.parse_identifier()?;
3071        if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
3072            return self.expected("'=' or 'TO' after config parameter");
3073        }
3074        let value = parse_value(self)?;
3075        Ok(ConfigParam { param, value })
3076    }
3077
3078    /// Parse a single-value config param.
3079    ///
3080    /// This differs from [`Self::parse_config_param`] in that it does **not** allow a comma-separated
3081    /// list on the RHS, so it can be safely used in constructs where comma separates multiple
3082    /// assignments (e.g. `... SET a = 1, b = 2`).
3083    fn parse_config_param_no_list(&mut self) -> ModalResult<ConfigParam> {
3084        self.parse_config_param_inner(Self::parse_set_variable_no_list)
3085    }
3086
3087    fn parse_set_variable_no_list(&mut self) -> ModalResult<SetVariableValue> {
3088        alt((
3089            Keyword::DEFAULT.value(SetVariableValue::Default),
3090            alt((
3091                Self::ensure_parse_value.map(SetVariableValueSingle::Literal),
3092                |parser: &mut Self| {
3093                    let checkpoint = *parser;
3094                    let ident = parser.parse_identifier()?;
3095                    if ident.value == "default" {
3096                        *parser = checkpoint;
3097                        return parser.expected("parameter list value").map_err(|e| e.cut());
3098                    }
3099                    Ok(SetVariableValueSingle::Ident(ident))
3100                },
3101                fail.expect("parameter value"),
3102            ))
3103            .map(|single: SetVariableValueSingle| SetVariableValue::Single(single)),
3104        ))
3105        .parse_next(self)
3106    }
3107
3108    pub fn parse_since(&mut self) -> ModalResult<Since> {
3109        if self.parse_keyword(Keyword::SINCE) {
3110            let checkpoint = *self;
3111            let token = self.next_token();
3112            match token.token {
3113                Token::Word(w) => {
3114                    let ident = w.to_ident()?;
3115                    // Backward compatibility for now.
3116                    if ident.real_value() == "proctime" || ident.real_value() == "now" {
3117                        self.expect_token(&Token::LParen)?;
3118                        self.expect_token(&Token::RParen)?;
3119                        Ok(Since::ProcessTime)
3120                    } else if ident.real_value() == "begin" {
3121                        self.expect_token(&Token::LParen)?;
3122                        self.expect_token(&Token::RParen)?;
3123                        Ok(Since::Begin)
3124                    } else {
3125                        parser_err!(
3126                            "Expected proctime(), begin() or now(), found: {}",
3127                            ident.real_value()
3128                        )
3129                    }
3130                }
3131                Token::Number(s) => {
3132                    let num = s
3133                        .parse::<u64>()
3134                        .map_err(|e| StrError(format!("Could not parse '{}' as u64: {}", s, e)))?;
3135                    Ok(Since::TimestampMsNum(num))
3136                }
3137                _ => self.expected_at(checkpoint, "proctime(), begin() , now(), Number"),
3138            }
3139        } else if self.parse_word("FULL") {
3140            Ok(Since::Full)
3141        } else {
3142            Ok(Since::ProcessTime)
3143        }
3144    }
3145
3146    pub fn parse_emit_mode(&mut self) -> ModalResult<Option<EmitMode>> {
3147        if self.parse_keyword(Keyword::EMIT) {
3148            match self.parse_one_of_keywords(&[Keyword::IMMEDIATELY, Keyword::ON]) {
3149                Some(Keyword::IMMEDIATELY) => Ok(Some(EmitMode::Immediately)),
3150                Some(Keyword::ON) => {
3151                    self.expect_keywords(&[Keyword::WINDOW, Keyword::CLOSE])?;
3152                    Ok(Some(EmitMode::OnWindowClose))
3153                }
3154                Some(_) => unreachable!(),
3155                None => self.expected("IMMEDIATELY or ON WINDOW CLOSE after EMIT"),
3156            }
3157        } else {
3158            Ok(None)
3159        }
3160    }
3161
3162    pub fn parse_alter(&mut self) -> ModalResult<Statement> {
3163        if self.parse_keyword(Keyword::DATABASE) {
3164            self.parse_alter_database()
3165        } else if self.parse_keyword(Keyword::SCHEMA) {
3166            self.parse_alter_schema()
3167        } else if self.parse_keyword(Keyword::TABLE) {
3168            self.parse_alter_table()
3169        } else if self.parse_keyword(Keyword::INDEX) {
3170            self.parse_alter_index()
3171        } else if self.parse_keyword(Keyword::VIEW) {
3172            self.parse_alter_view(false)
3173        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
3174            self.parse_alter_view(true)
3175        } else if self.parse_keyword(Keyword::SINK) {
3176            self.parse_alter_sink()
3177        } else if self.parse_keyword(Keyword::SOURCE) {
3178            self.parse_alter_source()
3179        } else if self.parse_keyword(Keyword::FUNCTION) {
3180            self.parse_alter_function()
3181        } else if self.parse_keyword(Keyword::CONNECTION) {
3182            self.parse_alter_connection()
3183        } else if self.parse_keyword(Keyword::USER) {
3184            self.parse_alter_user()
3185        } else if self.parse_keyword(Keyword::SYSTEM) {
3186            self.parse_alter_system()
3187        } else if self.parse_keyword(Keyword::SUBSCRIPTION) {
3188            self.parse_alter_subscription()
3189        } else if self.parse_keyword(Keyword::SECRET) {
3190            self.parse_alter_secret()
3191        } else if self.parse_word("FRAGMENT") {
3192            self.parse_alter_fragment()
3193        } else if self.parse_keyword(Keyword::COMPACTION) {
3194            self.parse_alter_compaction_group()
3195        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::PRIVILEGES]) {
3196            self.parse_alter_default_privileges()
3197        } else {
3198            self.expected(
3199                "COMPACTION, DATABASE, FRAGMENT, SCHEMA, TABLE, INDEX, MATERIALIZED, VIEW, SINK, SUBSCRIPTION, SOURCE, FUNCTION, USER, SECRET or SYSTEM after ALTER"
3200            )
3201        }
3202    }
3203
3204    pub fn parse_alter_database(&mut self) -> ModalResult<Statement> {
3205        let database_name = self.parse_object_name()?;
3206        let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3207            let owner_name: Ident = self.parse_identifier()?;
3208            AlterDatabaseOperation::ChangeOwner {
3209                new_owner_name: owner_name,
3210            }
3211        } else if self.parse_keyword(Keyword::RENAME) {
3212            if self.parse_keyword(Keyword::TO) {
3213                let database_name = self.parse_object_name()?;
3214                AlterDatabaseOperation::RenameDatabase { database_name }
3215            } else {
3216                return self.expected("TO after RENAME");
3217            }
3218        } else if self.parse_keyword(Keyword::SET) {
3219            if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3220                if self.expect_keyword(Keyword::TO).is_err()
3221                    && self.expect_token(&Token::Eq).is_err()
3222                {
3223                    return self.expected("TO or = after ALTER DATABASE SET RESOURCE_GROUP");
3224                }
3225                let value = self.parse_set_variable()?;
3226                if !self.parse_keyword(Keyword::DEFERRED) {
3227                    return self.expected("DEFERRED after ALTER DATABASE SET RESOURCE_GROUP");
3228                }
3229
3230                AlterDatabaseOperation::SetResourceGroup {
3231                    resource_group: Some(value),
3232                    deferred: true,
3233                }
3234            } else {
3235                // check will be delayed to frontend
3236                AlterDatabaseOperation::SetParam(self.parse_config_param()?)
3237            }
3238        } else if self.parse_keyword(Keyword::RESET) {
3239            if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3240                if !self.parse_keyword(Keyword::DEFERRED) {
3241                    return self.expected("DEFERRED after ALTER DATABASE RESET RESOURCE_GROUP");
3242                }
3243
3244                AlterDatabaseOperation::SetResourceGroup {
3245                    resource_group: None,
3246                    deferred: true,
3247                }
3248            } else {
3249                return self.expected("RESOURCE_GROUP after RESET");
3250            }
3251        } else {
3252            return self.expected("RENAME, OWNER TO, SET, OR RESET after ALTER DATABASE");
3253        };
3254
3255        Ok(Statement::AlterDatabase {
3256            name: database_name,
3257            operation,
3258        })
3259    }
3260
3261    pub fn parse_alter_schema(&mut self) -> ModalResult<Statement> {
3262        let schema_name = self.parse_object_name()?;
3263        let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3264            let owner_name: Ident = self.parse_identifier()?;
3265            AlterSchemaOperation::ChangeOwner {
3266                new_owner_name: owner_name,
3267            }
3268        } else if self.parse_keyword(Keyword::RENAME) {
3269            self.expect_keyword(Keyword::TO)?;
3270            let schema_name = self.parse_object_name()?;
3271            AlterSchemaOperation::RenameSchema { schema_name }
3272        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3273            let target_schema = self.parse_object_name()?;
3274            AlterSchemaOperation::SwapRenameSchema { target_schema }
3275        } else {
3276            return self.expected("RENAME, OWNER TO, OR SWAP WITH after ALTER SCHEMA");
3277        };
3278
3279        Ok(Statement::AlterSchema {
3280            name: schema_name,
3281            operation,
3282        })
3283    }
3284
3285    pub fn parse_alter_user(&mut self) -> ModalResult<Statement> {
3286        Ok(Statement::AlterUser(AlterUserStatement::parse_to(self)?))
3287    }
3288
3289    pub fn parse_alter_table(&mut self) -> ModalResult<Statement> {
3290        let _ = self.parse_keyword(Keyword::ONLY);
3291        let table_name = self.parse_object_name()?;
3292        let operation = if self.parse_keyword(Keyword::ADD) {
3293            if let Some(constraint) = self.parse_optional_table_constraint()? {
3294                AlterTableOperation::AddConstraint(constraint)
3295            } else {
3296                let _ = self.parse_keyword(Keyword::COLUMN);
3297                let _if_not_exists =
3298                    self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3299                let column_def = self.parse_column_def()?;
3300                AlterTableOperation::AddColumn { column_def }
3301            }
3302        } else if self.parse_keywords(&[Keyword::DROP, Keyword::CONNECTOR]) {
3303            AlterTableOperation::DropConnector
3304        } else if self.parse_keyword(Keyword::RENAME) {
3305            if self.parse_keyword(Keyword::CONSTRAINT) {
3306                let old_name = self.parse_identifier_non_reserved()?;
3307                self.expect_keyword(Keyword::TO)?;
3308                let new_name = self.parse_identifier_non_reserved()?;
3309                AlterTableOperation::RenameConstraint { old_name, new_name }
3310            } else if self.parse_keyword(Keyword::TO) {
3311                let table_name = self.parse_object_name()?;
3312                AlterTableOperation::RenameTable { table_name }
3313            } else {
3314                let _ = self.parse_keyword(Keyword::COLUMN);
3315                let old_column_name = self.parse_identifier_non_reserved()?;
3316                self.expect_keyword(Keyword::TO)?;
3317                let new_column_name = self.parse_identifier_non_reserved()?;
3318                AlterTableOperation::RenameColumn {
3319                    old_column_name,
3320                    new_column_name,
3321                }
3322            }
3323        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3324            let owner_name: Ident = self.parse_identifier()?;
3325            AlterTableOperation::ChangeOwner {
3326                new_owner_name: owner_name,
3327            }
3328        } else if self.parse_keyword(Keyword::SET) {
3329            if self.parse_keyword(Keyword::SCHEMA) {
3330                let schema_name = self.parse_object_name()?;
3331                AlterTableOperation::SetSchema {
3332                    new_schema_name: schema_name,
3333                }
3334            } else if self.parse_keyword(Keyword::PARALLELISM) {
3335                if self.expect_keyword(Keyword::TO).is_err()
3336                    && self.expect_token(&Token::Eq).is_err()
3337                {
3338                    return self.expected("TO or = after ALTER TABLE SET PARALLELISM");
3339                }
3340
3341                let value = self.parse_set_variable()?;
3342
3343                let deferred = self.parse_keyword(Keyword::DEFERRED);
3344
3345                AlterTableOperation::SetParallelism {
3346                    parallelism: value,
3347                    deferred,
3348                }
3349            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3350                if self.expect_keyword(Keyword::TO).is_err()
3351                    && self.expect_token(&Token::Eq).is_err()
3352                {
3353                    return self.expected("TO or = after ALTER TABLE SET BACKFILL_PARALLELISM");
3354                }
3355
3356                let value = self.parse_set_variable()?;
3357
3358                let deferred = self.parse_keyword(Keyword::DEFERRED);
3359
3360                AlterTableOperation::SetBackfillParallelism {
3361                    parallelism: value,
3362                    deferred,
3363                }
3364            } else if let Some(rate_limit) = self.parse_alter_source_rate_limit(true)? {
3365                AlterTableOperation::SetSourceRateLimit { rate_limit }
3366            } else if let Some(rate_limit) = self.parse_alter_backfill_rate_limit()? {
3367                AlterTableOperation::SetBackfillRateLimit { rate_limit }
3368            } else if let Some(rate_limit) = self.parse_alter_dml_rate_limit()? {
3369                AlterTableOperation::SetDmlRateLimit { rate_limit }
3370            } else if self.parse_keyword(Keyword::CONFIG) {
3371                let entries = self.parse_options()?;
3372                AlterTableOperation::SetConfig { entries }
3373            } else {
3374                return self.expected(
3375                    "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/SOURCE_RATE_LIMIT/DML_RATE_LIMIT/CONFIG after SET",
3376                );
3377            }
3378        } else if self.parse_keyword(Keyword::RESET) {
3379            if self.parse_keyword(Keyword::CONFIG) {
3380                let keys = self.parse_parenthesized_object_name_list()?;
3381                AlterTableOperation::ResetConfig { keys }
3382            } else {
3383                return self.expected("CONFIG after RESET");
3384            }
3385        } else if self.parse_keyword(Keyword::DROP) {
3386            let _ = self.parse_keyword(Keyword::COLUMN);
3387            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3388            let column_name = self.parse_identifier_non_reserved()?;
3389            let cascade = self.parse_keyword(Keyword::CASCADE);
3390            AlterTableOperation::DropColumn {
3391                column_name,
3392                if_exists,
3393                cascade,
3394            }
3395        } else if self.parse_keyword(Keyword::ALTER) {
3396            // `WATERMARK` is non-reserved; require `FOR` so `ALTER <col>` on a
3397            // column named `watermark` still falls through to ALTER COLUMN.
3398            if self.parse_keywords(&[Keyword::WATERMARK, Keyword::FOR]) {
3399                let column_name = self.parse_identifier_non_reserved()?;
3400                self.expect_keyword(Keyword::AS)?;
3401                let expr = self.parse_expr()?;
3402                let with_ttl = self.parse_keywords(&[Keyword::WITH, Keyword::TTL]);
3403                return Ok(Statement::AlterTable {
3404                    name: table_name,
3405                    operation: AlterTableOperation::AlterWatermark {
3406                        column_name,
3407                        expr,
3408                        with_ttl,
3409                    },
3410                });
3411            }
3412            let _ = self.parse_keyword(Keyword::COLUMN);
3413            let column_name = self.parse_identifier_non_reserved()?;
3414
3415            let op = if self.parse_keywords(&[Keyword::SET, Keyword::NOT, Keyword::NULL]) {
3416                AlterColumnOperation::SetNotNull {}
3417            } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
3418                AlterColumnOperation::DropNotNull {}
3419            } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
3420                AlterColumnOperation::SetDefault {
3421                    value: self.parse_expr()?,
3422                }
3423            } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
3424                AlterColumnOperation::DropDefault {}
3425            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE])
3426                || (self.parse_keyword(Keyword::TYPE))
3427            {
3428                let data_type = self.parse_data_type()?;
3429                let using = if self.parse_keyword(Keyword::USING) {
3430                    Some(self.parse_expr()?)
3431                } else {
3432                    None
3433                };
3434                AlterColumnOperation::SetDataType { data_type, using }
3435            } else {
3436                return self
3437                    .expected("SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE after ALTER COLUMN");
3438            };
3439            AlterTableOperation::AlterColumn { column_name, op }
3440        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3441            AlterTableOperation::RefreshSchema
3442        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3443            let target_table = self.parse_object_name()?;
3444            AlterTableOperation::SwapRenameTable { target_table }
3445        } else if self.parse_keyword(Keyword::CONNECTOR) {
3446            let with_options = self.parse_with_properties()?;
3447            AlterTableOperation::AlterConnectorProps {
3448                alter_props: with_options,
3449            }
3450        } else {
3451            return self.expected(
3452                "ADD or RENAME or OWNER TO or SET or RESET or DROP or SWAP or CONNECTOR after ALTER TABLE",
3453            );
3454        };
3455        Ok(Statement::AlterTable {
3456            name: table_name,
3457            operation,
3458        })
3459    }
3460
3461    /// BACKFILL_RATE_LIMIT = default | NUMBER
3462    /// BACKFILL_RATE_LIMIT TO default | NUMBER
3463    pub fn parse_alter_backfill_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3464        if !self.parse_word("BACKFILL_RATE_LIMIT") {
3465            return Ok(None);
3466        }
3467        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3468            return self.expected("TO or = after ALTER TABLE SET BACKFILL_RATE_LIMIT");
3469        }
3470        let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3471            -1
3472        } else {
3473            let s = self.parse_number_value()?;
3474            if let Ok(n) = s.parse::<i32>() {
3475                n
3476            } else {
3477                return self.expected("number or DEFAULT");
3478            }
3479        };
3480        Ok(Some(rate_limit))
3481    }
3482
3483    /// DML_RATE_LIMIT = default | NUMBER
3484    /// DML_RATE_LIMIT TO default | NUMBER
3485    pub fn parse_alter_dml_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3486        if !self.parse_word("DML_RATE_LIMIT") {
3487            return Ok(None);
3488        }
3489        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3490            return self.expected("TO or = after ALTER TABLE SET DML_RATE_LIMIT");
3491        }
3492        let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3493            -1
3494        } else {
3495            let s = self.parse_number_value()?;
3496            if let Ok(n) = s.parse::<i32>() {
3497                n
3498            } else {
3499                return self.expected("number or DEFAULT");
3500            }
3501        };
3502        Ok(Some(rate_limit))
3503    }
3504
3505    /// SOURCE_RATE_LIMIT = default | NUMBER
3506    /// SOURCE_RATE_LIMIT TO default | NUMBER
3507    pub fn parse_alter_source_rate_limit(&mut self, is_table: bool) -> ModalResult<Option<i32>> {
3508        if !self.parse_word("SOURCE_RATE_LIMIT") {
3509            return Ok(None);
3510        }
3511        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3512            let ddl = if is_table { "TABLE" } else { "SOURCE" };
3513            return self.expected(&format!("TO or = after ALTER {ddl} SET SOURCE_RATE_LIMIT"));
3514        }
3515        let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3516            -1
3517        } else {
3518            let s = self.parse_number_value()?;
3519            if let Ok(n) = s.parse::<i32>() {
3520                n
3521            } else {
3522                return self.expected("number or DEFAULT");
3523            }
3524        };
3525        Ok(Some(rate_limit))
3526    }
3527
3528    pub fn parse_alter_index(&mut self) -> ModalResult<Statement> {
3529        let index_name = self.parse_object_name()?;
3530        let operation = if self.parse_keyword(Keyword::RENAME) {
3531            if self.parse_keyword(Keyword::TO) {
3532                let index_name = self.parse_object_name()?;
3533                AlterIndexOperation::RenameIndex { index_name }
3534            } else {
3535                return self.expected("TO after RENAME");
3536            }
3537        } else if self.parse_keyword(Keyword::SET) {
3538            if self.parse_keyword(Keyword::PARALLELISM) {
3539                if self.expect_keyword(Keyword::TO).is_err()
3540                    && self.expect_token(&Token::Eq).is_err()
3541                {
3542                    return self.expected("TO or = after ALTER INDEX SET PARALLELISM");
3543                }
3544
3545                let value = self.parse_set_variable()?;
3546
3547                let deferred = self.parse_keyword(Keyword::DEFERRED);
3548
3549                AlterIndexOperation::SetParallelism {
3550                    parallelism: value,
3551                    deferred,
3552                }
3553            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3554                if self.expect_keyword(Keyword::TO).is_err()
3555                    && self.expect_token(&Token::Eq).is_err()
3556                {
3557                    return self.expected("TO or = after ALTER INDEX SET BACKFILL_PARALLELISM");
3558                }
3559
3560                let value = self.parse_set_variable()?;
3561
3562                let deferred = self.parse_keyword(Keyword::DEFERRED);
3563
3564                AlterIndexOperation::SetBackfillParallelism {
3565                    parallelism: value,
3566                    deferred,
3567                }
3568            } else if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3569                if self.expect_keyword(Keyword::TO).is_err()
3570                    && self.expect_token(&Token::Eq).is_err()
3571                {
3572                    return self.expected("TO or = after ALTER INDEX SET RESOURCE_GROUP");
3573                }
3574                let value = self.parse_set_variable()?;
3575                let deferred = self.parse_keyword(Keyword::DEFERRED);
3576
3577                AlterIndexOperation::SetResourceGroup {
3578                    resource_group: Some(value),
3579                    deferred,
3580                }
3581            } else if self.parse_keyword(Keyword::CONFIG) {
3582                let entries = self.parse_options()?;
3583                AlterIndexOperation::SetConfig { entries }
3584            } else {
3585                return self.expected(
3586                    "PARALLELISM/BACKFILL_PARALLELISM/RESOURCE_GROUP or CONFIG after SET",
3587                );
3588            }
3589        } else if self.parse_keyword(Keyword::RESET) {
3590            if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3591                let deferred = self.parse_keyword(Keyword::DEFERRED);
3592
3593                AlterIndexOperation::SetResourceGroup {
3594                    resource_group: None,
3595                    deferred,
3596                }
3597            } else if self.parse_keyword(Keyword::CONFIG) {
3598                let keys = self.parse_parenthesized_object_name_list()?;
3599                AlterIndexOperation::ResetConfig { keys }
3600            } else {
3601                return self.expected("RESOURCE_GROUP or CONFIG after RESET");
3602            }
3603        } else {
3604            return self.expected("RENAME, SET, or RESET after ALTER INDEX");
3605        };
3606
3607        Ok(Statement::AlterIndex {
3608            name: index_name,
3609            operation,
3610        })
3611    }
3612
3613    pub fn parse_alter_view(&mut self, materialized: bool) -> ModalResult<Statement> {
3614        let view_name = self.parse_object_name()?;
3615        let operation = if self.parse_keyword(Keyword::AS) {
3616            let query = Box::new(self.parse_query()?);
3617            AlterViewOperation::AsQuery { query }
3618        } else if self.parse_keyword(Keyword::RENAME) {
3619            if self.parse_keyword(Keyword::TO) {
3620                let view_name = self.parse_object_name()?;
3621                AlterViewOperation::RenameView { view_name }
3622            } else {
3623                return self.expected("TO after RENAME");
3624            }
3625        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3626            let owner_name: Ident = self.parse_identifier()?;
3627            AlterViewOperation::ChangeOwner {
3628                new_owner_name: owner_name,
3629            }
3630        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3631            let target_view = self.parse_object_name()?;
3632            AlterViewOperation::SwapRenameView { target_view }
3633        } else if self.parse_keyword(Keyword::SET) {
3634            if self.parse_keyword(Keyword::SCHEMA) {
3635                let schema_name = self.parse_object_name()?;
3636                AlterViewOperation::SetSchema {
3637                    new_schema_name: schema_name,
3638                }
3639            } else if self.parse_word("STREAMING_ENABLE_UNALIGNED_JOIN") {
3640                if self.expect_keyword(Keyword::TO).is_err()
3641                    && self.expect_token(&Token::Eq).is_err()
3642                {
3643                    return self
3644                        .expected("TO or = after ALTER TABLE SET STREAMING_ENABLE_UNALIGNED_JOIN");
3645                }
3646                let value = self.parse_boolean()?;
3647                AlterViewOperation::SetStreamingEnableUnalignedJoin { enable: value }
3648            } else if self.parse_keyword(Keyword::PARALLELISM) && materialized {
3649                if self.expect_keyword(Keyword::TO).is_err()
3650                    && self.expect_token(&Token::Eq).is_err()
3651                {
3652                    return self.expected("TO or = after ALTER MATERIALIZED VIEW SET PARALLELISM");
3653                }
3654
3655                let value = self.parse_set_variable()?;
3656
3657                let deferred = self.parse_keyword(Keyword::DEFERRED);
3658
3659                AlterViewOperation::SetParallelism {
3660                    parallelism: value,
3661                    deferred,
3662                }
3663            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) && materialized {
3664                if self.expect_keyword(Keyword::TO).is_err()
3665                    && self.expect_token(&Token::Eq).is_err()
3666                {
3667                    return self.expected(
3668                        "TO or = after ALTER MATERIALIZED VIEW SET BACKFILL_PARALLELISM",
3669                    );
3670                }
3671
3672                let value = self.parse_set_variable()?;
3673
3674                let deferred = self.parse_keyword(Keyword::DEFERRED);
3675
3676                AlterViewOperation::SetBackfillParallelism {
3677                    parallelism: value,
3678                    deferred,
3679                }
3680            } else if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3681                if self.expect_keyword(Keyword::TO).is_err()
3682                    && self.expect_token(&Token::Eq).is_err()
3683                {
3684                    return self
3685                        .expected("TO or = after ALTER MATERIALIZED VIEW SET RESOURCE_GROUP");
3686                }
3687                let value = self.parse_set_variable()?;
3688                let deferred = self.parse_keyword(Keyword::DEFERRED);
3689
3690                AlterViewOperation::SetResourceGroup {
3691                    resource_group: Some(value),
3692                    deferred,
3693                }
3694            } else if materialized
3695                && let Some(rate_limit) = self.parse_alter_backfill_rate_limit()?
3696            {
3697                AlterViewOperation::SetBackfillRateLimit { rate_limit }
3698            } else if self.parse_keyword(Keyword::CONFIG) && materialized {
3699                let entries = self.parse_options()?;
3700                AlterViewOperation::SetConfig { entries }
3701            } else {
3702                return self.expected(
3703                    "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/BACKFILL_RATE_LIMIT/CONFIG after SET",
3704                );
3705            }
3706        } else if self.parse_keyword(Keyword::RESET) {
3707            if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3708                let deferred = self.parse_keyword(Keyword::DEFERRED);
3709
3710                AlterViewOperation::SetResourceGroup {
3711                    resource_group: None,
3712                    deferred,
3713                }
3714            } else if self.parse_keyword(Keyword::CONFIG) && materialized {
3715                let keys = self.parse_parenthesized_object_name_list()?;
3716                AlterViewOperation::ResetConfig { keys }
3717            } else {
3718                return self.expected("RESOURCE_GROUP or CONFIG after RESET");
3719            }
3720        } else {
3721            return self.expected(&format!(
3722                "AS, RENAME, OWNER TO, SET, or SWAP after ALTER {}VIEW",
3723                if materialized { "MATERIALIZED " } else { "" }
3724            ));
3725        };
3726
3727        Ok(Statement::AlterView {
3728            materialized,
3729            name: view_name,
3730            operation,
3731        })
3732    }
3733
3734    /// SINK_RATE_LIMIT = default | NUMBER
3735    /// SINK_RATE_LIMIT TO default | NUMBER
3736    pub fn parse_alter_sink_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3737        if !self.parse_word("SINK_RATE_LIMIT") {
3738            return Ok(None);
3739        }
3740        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3741            return self.expected("TO or = after ALTER SINK SET SINK_RATE_LIMIT");
3742        }
3743        let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3744            -1
3745        } else {
3746            let s = self.parse_number_value()?;
3747            if let Ok(n) = s.parse::<i32>() {
3748                n
3749            } else {
3750                return self.expected("number or DEFAULT");
3751            }
3752        };
3753        Ok(Some(rate_limit))
3754    }
3755
3756    pub fn parse_alter_sink(&mut self) -> ModalResult<Statement> {
3757        let sink_name = self.parse_object_name()?;
3758        let operation = if self.parse_keyword(Keyword::RENAME) {
3759            if self.parse_keyword(Keyword::TO) {
3760                let sink_name = self.parse_object_name()?;
3761                AlterSinkOperation::RenameSink { sink_name }
3762            } else {
3763                return self.expected("TO after RENAME");
3764            }
3765        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3766            let owner_name: Ident = self.parse_identifier()?;
3767            AlterSinkOperation::ChangeOwner {
3768                new_owner_name: owner_name,
3769            }
3770        } else if self.parse_keyword(Keyword::SET) {
3771            if self.parse_keyword(Keyword::SCHEMA) {
3772                let schema_name = self.parse_object_name()?;
3773                AlterSinkOperation::SetSchema {
3774                    new_schema_name: schema_name,
3775                }
3776            } else if self.parse_word("STREAMING_ENABLE_UNALIGNED_JOIN") {
3777                self.expect_keyword(Keyword::TO)?;
3778                let value = self.parse_boolean()?;
3779                AlterSinkOperation::SetStreamingEnableUnalignedJoin { enable: value }
3780            } else if self.parse_keyword(Keyword::PARALLELISM) {
3781                if self.expect_keyword(Keyword::TO).is_err()
3782                    && self.expect_token(&Token::Eq).is_err()
3783                {
3784                    return self.expected("TO or = after ALTER SINK SET PARALLELISM");
3785                }
3786
3787                let value = self.parse_set_variable()?;
3788                let deferred = self.parse_keyword(Keyword::DEFERRED);
3789
3790                AlterSinkOperation::SetParallelism {
3791                    parallelism: value,
3792                    deferred,
3793                }
3794            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3795                if self.expect_keyword(Keyword::TO).is_err()
3796                    && self.expect_token(&Token::Eq).is_err()
3797                {
3798                    return self.expected("TO or = after ALTER SINK SET BACKFILL_PARALLELISM");
3799                }
3800
3801                let value = self.parse_set_variable()?;
3802                let deferred = self.parse_keyword(Keyword::DEFERRED);
3803
3804                AlterSinkOperation::SetBackfillParallelism {
3805                    parallelism: value,
3806                    deferred,
3807                }
3808            } else if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3809                if self.expect_keyword(Keyword::TO).is_err()
3810                    && self.expect_token(&Token::Eq).is_err()
3811                {
3812                    return self.expected("TO or = after ALTER SINK SET RESOURCE_GROUP");
3813                }
3814                let value = self.parse_set_variable()?;
3815                let deferred = self.parse_keyword(Keyword::DEFERRED);
3816
3817                AlterSinkOperation::SetResourceGroup {
3818                    resource_group: Some(value),
3819                    deferred,
3820                }
3821            } else if let Some(rate_limit) = self.parse_alter_sink_rate_limit()? {
3822                AlterSinkOperation::SetSinkRateLimit { rate_limit }
3823            } else if let Some(rate_limit) = self.parse_alter_backfill_rate_limit()? {
3824                AlterSinkOperation::SetBackfillRateLimit { rate_limit }
3825            } else if self.parse_keyword(Keyword::CONFIG) {
3826                let entries = self.parse_options()?;
3827                AlterSinkOperation::SetConfig { entries }
3828            } else {
3829                return self.expected(
3830                    "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/RESOURCE_GROUP/SINK_RATE_LIMIT/BACKFILL_RATE_LIMIT/STREAMING_ENABLE_UNALIGNED_JOIN/CONFIG after SET",
3831                );
3832            }
3833        } else if self.parse_keyword(Keyword::RESET) {
3834            if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3835                let deferred = self.parse_keyword(Keyword::DEFERRED);
3836
3837                AlterSinkOperation::SetResourceGroup {
3838                    resource_group: None,
3839                    deferred,
3840                }
3841            } else if self.parse_keyword(Keyword::CONFIG) {
3842                let keys = self.parse_parenthesized_object_name_list()?;
3843                AlterSinkOperation::ResetConfig { keys }
3844            } else {
3845                return self.expected("RESOURCE_GROUP or CONFIG after RESET");
3846            }
3847        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3848            let target_sink = self.parse_object_name()?;
3849            AlterSinkOperation::SwapRenameSink { target_sink }
3850        } else if self.parse_keyword(Keyword::CONNECTOR) {
3851            let changed_props = self.parse_with_properties()?;
3852            AlterSinkOperation::AlterConnectorProps {
3853                alter_props: changed_props,
3854            }
3855        } else {
3856            return self
3857                .expected("RENAME or OWNER TO or SET or RESET or CONNECTOR WITH after ALTER SINK");
3858        };
3859
3860        Ok(Statement::AlterSink {
3861            name: sink_name,
3862            operation,
3863        })
3864    }
3865
3866    pub fn parse_alter_subscription(&mut self) -> ModalResult<Statement> {
3867        let subscription_name = self.parse_object_name()?;
3868        let operation = if self.parse_keyword(Keyword::RENAME) {
3869            if self.parse_keyword(Keyword::TO) {
3870                let subscription_name = self.parse_object_name()?;
3871                AlterSubscriptionOperation::RenameSubscription { subscription_name }
3872            } else {
3873                return self.expected("TO after RENAME");
3874            }
3875        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3876            let owner_name: Ident = self.parse_identifier()?;
3877            AlterSubscriptionOperation::ChangeOwner {
3878                new_owner_name: owner_name,
3879            }
3880        } else if self.parse_keyword(Keyword::SET) {
3881            if self.parse_keyword(Keyword::SCHEMA) {
3882                let schema_name = self.parse_object_name()?;
3883                AlterSubscriptionOperation::SetSchema {
3884                    new_schema_name: schema_name,
3885                }
3886            } else if self.parse_keyword(Keyword::RETENTION) {
3887                if self.expect_keyword(Keyword::TO).is_err()
3888                    && self.expect_token(&Token::Eq).is_err()
3889                {
3890                    return self.expected("TO or = after ALTER SUBSCRIPTION SET RETENTION");
3891                }
3892                let retention = self.ensure_parse_value()?;
3893                AlterSubscriptionOperation::SetRetention { retention }
3894            } else {
3895                return self.expected("SCHEMA or RETENTION after SET");
3896            }
3897        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3898            let target_subscription = self.parse_object_name()?;
3899            AlterSubscriptionOperation::SwapRenameSubscription {
3900                target_subscription,
3901            }
3902        } else {
3903            return self.expected("RENAME or OWNER TO or SET or SWAP after ALTER SUBSCRIPTION");
3904        };
3905
3906        Ok(Statement::AlterSubscription {
3907            name: subscription_name,
3908            operation,
3909        })
3910    }
3911
3912    pub fn parse_alter_source(&mut self) -> ModalResult<Statement> {
3913        let source_name = self.parse_object_name()?;
3914        let operation = if self.parse_keyword(Keyword::RENAME) {
3915            if self.parse_keyword(Keyword::TO) {
3916                let source_name = self.parse_object_name()?;
3917                AlterSourceOperation::RenameSource { source_name }
3918            } else {
3919                return self.expected("TO after RENAME");
3920            }
3921        } else if self.parse_keyword(Keyword::ADD) {
3922            let _ = self.parse_keyword(Keyword::COLUMN);
3923            let _if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3924            let column_def = self.parse_column_def()?;
3925            AlterSourceOperation::AddColumn { column_def }
3926        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3927            let owner_name: Ident = self.parse_identifier()?;
3928            AlterSourceOperation::ChangeOwner {
3929                new_owner_name: owner_name,
3930            }
3931        } else if self.parse_keyword(Keyword::SET) {
3932            if self.parse_keyword(Keyword::SCHEMA) {
3933                let schema_name = self.parse_object_name()?;
3934                AlterSourceOperation::SetSchema {
3935                    new_schema_name: schema_name,
3936                }
3937            } else if let Some(rate_limit) = self.parse_alter_source_rate_limit(false)? {
3938                AlterSourceOperation::SetSourceRateLimit { rate_limit }
3939            } else if self.parse_keyword(Keyword::PARALLELISM) {
3940                if self.expect_keyword(Keyword::TO).is_err()
3941                    && self.expect_token(&Token::Eq).is_err()
3942                {
3943                    return self.expected("TO or = after ALTER SOURCE SET PARALLELISM");
3944                }
3945
3946                let value = self.parse_set_variable()?;
3947                let deferred = self.parse_keyword(Keyword::DEFERRED);
3948
3949                AlterSourceOperation::SetParallelism {
3950                    parallelism: value,
3951                    deferred,
3952                }
3953            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3954                if self.expect_keyword(Keyword::TO).is_err()
3955                    && self.expect_token(&Token::Eq).is_err()
3956                {
3957                    return self.expected("TO or = after ALTER SOURCE SET BACKFILL_PARALLELISM");
3958                }
3959
3960                let value = self.parse_set_variable()?;
3961                let deferred = self.parse_keyword(Keyword::DEFERRED);
3962
3963                AlterSourceOperation::SetBackfillParallelism {
3964                    parallelism: value,
3965                    deferred,
3966                }
3967            } else if self.parse_keyword(Keyword::CONFIG) {
3968                let entries = self.parse_options()?;
3969                AlterSourceOperation::SetConfig { entries }
3970            } else {
3971                return self.expected(
3972                    "SCHEMA, SOURCE_RATE_LIMIT, PARALLELISM, BACKFILL_PARALLELISM or CONFIG after SET",
3973                );
3974            }
3975        } else if self.parse_keyword(Keyword::RESET) {
3976            if self.parse_keyword(Keyword::CONFIG) {
3977                let keys = self.parse_parenthesized_object_name_list()?;
3978                AlterSourceOperation::ResetConfig { keys }
3979            } else {
3980                // RESET without CONFIG means reset CDC source offset to latest
3981                AlterSourceOperation::ResetSource
3982            }
3983        } else if self.peek_nth_any_of_keywords(0, &[Keyword::FORMAT]) {
3984            let format_encode = self.parse_schema()?.unwrap();
3985            if format_encode.key_encode.is_some() {
3986                parser_err!("key encode clause is not supported in source schema");
3987            }
3988            AlterSourceOperation::FormatEncode { format_encode }
3989        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3990            AlterSourceOperation::RefreshSchema
3991        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3992            let target_source = self.parse_object_name()?;
3993            AlterSourceOperation::SwapRenameSource { target_source }
3994        } else if self.parse_keyword(Keyword::CONNECTOR) {
3995            let with_options = self.parse_with_properties()?;
3996            AlterSourceOperation::AlterConnectorProps {
3997                alter_props: with_options,
3998            }
3999        } else {
4000            return self.expected(
4001                "RENAME, ADD COLUMN, OWNER TO, CONNECTOR, SET or RESET after ALTER SOURCE",
4002            );
4003        };
4004
4005        Ok(Statement::AlterSource {
4006            name: source_name,
4007            operation,
4008        })
4009    }
4010
4011    pub fn parse_alter_function(&mut self) -> ModalResult<Statement> {
4012        let FunctionDesc { name, args } = self.parse_function_desc()?;
4013
4014        let operation = if self.parse_keyword(Keyword::SET) {
4015            if self.parse_keyword(Keyword::SCHEMA) {
4016                let schema_name = self.parse_object_name()?;
4017                AlterFunctionOperation::SetSchema {
4018                    new_schema_name: schema_name,
4019                }
4020            } else {
4021                return self.expected("SCHEMA after SET");
4022            }
4023        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
4024            let owner_name: Ident = self.parse_identifier()?;
4025            AlterFunctionOperation::ChangeOwner {
4026                new_owner_name: owner_name,
4027            }
4028        } else {
4029            return self.expected("SET or OWNER TO after ALTER FUNCTION");
4030        };
4031
4032        Ok(Statement::AlterFunction {
4033            name,
4034            args,
4035            operation,
4036        })
4037    }
4038
4039    pub fn parse_alter_connection(&mut self) -> ModalResult<Statement> {
4040        let connection_name = self.parse_object_name()?;
4041        let operation = if self.parse_keyword(Keyword::SET) {
4042            if self.parse_keyword(Keyword::SCHEMA) {
4043                let schema_name = self.parse_object_name()?;
4044                AlterConnectionOperation::SetSchema {
4045                    new_schema_name: schema_name,
4046                }
4047            } else {
4048                return self.expected("SCHEMA after SET");
4049            }
4050        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
4051            let owner_name: Ident = self.parse_identifier()?;
4052            AlterConnectionOperation::ChangeOwner {
4053                new_owner_name: owner_name,
4054            }
4055        } else if self.parse_keyword(Keyword::CONNECTOR) {
4056            let with_options = self.parse_with_properties()?;
4057            AlterConnectionOperation::AlterConnectorProps {
4058                alter_props: with_options,
4059            }
4060        } else {
4061            return self.expected("SET, OWNER TO, or CONNECTOR WITH after ALTER CONNECTION");
4062        };
4063
4064        Ok(Statement::AlterConnection {
4065            name: connection_name,
4066            operation,
4067        })
4068    }
4069
4070    pub fn parse_alter_system(&mut self) -> ModalResult<Statement> {
4071        self.expect_keyword(Keyword::SET)?;
4072        let param = self.parse_identifier()?;
4073        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4074            return self.expected("TO or = after ALTER SYSTEM SET");
4075        }
4076        let value = self.parse_set_variable()?;
4077        Ok(Statement::AlterSystem { param, value })
4078    }
4079
4080    pub fn parse_alter_secret(&mut self) -> ModalResult<Statement> {
4081        let secret_name = self.parse_object_name()?;
4082        let operation = if self.parse_keyword(Keyword::WITH) {
4083            let with_options = self.parse_options()?;
4084            if self.parse_keyword(Keyword::AS) {
4085                let new_credential = self.ensure_parse_value()?;
4086                AlterSecretOperation::ChangeCredential {
4087                    with_options,
4088                    new_credential,
4089                }
4090            } else {
4091                return self.expected("Keyword AS after Options");
4092            }
4093        } else if self.parse_keyword(Keyword::AS) {
4094            let new_credential = self.ensure_parse_value()?;
4095            AlterSecretOperation::ChangeCredential {
4096                with_options: vec![],
4097                new_credential,
4098            }
4099        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
4100            let owner_name: Ident = self.parse_identifier()?;
4101            AlterSecretOperation::ChangeOwner {
4102                new_owner_name: owner_name,
4103            }
4104        } else {
4105            return self.expected("WITH, AS or OWNER TO after ALTER SECRET");
4106        };
4107        Ok(Statement::AlterSecret {
4108            name: secret_name,
4109            operation,
4110        })
4111    }
4112
4113    pub fn parse_alter_fragment(&mut self) -> ModalResult<Statement> {
4114        let mut fragment_ids = vec![self.parse_literal_u32()?];
4115        while self.consume_token(&Token::Comma) {
4116            fragment_ids.push(self.parse_literal_u32()?);
4117        }
4118        if !self.parse_keyword(Keyword::SET) {
4119            return self.expected("SET after ALTER FRAGMENT");
4120        }
4121        let operation = if self.parse_keyword(Keyword::PARALLELISM) {
4122            if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4123                return self.expected("TO or = after ALTER FRAGMENT SET PARALLELISM");
4124            }
4125            let parallelism = self.parse_set_variable()?;
4126            AlterFragmentOperation::SetParallelism { parallelism }
4127        } else {
4128            let rate_limit = self.parse_alter_fragment_rate_limit()?;
4129            AlterFragmentOperation::AlterBackfillRateLimit { rate_limit }
4130        };
4131        Ok(Statement::AlterFragment {
4132            fragment_ids,
4133            operation,
4134        })
4135    }
4136
4137    pub fn parse_alter_compaction_group(&mut self) -> ModalResult<Statement> {
4138        if !self.parse_keyword(Keyword::GROUP) {
4139            return self.expected("GROUP after ALTER COMPACTION");
4140        }
4141        let mut group_ids = vec![self.parse_literal_u64()?];
4142        while self.consume_token(&Token::Comma) {
4143            group_ids.push(self.parse_literal_u64()?);
4144        }
4145        if !self.parse_keyword(Keyword::SET) {
4146            return self.expected("SET after ALTER COMPACTION GROUP <id>");
4147        }
4148        // NOTE: use the `no_list` variant here, because `parse_set_variable` allows comma-separated
4149        // lists (e.g., `SET foo = 1,2,3`), which would conflict with our use of comma to separate
4150        // multiple config assignments.
4151        let configs = self.parse_comma_separated(Parser::parse_config_param_no_list)?;
4152        let operation = AlterCompactionGroupOperation::Set { configs };
4153        Ok(Statement::AlterCompactionGroup {
4154            group_ids,
4155            operation,
4156        })
4157    }
4158
4159    fn parse_alter_fragment_rate_limit(&mut self) -> ModalResult<i32> {
4160        if !self.parse_word("RATE_LIMIT") {
4161            return self.expected("expected RATE_LIMIT after SET");
4162        }
4163        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4164            return self.expected("TO or = after RATE_LIMIT");
4165        }
4166        let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
4167            -1
4168        } else {
4169            let s = self.parse_number_value()?;
4170            if let Ok(n) = s.parse::<i32>() {
4171                n
4172            } else {
4173                return self.expected("number or DEFAULT");
4174            }
4175        };
4176        Ok(rate_limit)
4177    }
4178
4179    /// Parse a copy statement
4180    pub fn parse_copy(&mut self) -> ModalResult<Statement> {
4181        let entity = if self.consume_token(&Token::LParen) {
4182            let query = self.parse_query()?;
4183            self.expect_token(&Token::RParen)?;
4184            CopyEntity::Query(query.into())
4185        } else {
4186            let table_name = self.parse_object_name()?;
4187            let columns = self.parse_parenthesized_column_list(Optional)?;
4188            CopyEntity::Table {
4189                table_name,
4190                columns,
4191            }
4192        };
4193
4194        let target = if self.parse_keywords(&[Keyword::FROM, Keyword::STDIN]) {
4195            self.expect_token(&Token::SemiColon)?;
4196            let values = self.parse_tsv();
4197            CopyTarget::Stdin { values }
4198        } else if self.parse_keywords(&[Keyword::TO, Keyword::STDOUT]) {
4199            CopyTarget::Stdout
4200        } else {
4201            return self.expected("FROM STDIN or TO STDOUT");
4202        };
4203
4204        Ok(Statement::Copy { entity, target })
4205    }
4206
4207    /// Parse a tab separated values in
4208    /// COPY payload
4209    fn parse_tsv(&mut self) -> Vec<Option<String>> {
4210        self.parse_tab_value()
4211    }
4212
4213    fn parse_tab_value(&mut self) -> Vec<Option<String>> {
4214        let mut values = vec![];
4215        let mut content = String::from("");
4216        while let Some(t) = self.next_token_no_skip() {
4217            match t.token {
4218                Token::Whitespace(Whitespace::Tab) => {
4219                    values.push(Some(content.clone()));
4220                    content.clear();
4221                }
4222                Token::Whitespace(Whitespace::Newline) => {
4223                    values.push(Some(content.clone()));
4224                    content.clear();
4225                }
4226                Token::Backslash => {
4227                    if self.consume_token(&Token::Period) {
4228                        return values;
4229                    }
4230                    if let Token::Word(w) = self.next_token().token
4231                        && w.value == "N"
4232                    {
4233                        values.push(None);
4234                    }
4235                }
4236                _ => {
4237                    content.push_str(&t.to_string());
4238                }
4239            }
4240        }
4241        values
4242    }
4243
4244    pub fn ensure_parse_value(&mut self) -> ModalResult<Value> {
4245        match self.parse_value_and_obj_ref::<true>()? {
4246            SqlOptionValue::Value(value) => Ok(value),
4247            SqlOptionValue::SecretRef(_)
4248            | SqlOptionValue::ConnectionRef(_)
4249            | SqlOptionValue::BackfillOrder(_) => unreachable!(),
4250        }
4251    }
4252
4253    /// Parse a literal value (numbers, strings, date/time, booleans)
4254    pub fn parse_value_and_obj_ref<const FORBID_OBJ_REF: bool>(
4255        &mut self,
4256    ) -> ModalResult<SqlOptionValue> {
4257        let checkpoint = *self;
4258        let token = self.next_token();
4259        match token.token {
4260            Token::Word(w) => match w.keyword {
4261                Keyword::TRUE => Ok(Value::Boolean(true).into()),
4262                Keyword::FALSE => Ok(Value::Boolean(false).into()),
4263                Keyword::NULL => Ok(Value::Null.into()),
4264                Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
4265                    Some('"') => Ok(Value::DoubleQuotedString(w.value).into()),
4266                    Some('\'') => Ok(Value::SingleQuotedString(w.value).into()),
4267                    _ => self.expected_at(checkpoint, "A value")?,
4268                },
4269                Keyword::SECRET => {
4270                    if FORBID_OBJ_REF {
4271                        return self.expected_at(
4272                            checkpoint,
4273                            "a concrete value rather than a secret reference",
4274                        );
4275                    }
4276                    let secret = self.parse_secret_ref()?;
4277                    Ok(SqlOptionValue::SecretRef(secret))
4278                }
4279                _ => self.expected_at(checkpoint, "a concrete value"),
4280            },
4281            Token::Number(ref n) => Ok(Value::Number(n.clone()).into()),
4282            Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.clone()).into()),
4283            Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone()).into()),
4284            Token::CstyleEscapesString(ref s) => Ok(Value::CstyleEscapedString(s.clone()).into()),
4285            Token::NationalStringLiteral(ref s) => {
4286                Ok(Value::NationalStringLiteral(s.clone()).into())
4287            }
4288            Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.clone()).into()),
4289            _ => self.expected_at(checkpoint, "a value"),
4290        }
4291    }
4292
4293    fn parse_secret_ref(&mut self) -> ModalResult<SecretRefValue> {
4294        let secret_name = self.parse_object_name()?;
4295        let ref_as = if self.parse_keywords(&[Keyword::AS, Keyword::FILE]) {
4296            SecretRefAsType::File
4297        } else {
4298            SecretRefAsType::Text
4299        };
4300        Ok(SecretRefValue {
4301            secret_name,
4302            ref_as,
4303        })
4304    }
4305
4306    fn parse_set_variable(&mut self) -> ModalResult<SetVariableValue> {
4307        alt((
4308            Keyword::DEFAULT.value(SetVariableValue::Default),
4309            separated(
4310                1..,
4311                alt((
4312                    Self::ensure_parse_value.map(SetVariableValueSingle::Literal),
4313                    |parser: &mut Self| {
4314                        let checkpoint = *parser;
4315                        let ident = parser.parse_identifier()?;
4316                        if parser.consume_token(&Token::LParen) {
4317                            let args = parser.parse_comma_separated(Parser::ensure_parse_value)?;
4318                            parser.expect_token(&Token::RParen)?;
4319                            let raw = format!(
4320                                "{}({})",
4321                                ident,
4322                                args.iter().map(ToString::to_string).join(", ")
4323                            );
4324                            return Ok(SetVariableValueSingle::Raw(raw));
4325                        }
4326                        if ident.value == "default" {
4327                            *parser = checkpoint;
4328                            return parser.expected("parameter list value").map_err(|e| e.cut());
4329                        }
4330                        Ok(SetVariableValueSingle::Ident(ident))
4331                    },
4332                    fail.expect("parameter value"),
4333                )),
4334                Token::Comma,
4335            )
4336            .map(|list: Vec<SetVariableValueSingle>| {
4337                if list.len() == 1 {
4338                    SetVariableValue::Single(list[0].clone())
4339                } else {
4340                    SetVariableValue::List(list)
4341                }
4342            }),
4343        ))
4344        .parse_next(self)
4345    }
4346
4347    fn parse_backfill_order_strategy(&mut self) -> ModalResult<BackfillOrderStrategy> {
4348        alt((
4349            Keyword::DEFAULT.value(BackfillOrderStrategy::Default),
4350            Keyword::NONE.value(BackfillOrderStrategy::None),
4351            Keyword::AUTO.value(BackfillOrderStrategy::Auto),
4352            Self::parse_fixed_backfill_order.map(BackfillOrderStrategy::Fixed),
4353            fail.expect("backfill order strategy"),
4354        ))
4355        .parse_next(self)
4356    }
4357
4358    fn parse_fixed_backfill_order(&mut self) -> ModalResult<Vec<(ObjectName, ObjectName)>> {
4359        self.expect_word("FIXED")?;
4360        self.expect_token(&Token::LParen)?;
4361        let edges = separated(
4362            0..,
4363            separated_pair(
4364                Self::parse_object_name,
4365                Token::Op("->".to_owned()),
4366                Self::parse_object_name,
4367            ),
4368            Token::Comma,
4369        )
4370        .parse_next(self)?;
4371        self.expect_token(&Token::RParen)?;
4372        Ok(edges)
4373    }
4374
4375    pub fn parse_number_value(&mut self) -> ModalResult<String> {
4376        let checkpoint = *self;
4377        match self.ensure_parse_value()? {
4378            Value::Number(v) => Ok(v),
4379            _ => self.expected_at(checkpoint, "literal number"),
4380        }
4381    }
4382
4383    pub fn parse_literal_u32(&mut self) -> ModalResult<u32> {
4384        literal_u32(self)
4385    }
4386
4387    pub fn parse_literal_u64(&mut self) -> ModalResult<u64> {
4388        literal_u64(self)
4389    }
4390
4391    pub fn parse_function_definition(&mut self) -> ModalResult<FunctionDefinition> {
4392        alt((
4393            single_quoted_string.map(FunctionDefinition::SingleQuotedDef),
4394            dollar_quoted_string.map(FunctionDefinition::DoubleDollarDef),
4395            Self::parse_identifier.map(|i| FunctionDefinition::Identifier(i.value)),
4396            fail.expect("function definition"),
4397        ))
4398        .parse_next(self)
4399    }
4400
4401    /// Parse a literal string
4402    pub fn parse_literal_string(&mut self) -> ModalResult<String> {
4403        let checkpoint = *self;
4404        let token = self.next_token();
4405        match token.token {
4406            Token::SingleQuotedString(s) => Ok(s),
4407            _ => self.expected_at(checkpoint, "literal string"),
4408        }
4409    }
4410
4411    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
4412    pub fn parse_data_type(&mut self) -> ModalResult<DataType> {
4413        parser_v2::data_type(self)
4414    }
4415
4416    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
4417    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
4418    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
4419    pub fn parse_optional_alias(
4420        &mut self,
4421        reserved_kwds: &[Keyword],
4422    ) -> ModalResult<Option<Ident>> {
4423        let after_as = self.parse_keyword(Keyword::AS);
4424        let checkpoint = *self;
4425        let token = self.next_token();
4426        match token.token {
4427            // Accept any identifier after `AS` (though many dialects have restrictions on
4428            // keywords that may appear here). If there's no `AS`: don't parse keywords,
4429            // which may start a construct allowed in this position, to be parsed as aliases.
4430            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
4431            // not an alias.)
4432            Token::Word(w) if after_as || (!reserved_kwds.contains(&w.keyword)) => {
4433                Ok(Some(w.to_ident()?))
4434            }
4435            _ => {
4436                *self = checkpoint;
4437                if after_as {
4438                    return self.expected("an identifier after AS");
4439                }
4440                Ok(None) // no alias found
4441            }
4442        }
4443    }
4444
4445    /// Parse `AS identifier` when the AS is describing a table-valued object,
4446    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
4447    /// the alias is allowed to optionally name the columns in the table, in
4448    /// addition to the table itself.
4449    pub fn parse_optional_table_alias(
4450        &mut self,
4451        reserved_kwds: &[Keyword],
4452    ) -> ModalResult<Option<TableAlias>> {
4453        match self.parse_optional_alias(reserved_kwds)? {
4454            Some(name) => {
4455                let columns = self.parse_parenthesized_column_list(Optional)?;
4456                Ok(Some(TableAlias { name, columns }))
4457            }
4458            None => Ok(None),
4459        }
4460    }
4461
4462    /// syntax `FOR SYSTEM_TIME AS OF PROCTIME()` is used for temporal join.
4463    pub fn parse_as_of(&mut self) -> ModalResult<AsOf> {
4464        Keyword::FOR.parse_next(self)?;
4465        alt((
4466            preceded(
4467                (Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF),
4468                cut_err(
4469                    alt((
4470                        preceded(
4471                            (
4472                                Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4473                                cut_err(Token::LParen),
4474                                cut_err(Token::RParen),
4475                                Token::Minus,
4476                            ),
4477                            Self::parse_literal_interval.try_map(|e| match e {
4478                                Expr::Value(v) => match v {
4479                                    Value::Interval {
4480                                        value,
4481                                        leading_field,
4482                                        ..
4483                                    } => {
4484                                        let Some(leading_field) = leading_field else {
4485                                            return Err(StrError("expect duration unit".into()));
4486                                        };
4487                                        Ok(AsOf::ProcessTimeWithInterval((value, leading_field)))
4488                                    }
4489                                    _ => Err(StrError("expect Value::Interval".into())),
4490                                },
4491                                _ => Err(StrError("expect Expr::Value".into())),
4492                            }),
4493                        ),
4494                        (
4495                            Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4496                            cut_err(Token::LParen),
4497                            cut_err(Token::RParen),
4498                        )
4499                            .value(AsOf::ProcessTimeWithInterval((
4500                                "0".to_owned(),
4501                                DateTimeField::Second,
4502                            ))),
4503                        (
4504                            Self::parse_identifier.verify(|ident| ident.real_value() == "proctime"),
4505                            cut_err(Token::LParen),
4506                            cut_err(Token::RParen),
4507                        )
4508                            .value(AsOf::ProcessTime),
4509                        literal_i64.map(AsOf::TimestampNum),
4510                        single_quoted_string.map(AsOf::TimestampString),
4511                    ))
4512                    .expect("proctime(), now(), number or string"),
4513                ),
4514            ),
4515            preceded(
4516                (Keyword::SYSTEM_VERSION, Keyword::AS, Keyword::OF),
4517                cut_err(
4518                    alt((
4519                        literal_i64.map(AsOf::VersionNum),
4520                        single_quoted_string.map(AsOf::VersionString),
4521                    ))
4522                    .expect("number or string"),
4523                ),
4524            ),
4525        ))
4526        .parse_next(self)
4527    }
4528
4529    /// Parse a possibly qualified, possibly quoted identifier, e.g.
4530    /// `foo` or `myschema."table"
4531    pub fn parse_object_name(&mut self) -> ModalResult<ObjectName> {
4532        let mut idents = vec![];
4533        loop {
4534            idents.push(self.parse_identifier()?);
4535            if !self.consume_token(&Token::Period) {
4536                break;
4537            }
4538        }
4539        Ok(ObjectName(idents))
4540    }
4541
4542    /// Parse a parenthesized comma-separated list of object names
4543    pub fn parse_parenthesized_object_name_list(&mut self) -> ModalResult<Vec<ObjectName>> {
4544        if self.consume_token(&Token::LParen) {
4545            let names = self.parse_comma_separated(Parser::parse_object_name)?;
4546            self.expect_token(&Token::RParen)?;
4547            Ok(names)
4548        } else {
4549            self.expected("a list of object names in parentheses")
4550        }
4551    }
4552
4553    /// Parse identifiers strictly i.e. don't parse keywords
4554    pub fn parse_identifiers_non_keywords(&mut self) -> ModalResult<Vec<Ident>> {
4555        let mut idents = vec![];
4556        loop {
4557            match self.peek_token().token {
4558                Token::Word(w) => {
4559                    if w.keyword != Keyword::NoKeyword {
4560                        break;
4561                    }
4562
4563                    idents.push(w.to_ident()?);
4564                }
4565                Token::EOF | Token::Eq => break,
4566                _ => {}
4567            }
4568
4569            self.next_token();
4570        }
4571
4572        Ok(idents)
4573    }
4574
4575    /// Parse identifiers
4576    pub fn parse_identifiers(&mut self) -> ModalResult<Vec<Ident>> {
4577        let mut idents = vec![];
4578        loop {
4579            let token = self.next_token();
4580            match token.token {
4581                Token::Word(w) => {
4582                    idents.push(w.to_ident()?);
4583                }
4584                Token::EOF => break,
4585                _ => {}
4586            }
4587        }
4588
4589        Ok(idents)
4590    }
4591
4592    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
4593    pub fn parse_identifier(&mut self) -> ModalResult<Ident> {
4594        let checkpoint = *self;
4595        let token = self.next_token();
4596        match token.token {
4597            Token::Word(w) => Ok(w.to_ident()?),
4598            _ => self.expected_at(checkpoint, "identifier"),
4599        }
4600    }
4601
4602    /// Parse a simple one-word identifier (possibly quoted, possibly a non-reserved keyword)
4603    pub fn parse_identifier_non_reserved(&mut self) -> ModalResult<Ident> {
4604        let checkpoint = *self;
4605        let token = self.next_token();
4606        match token.token {
4607            Token::Word(w) => {
4608                match keywords::RESERVED_FOR_COLUMN_OR_TABLE_NAME.contains(&w.keyword) {
4609                    true => parser_err!("syntax error at or near {w}"),
4610                    false => Ok(w.to_ident()?),
4611                }
4612            }
4613            _ => self.expected_at(checkpoint, "identifier"),
4614        }
4615    }
4616
4617    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
4618    pub fn parse_parenthesized_column_list(
4619        &mut self,
4620        optional: IsOptional,
4621    ) -> ModalResult<Vec<Ident>> {
4622        if self.consume_token(&Token::LParen) {
4623            let cols = self.parse_comma_separated(Parser::parse_identifier_non_reserved)?;
4624            self.expect_token(&Token::RParen)?;
4625            Ok(cols)
4626        } else if optional == Optional {
4627            Ok(vec![])
4628        } else {
4629            self.expected("a list of columns in parentheses")
4630        }
4631    }
4632
4633    pub fn parse_returning(&mut self, optional: IsOptional) -> ModalResult<Vec<SelectItem>> {
4634        if self.parse_keyword(Keyword::RETURNING) {
4635            let cols = self.parse_comma_separated(Parser::parse_select_item)?;
4636            Ok(cols)
4637        } else if optional == Optional {
4638            Ok(vec![])
4639        } else {
4640            self.expected("a list of columns or * after returning")
4641        }
4642    }
4643
4644    pub fn parse_row_expr(&mut self) -> ModalResult<Expr> {
4645        Ok(Expr::Row(self.parse_token_wrapped_exprs(
4646            &Token::LParen,
4647            &Token::RParen,
4648        )?))
4649    }
4650
4651    /// Parse a comma-separated list (maybe empty) from a wrapped expression
4652    pub fn parse_token_wrapped_exprs(
4653        &mut self,
4654        left: &Token,
4655        right: &Token,
4656    ) -> ModalResult<Vec<Expr>> {
4657        if self.consume_token(left) {
4658            let exprs = if self.consume_token(right) {
4659                vec![]
4660            } else {
4661                let exprs = self.parse_comma_separated(Parser::parse_expr)?;
4662                self.expect_token(right)?;
4663                exprs
4664            };
4665            Ok(exprs)
4666        } else {
4667            self.expected(left.to_string().as_str())
4668        }
4669    }
4670
4671    pub fn parse_optional_precision(&mut self) -> ModalResult<Option<u64>> {
4672        if self.consume_token(&Token::LParen) {
4673            let n = self.parse_literal_u64()?;
4674            self.expect_token(&Token::RParen)?;
4675            Ok(Some(n))
4676        } else {
4677            Ok(None)
4678        }
4679    }
4680
4681    pub fn parse_optional_precision_scale(&mut self) -> ModalResult<(Option<u64>, Option<u64>)> {
4682        if self.consume_token(&Token::LParen) {
4683            let n = self.parse_literal_u64()?;
4684            let scale = if self.consume_token(&Token::Comma) {
4685                Some(self.parse_literal_u64()?)
4686            } else {
4687                None
4688            };
4689            self.expect_token(&Token::RParen)?;
4690            Ok((Some(n), scale))
4691        } else {
4692            Ok((None, None))
4693        }
4694    }
4695
4696    pub fn parse_delete(&mut self) -> ModalResult<Statement> {
4697        if self.parse_keyword(Keyword::META) {
4698            let Some(_) = self.parse_one_of_keywords(&[Keyword::SNAPSHOT, Keyword::SNAPSHOTS])
4699            else {
4700                return self.expected("SNAPSHOT or SNAPSHOTS");
4701            };
4702            let snapshot_ids = self.parse_comma_separated(Parser::parse_literal_u64)?;
4703            return Ok(Statement::DeleteMetaSnapshots { snapshot_ids });
4704        }
4705
4706        self.expect_keyword(Keyword::FROM)?;
4707        let table_name = self.parse_object_name()?;
4708        let selection = if self.parse_keyword(Keyword::WHERE) {
4709            Some(self.parse_expr()?)
4710        } else {
4711            None
4712        };
4713        let returning = self.parse_returning(Optional)?;
4714
4715        Ok(Statement::Delete {
4716            table_name,
4717            selection,
4718            returning,
4719        })
4720    }
4721
4722    pub fn parse_boolean(&mut self) -> ModalResult<bool> {
4723        if let Some(keyword) = self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
4724            match keyword {
4725                Keyword::TRUE => Ok(true),
4726                Keyword::FALSE => Ok(false),
4727                _ => unreachable!(),
4728            }
4729        } else {
4730            self.expected("TRUE or FALSE")
4731        }
4732    }
4733
4734    pub fn parse_optional_boolean(&mut self, default: bool) -> bool {
4735        self.parse_boolean().unwrap_or(default)
4736    }
4737
4738    fn parse_explain_options(&mut self) -> ModalResult<(ExplainOptions, Option<u64>)> {
4739        let mut options = ExplainOptions::default();
4740        let mut analyze_duration = None;
4741
4742        const BACKFILL: &str = "backfill";
4743        const VERBOSE: &str = "verbose";
4744        const TRACE: &str = "trace";
4745        const TYPE: &str = "type";
4746        const LOGICAL: &str = "logical";
4747        const PHYSICAL: &str = "physical";
4748        const DISTSQL: &str = "distsql";
4749        const FORMAT: &str = "format";
4750        const DURATION_SECS: &str = "duration_secs";
4751
4752        let explain_options_identifiers = [
4753            BACKFILL,
4754            VERBOSE,
4755            TRACE,
4756            TYPE,
4757            LOGICAL,
4758            PHYSICAL,
4759            DISTSQL,
4760            FORMAT,
4761            DURATION_SECS,
4762        ];
4763
4764        let parse_explain_option = |parser: &mut Parser<'_>| -> ModalResult<()> {
4765            match parser.parse_identifier()?.real_value().as_str() {
4766                VERBOSE => options.verbose = parser.parse_optional_boolean(true),
4767                TRACE => options.trace = parser.parse_optional_boolean(true),
4768                BACKFILL => options.backfill = parser.parse_optional_boolean(true),
4769                TYPE => {
4770                    let explain_type = parser.parse_identifier()?.real_value();
4771                    match explain_type.as_str() {
4772                        LOGICAL => options.explain_type = ExplainType::Logical,
4773                        PHYSICAL => options.explain_type = ExplainType::Physical,
4774                        DISTSQL => options.explain_type = ExplainType::DistSql,
4775                        unexpected => {
4776                            parser_err!("unexpected explain type: [{unexpected}]")
4777                        }
4778                    }
4779                }
4780                LOGICAL => options.explain_type = ExplainType::Logical,
4781                PHYSICAL => options.explain_type = ExplainType::Physical,
4782                DISTSQL => options.explain_type = ExplainType::DistSql,
4783                FORMAT => {
4784                    options.explain_format = {
4785                        let format = parser.parse_identifier()?.real_value();
4786                        match format.as_str() {
4787                            "text" => ExplainFormat::Text,
4788                            "json" => ExplainFormat::Json,
4789                            "xml" => ExplainFormat::Xml,
4790                            "yaml" => ExplainFormat::Yaml,
4791                            "dot" => ExplainFormat::Dot,
4792                            unexpected => {
4793                                parser_err!("unexpected explain format [{unexpected}]")
4794                            }
4795                        }
4796                    }
4797                }
4798                DURATION_SECS => {
4799                    analyze_duration = Some(parser.parse_literal_u64()?);
4800                }
4801                unexpected => {
4802                    parser_err!("unexpected explain options: [{unexpected}]")
4803                }
4804            };
4805            Ok(())
4806        };
4807
4808        // In order to support following statement, we need to peek before consume.
4809        // explain (select 1) union (select 1)
4810        if self.peek_token() == Token::LParen
4811            && let Token::Word(word) = self.peek_nth_token(1).token
4812            && let Ok(ident) = word.to_ident()
4813            && explain_options_identifiers.contains(&ident.real_value().as_str())
4814        {
4815            assert!(self.consume_token(&Token::LParen));
4816            self.parse_comma_separated(parse_explain_option)?;
4817            self.expect_token(&Token::RParen)?;
4818        }
4819
4820        Ok((options, analyze_duration))
4821    }
4822
4823    pub fn parse_explain(&mut self) -> ModalResult<Statement> {
4824        let analyze = self.parse_keyword(Keyword::ANALYZE);
4825        let (options, analyze_duration) = self.parse_explain_options()?;
4826
4827        if analyze {
4828            fn parse_analyze_target(parser: &mut Parser<'_>) -> ModalResult<Option<AnalyzeTarget>> {
4829                if parser.parse_keyword(Keyword::TABLE) {
4830                    let table_name = parser.parse_object_name()?;
4831                    Ok(Some(AnalyzeTarget::Table(table_name)))
4832                } else if parser.parse_keyword(Keyword::INDEX) {
4833                    let index_name = parser.parse_object_name()?;
4834                    Ok(Some(AnalyzeTarget::Index(index_name)))
4835                } else if parser.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
4836                    let view_name = parser.parse_object_name()?;
4837                    Ok(Some(AnalyzeTarget::MaterializedView(view_name)))
4838                } else if parser.parse_keyword(Keyword::INDEX) {
4839                    let index_name = parser.parse_object_name()?;
4840                    Ok(Some(AnalyzeTarget::Index(index_name)))
4841                } else if parser.parse_keyword(Keyword::SINK) {
4842                    let sink_name = parser.parse_object_name()?;
4843                    Ok(Some(AnalyzeTarget::Sink(sink_name)))
4844                } else if parser.parse_word("ID") {
4845                    let job_id = parser.parse_literal_u32()?;
4846                    Ok(Some(AnalyzeTarget::Id(job_id)))
4847                } else {
4848                    Ok(None)
4849                }
4850            }
4851            if let Some(target) = parse_analyze_target(self)? {
4852                let statement = Statement::ExplainAnalyzeStreamJob {
4853                    target,
4854                    duration_secs: analyze_duration,
4855                };
4856                return Ok(statement);
4857            }
4858        }
4859
4860        let statement = match self.parse_statement() {
4861            Ok(statement) => statement,
4862            error @ Err(_) => {
4863                return if analyze {
4864                    self.expected_at(
4865                        *self,
4866                        "SINK, TABLE, MATERIALIZED VIEW, INDEX or a statement after ANALYZE",
4867                    )
4868                } else {
4869                    error
4870                };
4871            }
4872        };
4873        Ok(Statement::Explain {
4874            analyze,
4875            statement: Box::new(statement),
4876            options,
4877        })
4878    }
4879
4880    pub fn parse_describe(&mut self) -> ModalResult<Statement> {
4881        let kind = match self.parse_one_of_keywords(&[Keyword::FRAGMENT, Keyword::FRAGMENTS]) {
4882            Some(Keyword::FRAGMENT) => {
4883                let fragment_id = self.parse_literal_u32()?;
4884                return Ok(Statement::DescribeFragment { fragment_id });
4885            }
4886            Some(Keyword::FRAGMENTS) => DescribeKind::Fragments,
4887            None => DescribeKind::Plain,
4888            Some(_) => unreachable!(),
4889        };
4890        let name = self.parse_object_name()?;
4891        Ok(Statement::Describe { name, kind })
4892    }
4893
4894    /// Parse a query expression, i.e. a `SELECT` statement optionally
4895    /// preceded with some `WITH` CTE declarations and optionally followed
4896    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
4897    /// expect the initial keyword to be already consumed
4898    pub fn parse_query(&mut self) -> ModalResult<Query> {
4899        let with = if self.parse_keyword(Keyword::WITH) {
4900            Some(With {
4901                recursive: self.parse_keyword(Keyword::RECURSIVE),
4902                cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
4903            })
4904        } else {
4905            None
4906        };
4907
4908        let body = self.parse_query_body(0)?;
4909
4910        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
4911            self.parse_comma_separated(Parser::parse_order_by_expr)?
4912        } else {
4913            vec![]
4914        };
4915
4916        let mut limit = None;
4917        let mut offset = None;
4918        for _x in 0..2 {
4919            if limit.is_none() && self.parse_keyword(Keyword::LIMIT) {
4920                limit = self.parse_limit()?
4921            }
4922
4923            if offset.is_none() && self.parse_keyword(Keyword::OFFSET) {
4924                offset = Some(self.parse_offset()?)
4925            }
4926        }
4927
4928        let fetch = if self.parse_keyword(Keyword::FETCH) {
4929            if limit.is_some() {
4930                parser_err!("Cannot specify both LIMIT and FETCH");
4931            }
4932            let fetch = self.parse_fetch()?;
4933            if fetch.with_ties && order_by.is_empty() {
4934                parser_err!("WITH TIES cannot be specified without ORDER BY clause");
4935            }
4936            Some(fetch)
4937        } else {
4938            None
4939        };
4940
4941        Ok(Query {
4942            with,
4943            body,
4944            order_by,
4945            limit,
4946            offset,
4947            fetch,
4948        })
4949    }
4950
4951    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
4952    fn parse_cte(&mut self) -> ModalResult<Cte> {
4953        let name = self.parse_identifier_non_reserved()?;
4954        let cte = if self.parse_keyword(Keyword::AS) {
4955            let cte_inner = self.parse_cte_inner()?;
4956            let alias = TableAlias {
4957                name,
4958                columns: vec![],
4959            };
4960            Cte { alias, cte_inner }
4961        } else {
4962            let columns = self.parse_parenthesized_column_list(Optional)?;
4963            self.expect_keyword(Keyword::AS)?;
4964            let cte_inner = self.parse_cte_inner()?;
4965            let alias = TableAlias { name, columns };
4966            Cte { alias, cte_inner }
4967        };
4968        Ok(cte)
4969    }
4970
4971    fn parse_cte_inner(&mut self) -> ModalResult<CteInner> {
4972        match self.expect_token(&Token::LParen) {
4973            Ok(()) => {
4974                let query = self.parse_query()?;
4975                self.expect_token(&Token::RParen)?;
4976                Ok(CteInner::Query(Box::new(query)))
4977            }
4978            _ => {
4979                let changelog = self.parse_identifier_non_reserved()?;
4980                if changelog.to_string().to_lowercase() != "changelog" {
4981                    parser_err!("Expected 'changelog' but found '{}'", changelog);
4982                }
4983                self.expect_keyword(Keyword::FROM)?;
4984                Ok(CteInner::ChangeLog(self.parse_object_name()?))
4985            }
4986        }
4987    }
4988
4989    /// Parse a "query body", which is an expression with roughly the
4990    /// following grammar:
4991    /// ```text
4992    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
4993    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
4994    ///   subquery ::= query_body [ order_by_limit ]
4995    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
4996    /// ```
4997    fn parse_query_body(&mut self, precedence: u8) -> ModalResult<SetExpr> {
4998        // We parse the expression using a Pratt parser, as in `parse_expr()`.
4999        // Start by parsing a restricted SELECT or a `(subquery)`:
5000        let mut expr = if self.parse_keyword(Keyword::SELECT) {
5001            SetExpr::Select(Box::new(self.parse_select()?))
5002        } else if self.consume_token(&Token::LParen) {
5003            // CTEs are not allowed here, but the parser currently accepts them
5004            let subquery = self.parse_query()?;
5005            self.expect_token(&Token::RParen)?;
5006            SetExpr::Query(Box::new(subquery))
5007        } else if self.parse_keyword(Keyword::VALUES) {
5008            SetExpr::Values(self.parse_values()?)
5009        } else {
5010            return self.expected("SELECT, VALUES, or a subquery in the query body");
5011        };
5012
5013        loop {
5014            // The query can be optionally followed by a set operator:
5015            let op = self.parse_set_operator(&self.peek_token().token);
5016            let next_precedence = match op {
5017                // UNION and EXCEPT have the same binding power and evaluate left-to-right
5018                Some(SetOperator::Union) | Some(SetOperator::Except) => 10,
5019                // INTERSECT has higher precedence than UNION/EXCEPT
5020                Some(SetOperator::Intersect) => 20,
5021                // Unexpected token or EOF => stop parsing the query body
5022                None => break,
5023            };
5024            if precedence >= next_precedence {
5025                break;
5026            }
5027            self.next_token(); // skip past the set operator
5028
5029            let all = self.parse_keyword(Keyword::ALL);
5030            let corresponding = self.parse_corresponding()?;
5031
5032            expr = SetExpr::SetOperation {
5033                left: Box::new(expr),
5034                op: op.unwrap(),
5035                corresponding,
5036                all,
5037                right: Box::new(self.parse_query_body(next_precedence)?),
5038            };
5039        }
5040
5041        Ok(expr)
5042    }
5043
5044    fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
5045        match token {
5046            Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
5047            Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
5048            Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
5049            _ => None,
5050        }
5051    }
5052
5053    fn parse_corresponding(&mut self) -> ModalResult<Corresponding> {
5054        let corresponding = if self.parse_keyword(Keyword::CORRESPONDING) {
5055            let column_list = if self.parse_keyword(Keyword::BY) {
5056                Some(self.parse_parenthesized_column_list(IsOptional::Mandatory)?)
5057            } else {
5058                None
5059            };
5060            Corresponding::with_column_list(column_list)
5061        } else {
5062            Corresponding::none()
5063        };
5064        Ok(corresponding)
5065    }
5066
5067    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
5068    /// assuming the initial `SELECT` was already consumed
5069    pub fn parse_select(&mut self) -> ModalResult<Select> {
5070        let distinct = self.parse_all_or_distinct_on()?;
5071
5072        let projection = self.parse_comma_separated(Parser::parse_select_item)?;
5073
5074        // Note that for keywords to be properly handled here, they need to be
5075        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
5076        // otherwise they may be parsed as an alias as part of the `projection`
5077        // or `from`.
5078
5079        let from = if self.parse_keyword(Keyword::FROM) {
5080            self.parse_comma_separated(Parser::parse_table_and_joins)?
5081        } else {
5082            vec![]
5083        };
5084        let mut lateral_views = vec![];
5085        loop {
5086            if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
5087                let outer = self.parse_keyword(Keyword::OUTER);
5088                let lateral_view = self.parse_expr()?;
5089                let lateral_view_name = self.parse_object_name()?;
5090                let lateral_col_alias = self
5091                    .parse_comma_separated(|parser| {
5092                        parser.parse_optional_alias(&[
5093                            Keyword::WHERE,
5094                            Keyword::GROUP,
5095                            Keyword::CLUSTER,
5096                            Keyword::HAVING,
5097                            Keyword::LATERAL,
5098                        ]) // This couldn't possibly be a bad idea
5099                    })?
5100                    .into_iter()
5101                    .flatten()
5102                    .collect();
5103
5104                lateral_views.push(LateralView {
5105                    lateral_view,
5106                    lateral_view_name,
5107                    lateral_col_alias,
5108                    outer,
5109                });
5110            } else {
5111                break;
5112            }
5113        }
5114
5115        let selection = if self.parse_keyword(Keyword::WHERE) {
5116            Some(self.parse_expr()?)
5117        } else {
5118            None
5119        };
5120
5121        let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
5122            self.parse_comma_separated(Parser::parse_group_by_expr)?
5123        } else {
5124            vec![]
5125        };
5126
5127        let having = if self.parse_keyword(Keyword::HAVING) {
5128            Some(self.parse_expr()?)
5129        } else {
5130            None
5131        };
5132
5133        let window = if self.parse_keyword(Keyword::WINDOW) {
5134            self.parse_comma_separated(Parser::parse_named_window)?
5135        } else {
5136            vec![]
5137        };
5138
5139        Ok(Select {
5140            distinct,
5141            projection,
5142            from,
5143            lateral_views,
5144            selection,
5145            group_by,
5146            having,
5147            window,
5148        })
5149    }
5150
5151    pub fn parse_set(&mut self) -> ModalResult<Statement> {
5152        let modifier = self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL]);
5153        if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
5154            let value = alt((
5155                Keyword::DEFAULT.value(SetTimeZoneValue::Default),
5156                Keyword::LOCAL.value(SetTimeZoneValue::Local),
5157                preceded(
5158                    Keyword::INTERVAL,
5159                    cut_err(Self::parse_literal_interval.try_map(|e| match e {
5160                        // support a special case for clients which would send when initializing the connection
5161                        // like: SET TIME ZONE INTERVAL '+00:00' HOUR TO MINUTE;
5162                        Expr::Value(v) => match v {
5163                            Value::Interval { value, .. } => {
5164                                if value != "+00:00" {
5165                                    return Err(StrError("only support \"+00:00\" ".into()));
5166                                }
5167                                Ok(SetTimeZoneValue::Ident(Ident::with_quote_unchecked(
5168                                    '\'',
5169                                    "UTC".to_owned(),
5170                                )))
5171                            }
5172                            _ => Err(StrError("expect Value::Interval".into())),
5173                        },
5174                        _ => Err(StrError("expect Expr::Value".into())),
5175                    })),
5176                ),
5177                Self::parse_identifier.map(SetTimeZoneValue::Ident),
5178                Self::ensure_parse_value.map(SetTimeZoneValue::Literal),
5179            ))
5180            .expect("variable")
5181            .parse_next(self)?;
5182
5183            Ok(Statement::SetTimeZone {
5184                local: modifier == Some(Keyword::LOCAL),
5185                value,
5186            })
5187        } else if self.parse_keyword(Keyword::CHARACTERISTICS) && modifier == Some(Keyword::SESSION)
5188        {
5189            self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
5190            Ok(Statement::SetTransaction {
5191                modes: self.parse_transaction_modes()?,
5192                snapshot: None,
5193                session: true,
5194            })
5195        } else if self.parse_keyword(Keyword::TRANSACTION) && modifier.is_none() {
5196            if self.parse_keyword(Keyword::SNAPSHOT) {
5197                let snapshot_id = self.ensure_parse_value()?;
5198                return Ok(Statement::SetTransaction {
5199                    modes: vec![],
5200                    snapshot: Some(snapshot_id),
5201                    session: false,
5202                });
5203            }
5204            Ok(Statement::SetTransaction {
5205                modes: self.parse_transaction_modes()?,
5206                snapshot: None,
5207                session: false,
5208            })
5209        } else {
5210            let config_param = self.parse_config_param()?;
5211            Ok(Statement::SetVariable {
5212                local: modifier == Some(Keyword::LOCAL),
5213                variable: config_param.param,
5214                value: config_param.value,
5215            })
5216        }
5217    }
5218
5219    /// If have `databases`,`tables`,`columns`,`schemas` and `materialized views` after show,
5220    /// return `Statement::ShowCommand` or `Statement::ShowColumn`,
5221    /// otherwise, return `Statement::ShowVariable`.
5222    pub fn parse_show(&mut self) -> ModalResult<Statement> {
5223        let checkpoint = *self;
5224        if let Token::Word(w) = self.next_token().token {
5225            match w.keyword {
5226                Keyword::TABLES => {
5227                    return Ok(Statement::ShowObjects {
5228                        object: ShowObject::Table {
5229                            schema: self.parse_from_and_identifier()?,
5230                        },
5231                        filter: self.parse_show_statement_filter()?,
5232                    });
5233                }
5234                Keyword::INTERNAL => {
5235                    self.expect_keyword(Keyword::TABLES)?;
5236                    return Ok(Statement::ShowObjects {
5237                        object: ShowObject::InternalTable {
5238                            schema: self.parse_from_and_identifier()?,
5239                        },
5240                        filter: self.parse_show_statement_filter()?,
5241                    });
5242                }
5243                Keyword::SOURCES => {
5244                    return Ok(Statement::ShowObjects {
5245                        object: ShowObject::Source {
5246                            schema: self.parse_from_and_identifier()?,
5247                        },
5248                        filter: self.parse_show_statement_filter()?,
5249                    });
5250                }
5251                Keyword::SINKS => {
5252                    return Ok(Statement::ShowObjects {
5253                        object: ShowObject::Sink {
5254                            schema: self.parse_from_and_identifier()?,
5255                        },
5256                        filter: self.parse_show_statement_filter()?,
5257                    });
5258                }
5259                Keyword::SUBSCRIPTIONS => {
5260                    return Ok(Statement::ShowObjects {
5261                        object: ShowObject::Subscription {
5262                            schema: self.parse_from_and_identifier()?,
5263                        },
5264                        filter: self.parse_show_statement_filter()?,
5265                    });
5266                }
5267                Keyword::DATABASES => {
5268                    return Ok(Statement::ShowObjects {
5269                        object: ShowObject::Database,
5270                        filter: self.parse_show_statement_filter()?,
5271                    });
5272                }
5273                Keyword::SCHEMAS => {
5274                    return Ok(Statement::ShowObjects {
5275                        object: ShowObject::Schema,
5276                        filter: self.parse_show_statement_filter()?,
5277                    });
5278                }
5279                Keyword::VIEWS => {
5280                    return Ok(Statement::ShowObjects {
5281                        object: ShowObject::View {
5282                            schema: self.parse_from_and_identifier()?,
5283                        },
5284                        filter: self.parse_show_statement_filter()?,
5285                    });
5286                }
5287                Keyword::MATERIALIZED => {
5288                    if self.parse_keyword(Keyword::VIEWS) {
5289                        return Ok(Statement::ShowObjects {
5290                            object: ShowObject::MaterializedView {
5291                                schema: self.parse_from_and_identifier()?,
5292                            },
5293                            filter: self.parse_show_statement_filter()?,
5294                        });
5295                    } else {
5296                        return self.expected("VIEWS after MATERIALIZED");
5297                    }
5298                }
5299                Keyword::COLUMNS => {
5300                    if self.parse_keyword(Keyword::FROM) {
5301                        return Ok(Statement::ShowObjects {
5302                            object: ShowObject::Columns {
5303                                table: self.parse_object_name()?,
5304                            },
5305                            filter: self.parse_show_statement_filter()?,
5306                        });
5307                    } else {
5308                        return self.expected("from after columns");
5309                    }
5310                }
5311                Keyword::SECRETS => {
5312                    return Ok(Statement::ShowObjects {
5313                        object: ShowObject::Secret {
5314                            schema: self.parse_from_and_identifier()?,
5315                        },
5316                        filter: self.parse_show_statement_filter()?,
5317                    });
5318                }
5319                Keyword::CONNECTIONS => {
5320                    return Ok(Statement::ShowObjects {
5321                        object: ShowObject::Connection {
5322                            schema: self.parse_from_and_identifier()?,
5323                        },
5324                        filter: self.parse_show_statement_filter()?,
5325                    });
5326                }
5327                Keyword::FUNCTIONS => {
5328                    return Ok(Statement::ShowObjects {
5329                        object: ShowObject::Function {
5330                            schema: self.parse_from_and_identifier()?,
5331                        },
5332                        filter: self.parse_show_statement_filter()?,
5333                    });
5334                }
5335                Keyword::INDEXES => {
5336                    if self.parse_keyword(Keyword::FROM) {
5337                        return Ok(Statement::ShowObjects {
5338                            object: ShowObject::Indexes {
5339                                table: self.parse_object_name()?,
5340                            },
5341                            filter: self.parse_show_statement_filter()?,
5342                        });
5343                    } else {
5344                        return self.expected("from after indexes");
5345                    }
5346                }
5347                Keyword::CLUSTER => {
5348                    return Ok(Statement::ShowObjects {
5349                        object: ShowObject::Cluster,
5350                        filter: self.parse_show_statement_filter()?,
5351                    });
5352                }
5353                Keyword::JOBS => {
5354                    return Ok(Statement::ShowObjects {
5355                        object: ShowObject::Jobs,
5356                        filter: self.parse_show_statement_filter()?,
5357                    });
5358                }
5359                Keyword::PROCESSLIST => {
5360                    return Ok(Statement::ShowObjects {
5361                        object: ShowObject::ProcessList,
5362                        filter: self.parse_show_statement_filter()?,
5363                    });
5364                }
5365                Keyword::TRANSACTION => {
5366                    self.expect_keywords(&[Keyword::ISOLATION, Keyword::LEVEL])?;
5367                    return Ok(Statement::ShowTransactionIsolationLevel);
5368                }
5369                Keyword::CURSORS => {
5370                    return Ok(Statement::ShowObjects {
5371                        object: ShowObject::Cursor,
5372                        filter: None,
5373                    });
5374                }
5375                Keyword::SUBSCRIPTION => {
5376                    self.expect_keyword(Keyword::CURSORS)?;
5377                    return Ok(Statement::ShowObjects {
5378                        object: ShowObject::SubscriptionCursor,
5379                        filter: None,
5380                    });
5381                }
5382                _ => {}
5383            }
5384        }
5385        *self = checkpoint;
5386        Ok(Statement::ShowVariable {
5387            variable: self.parse_identifiers()?,
5388        })
5389    }
5390
5391    pub fn parse_cancel_job(&mut self) -> ModalResult<Statement> {
5392        // CANCEL [JOBS|JOB] job_ids
5393        match self.peek_token().token {
5394            Token::Word(w) if Keyword::JOBS == w.keyword || Keyword::JOB == w.keyword => {
5395                self.next_token();
5396            }
5397            _ => return self.expected("JOBS or JOB after CANCEL"),
5398        }
5399
5400        let mut job_ids = vec![];
5401        loop {
5402            job_ids.push(self.parse_literal_u32()?);
5403            if !self.consume_token(&Token::Comma) {
5404                break;
5405            }
5406        }
5407        Ok(Statement::CancelJobs(JobIdents(job_ids)))
5408    }
5409
5410    pub fn parse_kill_process(&mut self) -> ModalResult<Statement> {
5411        let worker_process_id = self.parse_literal_string()?;
5412        Ok(Statement::Kill(worker_process_id))
5413    }
5414
5415    /// Parser `from schema` after `show tables` and `show materialized views`, if not conclude
5416    /// `from` then use default schema name.
5417    pub fn parse_from_and_identifier(&mut self) -> ModalResult<Option<Ident>> {
5418        if self.parse_keyword(Keyword::FROM) {
5419            Ok(Some(self.parse_identifier_non_reserved()?))
5420        } else {
5421            Ok(None)
5422        }
5423    }
5424
5425    /// Parse object type and name after `show create`.
5426    pub fn parse_show_create(&mut self) -> ModalResult<Statement> {
5427        if let Token::Word(w) = self.next_token().token {
5428            let show_type = match w.keyword {
5429                Keyword::TABLE => ShowCreateType::Table,
5430                Keyword::MATERIALIZED => {
5431                    if self.parse_keyword(Keyword::VIEW) {
5432                        ShowCreateType::MaterializedView
5433                    } else {
5434                        return self.expected("VIEW after MATERIALIZED");
5435                    }
5436                }
5437                Keyword::VIEW => ShowCreateType::View,
5438                Keyword::INDEX => ShowCreateType::Index,
5439                Keyword::SOURCE => ShowCreateType::Source,
5440                Keyword::SINK => ShowCreateType::Sink,
5441                Keyword::SUBSCRIPTION => ShowCreateType::Subscription,
5442                Keyword::FUNCTION => ShowCreateType::Function,
5443                _ => return self.expected(
5444                    "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5445                ),
5446            };
5447            return Ok(Statement::ShowCreateObject {
5448                create_type: show_type,
5449                name: self.parse_object_name()?,
5450            });
5451        }
5452        self.expected(
5453            "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5454        )
5455    }
5456
5457    pub fn parse_show_statement_filter(&mut self) -> ModalResult<Option<ShowStatementFilter>> {
5458        if self.parse_keyword(Keyword::LIKE) {
5459            Ok(Some(ShowStatementFilter::Like(
5460                self.parse_literal_string()?,
5461            )))
5462        } else if self.parse_keyword(Keyword::ILIKE) {
5463            Ok(Some(ShowStatementFilter::ILike(
5464                self.parse_literal_string()?,
5465            )))
5466        } else if self.parse_keyword(Keyword::WHERE) {
5467            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
5468        } else {
5469            Ok(None)
5470        }
5471    }
5472
5473    pub fn parse_table_and_joins(&mut self) -> ModalResult<TableWithJoins> {
5474        let relation = self.parse_table_factor()?;
5475
5476        // Note that for keywords to be properly handled here, they need to be
5477        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
5478        // a table alias.
5479        let mut joins = vec![];
5480        loop {
5481            let join = if self.parse_keyword(Keyword::CROSS) {
5482                let join_operator = if self.parse_keyword(Keyword::JOIN) {
5483                    JoinOperator::CrossJoin
5484                } else {
5485                    return self.expected("JOIN after CROSS");
5486                };
5487                Join {
5488                    relation: self.parse_table_factor()?,
5489                    join_operator,
5490                }
5491            } else {
5492                let (natural, asof) =
5493                    match self.parse_one_of_keywords(&[Keyword::NATURAL, Keyword::ASOF]) {
5494                        Some(Keyword::NATURAL) => (true, false),
5495                        Some(Keyword::ASOF) => (false, true),
5496                        Some(_) => unreachable!(),
5497                        None => (false, false),
5498                    };
5499                let peek_keyword = if let Token::Word(w) = self.peek_token().token {
5500                    w.keyword
5501                } else {
5502                    Keyword::NoKeyword
5503                };
5504
5505                let join_operator_type = match peek_keyword {
5506                    Keyword::INNER | Keyword::JOIN => {
5507                        let _ = self.parse_keyword(Keyword::INNER);
5508                        self.expect_keyword(Keyword::JOIN)?;
5509                        if asof {
5510                            JoinOperator::AsOfInner
5511                        } else {
5512                            JoinOperator::Inner
5513                        }
5514                    }
5515                    kw @ Keyword::LEFT | kw @ Keyword::RIGHT | kw @ Keyword::FULL => {
5516                        let checkpoint = *self;
5517                        let _ = self.next_token();
5518                        let _ = self.parse_keyword(Keyword::OUTER);
5519                        self.expect_keyword(Keyword::JOIN)?;
5520                        if asof {
5521                            if Keyword::LEFT == kw {
5522                                JoinOperator::AsOfLeft
5523                            } else {
5524                                return self.expected_at(
5525                                    checkpoint,
5526                                    "LEFT after ASOF. RIGHT or FULL are not supported",
5527                                );
5528                            }
5529                        } else {
5530                            match kw {
5531                                Keyword::LEFT => JoinOperator::LeftOuter,
5532                                Keyword::RIGHT => JoinOperator::RightOuter,
5533                                Keyword::FULL => JoinOperator::FullOuter,
5534                                _ => unreachable!(),
5535                            }
5536                        }
5537                    }
5538                    Keyword::OUTER => {
5539                        return self.expected("LEFT, RIGHT, or FULL");
5540                    }
5541                    _ if natural => {
5542                        return self.expected("a join type after NATURAL");
5543                    }
5544                    _ if asof => {
5545                        return self.expected("a join type after ASOF");
5546                    }
5547                    _ => break,
5548                };
5549                let relation = self.parse_table_factor()?;
5550                let join_constraint = self.parse_join_constraint(natural)?;
5551                let join_operator = join_operator_type(join_constraint);
5552                let need_constraint = match join_operator {
5553                    JoinOperator::Inner(JoinConstraint::None) => Some("INNER JOIN"),
5554                    JoinOperator::AsOfInner(JoinConstraint::None) => Some("ASOF INNER JOIN"),
5555                    JoinOperator::AsOfLeft(JoinConstraint::None) => Some("ASOF LEFT JOIN"),
5556                    _ => None,
5557                };
5558                if let Some(join_type) = need_constraint {
5559                    return self.expected(&format!("join constraint after {join_type}"));
5560                }
5561
5562                Join {
5563                    relation,
5564                    join_operator,
5565                }
5566            };
5567            joins.push(join);
5568        }
5569        Ok(TableWithJoins { relation, joins })
5570    }
5571
5572    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
5573    pub fn parse_table_factor(&mut self) -> ModalResult<TableFactor> {
5574        if self.parse_keyword(Keyword::LATERAL) {
5575            // LATERAL must always be followed by a subquery.
5576            if !self.consume_token(&Token::LParen) {
5577                self.expected("subquery after LATERAL")?;
5578            }
5579            self.parse_derived_table_factor(Lateral)
5580        } else if self.consume_token(&Token::LParen) {
5581            // A left paren introduces either a derived table (i.e., a subquery)
5582            // or a nested join. It's nearly impossible to determine ahead of
5583            // time which it is... so we just try to parse both.
5584            //
5585            // Here's an example that demonstrates the complexity:
5586            //                     /-------------------------------------------------------\
5587            //                     | /-----------------------------------\                 |
5588            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
5589            //                   ^ ^ ^ ^
5590            //                   | | | |
5591            //                   | | | |
5592            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
5593            //                   | | (3) starts a derived table (subquery)
5594            //                   | (2) starts a nested join
5595            //                   (1) an additional set of parens around a nested join
5596            //
5597
5598            // It can only be a subquery. We don't use `maybe_parse` so that a meaningful error can
5599            // be returned.
5600            match self.peek_token().token {
5601                Token::Word(w)
5602                    if [Keyword::SELECT, Keyword::WITH, Keyword::VALUES].contains(&w.keyword) =>
5603                {
5604                    return self.parse_derived_table_factor(NotLateral);
5605                }
5606                _ => {}
5607            };
5608            // It can still be a subquery, e.g., the case (3) in the example above:
5609            // (SELECT 1) UNION (SELECT 2)
5610            // TODO: how to produce a good error message here?
5611            if self.peek_token() == Token::LParen {
5612                return_ok_if_some!(
5613                    self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))
5614                );
5615            }
5616
5617            // A parsing error from `parse_derived_table_factor` indicates that the '(' we've
5618            // recently consumed does not start a derived table (cases 1, 2, or 4).
5619            // `maybe_parse` will ignore such an error and rewind to be after the opening '('.
5620
5621            // Inside the parentheses we expect to find an (A) table factor
5622            // followed by some joins or (B) another level of nesting.
5623            let table_and_joins = self.parse_table_and_joins()?;
5624
5625            if !table_and_joins.joins.is_empty() {
5626                self.expect_token(&Token::RParen)?;
5627                Ok(TableFactor::NestedJoin(Box::new(table_and_joins))) // (A)
5628            } else if let TableFactor::NestedJoin(_) = &table_and_joins.relation {
5629                // (B): `table_and_joins` (what we found inside the parentheses)
5630                // is a nested join `(foo JOIN bar)`, not followed by other joins.
5631                self.expect_token(&Token::RParen)?;
5632                Ok(TableFactor::NestedJoin(Box::new(table_and_joins)))
5633            } else {
5634                // The SQL spec prohibits derived tables and bare tables from
5635                // appearing alone in parentheses (e.g. `FROM (mytable)`)
5636                parser_err!(
5637                    "Expected joined table, found: {table_and_joins}, next_token: {}",
5638                    self.peek_token()
5639                );
5640            }
5641        } else {
5642            let name = self.parse_object_name()?;
5643            if self.peek_token() == Token::LParen {
5644                // table-valued function
5645
5646                let arg_list = self.parse_argument_list()?;
5647                if arg_list.distinct {
5648                    parser_err!("DISTINCT is not supported in table-valued function calls");
5649                }
5650                if !arg_list.order_by.is_empty() {
5651                    parser_err!("ORDER BY is not supported in table-valued function calls");
5652                }
5653                if arg_list.ignore_nulls {
5654                    parser_err!("IGNORE NULLS is not supported in table-valued function calls");
5655                }
5656
5657                let args = arg_list.args;
5658                let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
5659                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5660
5661                Ok(TableFactor::TableFunction {
5662                    name,
5663                    alias,
5664                    args,
5665                    with_ordinality,
5666                })
5667            } else {
5668                let as_of = opt(Self::parse_as_of).parse_next(self)?;
5669                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5670                Ok(TableFactor::Table { name, alias, as_of })
5671            }
5672        }
5673    }
5674
5675    pub fn parse_derived_table_factor(&mut self, lateral: IsLateral) -> ModalResult<TableFactor> {
5676        let subquery = Box::new(self.parse_query()?);
5677        self.expect_token(&Token::RParen)?;
5678        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5679        Ok(TableFactor::Derived {
5680            lateral: match lateral {
5681                Lateral => true,
5682                NotLateral => false,
5683            },
5684            subquery,
5685            alias,
5686        })
5687    }
5688
5689    fn parse_join_constraint(&mut self, natural: bool) -> ModalResult<JoinConstraint> {
5690        if natural {
5691            Ok(JoinConstraint::Natural)
5692        } else if self.parse_keyword(Keyword::ON) {
5693            let constraint = self.parse_expr()?;
5694            Ok(JoinConstraint::On(constraint))
5695        } else if self.parse_keyword(Keyword::USING) {
5696            let columns = self.parse_parenthesized_column_list(Mandatory)?;
5697            Ok(JoinConstraint::Using(columns))
5698        } else {
5699            Ok(JoinConstraint::None)
5700            // self.expected("ON, or USING after JOIN")
5701        }
5702    }
5703
5704    /// Parse a GRANT statement.
5705    pub fn parse_grant(&mut self) -> ModalResult<Statement> {
5706        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5707
5708        self.expect_keyword(Keyword::TO)?;
5709        let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5710
5711        let with_grant_option =
5712            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
5713
5714        let granted_by = self
5715            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5716            .then(|| self.parse_identifier().unwrap());
5717
5718        Ok(Statement::Grant {
5719            privileges,
5720            objects,
5721            grantees,
5722            with_grant_option,
5723            granted_by,
5724        })
5725    }
5726
5727    fn parse_privileges(&mut self) -> ModalResult<Privileges> {
5728        let privileges = if self.parse_keyword(Keyword::ALL) {
5729            Privileges::All {
5730                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
5731            }
5732        } else {
5733            Privileges::Actions(
5734                self.parse_comma_separated(Parser::parse_grant_permission)?
5735                    .into_iter()
5736                    .map(|(kw, columns)| match kw {
5737                        Keyword::CONNECT => Action::Connect,
5738                        Keyword::CREATE => Action::Create,
5739                        Keyword::DELETE => Action::Delete,
5740                        Keyword::EXECUTE => Action::Execute,
5741                        Keyword::INSERT => Action::Insert { columns },
5742                        Keyword::REFERENCES => Action::References { columns },
5743                        Keyword::SELECT => Action::Select { columns },
5744                        Keyword::TEMPORARY => Action::Temporary,
5745                        Keyword::TRIGGER => Action::Trigger,
5746                        Keyword::TRUNCATE => Action::Truncate,
5747                        Keyword::UPDATE => Action::Update { columns },
5748                        Keyword::USAGE => Action::Usage,
5749                        _ => unreachable!(),
5750                    })
5751                    .collect(),
5752            )
5753        };
5754
5755        Ok(privileges)
5756    }
5757
5758    fn parse_grant_revoke_privileges_objects(&mut self) -> ModalResult<(Privileges, GrantObjects)> {
5759        let privileges = self.parse_privileges()?;
5760
5761        self.expect_keyword(Keyword::ON)?;
5762
5763        let objects = if self.parse_keywords(&[
5764            Keyword::ALL,
5765            Keyword::TABLES,
5766            Keyword::IN,
5767            Keyword::SCHEMA,
5768        ]) {
5769            GrantObjects::AllTablesInSchema {
5770                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5771            }
5772        } else if self.parse_keywords(&[
5773            Keyword::ALL,
5774            Keyword::SEQUENCES,
5775            Keyword::IN,
5776            Keyword::SCHEMA,
5777        ]) {
5778            GrantObjects::AllSequencesInSchema {
5779                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5780            }
5781        } else if self.parse_keywords(&[
5782            Keyword::ALL,
5783            Keyword::SOURCES,
5784            Keyword::IN,
5785            Keyword::SCHEMA,
5786        ]) {
5787            GrantObjects::AllSourcesInSchema {
5788                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5789            }
5790        } else if self.parse_keywords(&[Keyword::ALL, Keyword::SINKS, Keyword::IN, Keyword::SCHEMA])
5791        {
5792            GrantObjects::AllSinksInSchema {
5793                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5794            }
5795        } else if self.parse_keywords(&[
5796            Keyword::ALL,
5797            Keyword::MATERIALIZED,
5798            Keyword::VIEWS,
5799            Keyword::IN,
5800            Keyword::SCHEMA,
5801        ]) {
5802            GrantObjects::AllMviewsInSchema {
5803                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5804            }
5805        } else if self.parse_keywords(&[Keyword::ALL, Keyword::VIEWS, Keyword::IN, Keyword::SCHEMA])
5806        {
5807            GrantObjects::AllViewsInSchema {
5808                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5809            }
5810        } else if self.parse_keywords(&[
5811            Keyword::ALL,
5812            Keyword::FUNCTIONS,
5813            Keyword::IN,
5814            Keyword::SCHEMA,
5815        ]) {
5816            GrantObjects::AllFunctionsInSchema {
5817                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5818            }
5819        } else if self.parse_keywords(&[
5820            Keyword::ALL,
5821            Keyword::SECRETS,
5822            Keyword::IN,
5823            Keyword::SCHEMA,
5824        ]) {
5825            GrantObjects::AllSecretsInSchema {
5826                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5827            }
5828        } else if self.parse_keywords(&[
5829            Keyword::ALL,
5830            Keyword::CONNECTIONS,
5831            Keyword::IN,
5832            Keyword::SCHEMA,
5833        ]) {
5834            GrantObjects::AllConnectionsInSchema {
5835                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5836            }
5837        } else if self.parse_keywords(&[
5838            Keyword::ALL,
5839            Keyword::SUBSCRIPTIONS,
5840            Keyword::IN,
5841            Keyword::SCHEMA,
5842        ]) {
5843            GrantObjects::AllSubscriptionsInSchema {
5844                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5845            }
5846        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
5847            GrantObjects::Mviews(self.parse_comma_separated(Parser::parse_object_name)?)
5848        } else {
5849            let object_type = self.parse_one_of_keywords(&[
5850                Keyword::SEQUENCE,
5851                Keyword::DATABASE,
5852                Keyword::SCHEMA,
5853                Keyword::TABLE,
5854                Keyword::SOURCE,
5855                Keyword::SINK,
5856                Keyword::VIEW,
5857                Keyword::SUBSCRIPTION,
5858                Keyword::FUNCTION,
5859                Keyword::CONNECTION,
5860                Keyword::SECRET,
5861            ]);
5862            if let Some(Keyword::FUNCTION) = object_type {
5863                let func_descs = self.parse_comma_separated(Parser::parse_function_desc)?;
5864                GrantObjects::Functions(func_descs)
5865            } else {
5866                let objects = self.parse_comma_separated(Parser::parse_object_name);
5867                match object_type {
5868                    Some(Keyword::DATABASE) => GrantObjects::Databases(objects?),
5869                    Some(Keyword::SCHEMA) => GrantObjects::Schemas(objects?),
5870                    Some(Keyword::SEQUENCE) => GrantObjects::Sequences(objects?),
5871                    Some(Keyword::SOURCE) => GrantObjects::Sources(objects?),
5872                    Some(Keyword::SINK) => GrantObjects::Sinks(objects?),
5873                    Some(Keyword::VIEW) => GrantObjects::Views(objects?),
5874                    Some(Keyword::SUBSCRIPTION) => GrantObjects::Subscriptions(objects?),
5875                    Some(Keyword::CONNECTION) => GrantObjects::Connections(objects?),
5876                    Some(Keyword::SECRET) => GrantObjects::Secrets(objects?),
5877                    Some(Keyword::TABLE) | None => GrantObjects::Tables(objects?),
5878                    _ => unreachable!(),
5879                }
5880            }
5881        };
5882
5883        Ok((privileges, objects))
5884    }
5885
5886    fn parse_grant_permission(&mut self) -> ModalResult<(Keyword, Option<Vec<Ident>>)> {
5887        let kw = self.expect_one_of_keywords(&[
5888            Keyword::CONNECT,
5889            Keyword::CREATE,
5890            Keyword::DELETE,
5891            Keyword::EXECUTE,
5892            Keyword::INSERT,
5893            Keyword::REFERENCES,
5894            Keyword::SELECT,
5895            Keyword::TEMPORARY,
5896            Keyword::TRIGGER,
5897            Keyword::TRUNCATE,
5898            Keyword::UPDATE,
5899            Keyword::USAGE,
5900        ])?;
5901        let columns = match kw {
5902            Keyword::INSERT | Keyword::REFERENCES | Keyword::SELECT | Keyword::UPDATE => {
5903                let columns = self.parse_parenthesized_column_list(Optional)?;
5904                if columns.is_empty() {
5905                    None
5906                } else {
5907                    Some(columns)
5908                }
5909            }
5910            _ => None,
5911        };
5912        Ok((kw, columns))
5913    }
5914
5915    /// Parse a REVOKE statement
5916    pub fn parse_revoke(&mut self) -> ModalResult<Statement> {
5917        let revoke_grant_option =
5918            self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
5919        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5920
5921        self.expect_keyword(Keyword::FROM)?;
5922        let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5923
5924        let granted_by = self
5925            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5926            .then(|| self.parse_identifier().unwrap());
5927
5928        let cascade = self.parse_keyword(Keyword::CASCADE);
5929        let restrict = self.parse_keyword(Keyword::RESTRICT);
5930        if cascade && restrict {
5931            parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE");
5932        }
5933
5934        Ok(Statement::Revoke {
5935            privileges,
5936            objects,
5937            grantees,
5938            granted_by,
5939            revoke_grant_option,
5940            cascade,
5941        })
5942    }
5943
5944    fn parse_privilege_object_types(&mut self) -> ModalResult<PrivilegeObjectType> {
5945        let object_type = if self.parse_keyword(Keyword::TABLES) {
5946            PrivilegeObjectType::Tables
5947        } else if self.parse_keyword(Keyword::SOURCES) {
5948            PrivilegeObjectType::Sources
5949        } else if self.parse_keyword(Keyword::SINKS) {
5950            PrivilegeObjectType::Sinks
5951        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
5952            PrivilegeObjectType::Mviews
5953        } else if self.parse_keyword(Keyword::VIEWS) {
5954            PrivilegeObjectType::Views
5955        } else if self.parse_keyword(Keyword::FUNCTIONS) {
5956            PrivilegeObjectType::Functions
5957        } else if self.parse_keyword(Keyword::SECRETS) {
5958            PrivilegeObjectType::Secrets
5959        } else if self.parse_keyword(Keyword::CONNECTIONS) {
5960            PrivilegeObjectType::Connections
5961        } else if self.parse_keyword(Keyword::SUBSCRIPTIONS) {
5962            PrivilegeObjectType::Subscriptions
5963        } else if self.parse_keyword(Keyword::SCHEMAS) {
5964            PrivilegeObjectType::Schemas
5965        } else {
5966            return self.expected("TABLES, SOURCES, SINKS, MATERIALIZED VIEWS, VIEWS, FUNCTIONS, SECRETS, CONNECTIONS, SUBSCRIPTIONS or SCHEMAS");
5967        };
5968
5969        Ok(object_type)
5970    }
5971
5972    pub fn parse_alter_default_privileges(&mut self) -> ModalResult<Statement> {
5973        // [ FOR USER target_user [, ...] ]
5974        let target_users = if self.parse_keyword(Keyword::FOR) {
5975            self.expect_keyword(Keyword::USER)?;
5976            Some(self.parse_comma_separated(Parser::parse_identifier)?)
5977        } else {
5978            None
5979        };
5980
5981        // [ IN SCHEMA schema_name [, ...] ]
5982        let schema_names = if self.parse_keywords(&[Keyword::IN, Keyword::SCHEMA]) {
5983            Some(self.parse_comma_separated(Parser::parse_object_name)?)
5984        } else {
5985            None
5986        };
5987        let keyword = self.expect_one_of_keywords(&[Keyword::GRANT, Keyword::REVOKE])?;
5988        let for_grant = keyword == Keyword::GRANT;
5989        if for_grant {
5990            let privileges = self.parse_privileges()?;
5991            self.expect_keyword(Keyword::ON)?;
5992            let object_type = self.parse_privilege_object_types()?;
5993            if schema_names.is_some() && object_type == PrivilegeObjectType::Schemas {
5994                parser_err!("cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS");
5995            }
5996            self.expect_keyword(Keyword::TO)?;
5997            let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5998
5999            let with_grant_option =
6000                self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
6001
6002            Ok(Statement::AlterDefaultPrivileges {
6003                target_users,
6004                schema_names,
6005                operation: DefaultPrivilegeOperation::Grant {
6006                    privileges,
6007                    object_type,
6008                    grantees,
6009                    with_grant_option,
6010                },
6011            })
6012        } else {
6013            let revoke_grant_option =
6014                self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
6015            let privileges = self.parse_privileges()?;
6016            self.expect_keyword(Keyword::ON)?;
6017            let object_type = self.parse_privilege_object_types()?;
6018            if schema_names.is_some() && object_type == PrivilegeObjectType::Schemas {
6019                parser_err!("cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS");
6020            }
6021            self.expect_keyword(Keyword::FROM)?;
6022            let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
6023            let cascade = self.parse_keyword(Keyword::CASCADE);
6024            let restrict = self.parse_keyword(Keyword::RESTRICT);
6025            if cascade && restrict {
6026                parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE");
6027            }
6028
6029            Ok(Statement::AlterDefaultPrivileges {
6030                target_users,
6031                schema_names,
6032                operation: DefaultPrivilegeOperation::Revoke {
6033                    privileges,
6034                    object_type,
6035                    grantees,
6036                    revoke_grant_option,
6037                    cascade,
6038                },
6039            })
6040        }
6041    }
6042
6043    /// Parse an INSERT statement
6044    pub fn parse_insert(&mut self) -> ModalResult<Statement> {
6045        self.expect_keyword(Keyword::INTO)?;
6046
6047        let table_name = self.parse_object_name()?;
6048        let columns = self.parse_parenthesized_column_list(Optional)?;
6049
6050        let source = Box::new(self.parse_query()?);
6051        let returning = self.parse_returning(Optional)?;
6052        Ok(Statement::Insert {
6053            table_name,
6054            columns,
6055            source,
6056            returning,
6057        })
6058    }
6059
6060    pub fn parse_update(&mut self) -> ModalResult<Statement> {
6061        let table_name = self.parse_object_name()?;
6062
6063        self.expect_keyword(Keyword::SET)?;
6064        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
6065        let selection = if self.parse_keyword(Keyword::WHERE) {
6066            Some(self.parse_expr()?)
6067        } else {
6068            None
6069        };
6070        let returning = self.parse_returning(Optional)?;
6071        Ok(Statement::Update {
6072            table_name,
6073            assignments,
6074            selection,
6075            returning,
6076        })
6077    }
6078
6079    /// Parse a `var = expr` assignment, used in an UPDATE statement
6080    pub fn parse_assignment(&mut self) -> ModalResult<Assignment> {
6081        let id = self.parse_identifiers_non_keywords()?;
6082        self.expect_token(&Token::Eq)?;
6083
6084        let value = if self.parse_keyword(Keyword::DEFAULT) {
6085            AssignmentValue::Default
6086        } else {
6087            AssignmentValue::Expr(self.parse_expr()?)
6088        };
6089
6090        Ok(Assignment { id, value })
6091    }
6092
6093    /// Parse a `[VARIADIC] name => expr`.
6094    fn parse_function_args(&mut self) -> ModalResult<(bool, FunctionArg)> {
6095        let variadic = self.parse_keyword(Keyword::VARIADIC);
6096        let arg = if self.peek_nth_token(1) == Token::RArrow {
6097            let name = self.parse_identifier()?;
6098
6099            self.expect_token(&Token::RArrow)?;
6100            let arg = if self.parse_keyword(Keyword::SECRET) {
6101                FunctionArgExpr::SecretRef(self.parse_secret_ref()?)
6102            } else {
6103                self.parse_wildcard_or_expr()?.into()
6104            };
6105
6106            FunctionArg::Named { name, arg }
6107        } else if self.parse_keyword(Keyword::SECRET) {
6108            FunctionArg::Unnamed(FunctionArgExpr::SecretRef(self.parse_secret_ref()?))
6109        } else {
6110            FunctionArg::Unnamed(self.parse_wildcard_or_expr()?.into())
6111        };
6112        Ok((variadic, arg))
6113    }
6114
6115    pub fn parse_argument_list(&mut self) -> ModalResult<FunctionArgList> {
6116        self.expect_token(&Token::LParen)?;
6117        if self.consume_token(&Token::RParen) {
6118            Ok(FunctionArgList::empty())
6119        } else {
6120            let distinct = self.parse_all_or_distinct()?;
6121            let args = self.parse_comma_separated(Parser::parse_function_args)?;
6122            if args
6123                .iter()
6124                .take(args.len() - 1)
6125                .any(|(variadic, _)| *variadic)
6126            {
6127                parser_err!("VARIADIC argument must be the last");
6128            }
6129            let variadic = args.last().map(|(variadic, _)| *variadic).unwrap_or(false);
6130            let args = args.into_iter().map(|(_, arg)| arg).collect();
6131
6132            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6133                self.parse_comma_separated(Parser::parse_order_by_expr)?
6134            } else {
6135                vec![]
6136            };
6137
6138            let ignore_nulls = self.parse_keywords(&[Keyword::IGNORE, Keyword::NULLS]);
6139
6140            let arg_list = FunctionArgList {
6141                distinct,
6142                args,
6143                variadic,
6144                order_by,
6145                ignore_nulls,
6146            };
6147
6148            self.expect_token(&Token::RParen)?;
6149            Ok(arg_list)
6150        }
6151    }
6152
6153    /// Parse a comma-delimited list of projections after SELECT
6154    pub fn parse_select_item(&mut self) -> ModalResult<SelectItem> {
6155        match self.parse_wildcard_or_expr()? {
6156            WildcardOrExpr::Expr(expr) => self
6157                .parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
6158                .map(|alias| match alias {
6159                    Some(alias) => SelectItem::ExprWithAlias { expr, alias },
6160                    None => SelectItem::UnnamedExpr(expr),
6161                }),
6162            WildcardOrExpr::QualifiedWildcard(prefix, except) => {
6163                Ok(SelectItem::QualifiedWildcard(prefix, except))
6164            }
6165            WildcardOrExpr::ExprQualifiedWildcard(expr, prefix) => {
6166                Ok(SelectItem::ExprQualifiedWildcard(expr, prefix))
6167            }
6168            WildcardOrExpr::Wildcard(except) => Ok(SelectItem::Wildcard(except)),
6169        }
6170    }
6171
6172    /// Parse an expression, optionally followed by ASC or DESC (used in ORDER BY)
6173    pub fn parse_order_by_expr(&mut self) -> ModalResult<OrderByExpr> {
6174        let expr = self.parse_expr()?;
6175
6176        let asc = if self.parse_keyword(Keyword::ASC) {
6177            Some(true)
6178        } else if self.parse_keyword(Keyword::DESC) {
6179            Some(false)
6180        } else {
6181            None
6182        };
6183
6184        let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
6185            Some(true)
6186        } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
6187            Some(false)
6188        } else {
6189            None
6190        };
6191
6192        Ok(OrderByExpr {
6193            expr,
6194            asc,
6195            nulls_first,
6196        })
6197    }
6198
6199    /// Parse a LIMIT clause
6200    pub fn parse_limit(&mut self) -> ModalResult<Option<Expr>> {
6201        if self.parse_keyword(Keyword::ALL) {
6202            Ok(None)
6203        } else {
6204            let expr = self.parse_expr()?;
6205            Ok(Some(expr))
6206        }
6207    }
6208
6209    /// Parse an OFFSET clause
6210    pub fn parse_offset(&mut self) -> ModalResult<String> {
6211        let value = self.parse_number_value()?;
6212        // TODO(Kexiang): support LIMIT expr
6213        if self.consume_token(&Token::DoubleColon) {
6214            self.expect_keyword(Keyword::BIGINT)?;
6215        }
6216        _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
6217        Ok(value)
6218    }
6219
6220    /// Parse a FETCH clause
6221    pub fn parse_fetch(&mut self) -> ModalResult<Fetch> {
6222        self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
6223        let quantity = if self
6224            .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
6225            .is_some()
6226        {
6227            None
6228        } else {
6229            let quantity = self.parse_number_value()?;
6230            self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
6231            Some(quantity)
6232        };
6233        let with_ties = if self.parse_keyword(Keyword::ONLY) {
6234            false
6235        } else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
6236            true
6237        } else {
6238            return self.expected("one of ONLY or WITH TIES");
6239        };
6240        Ok(Fetch {
6241            with_ties,
6242            quantity,
6243        })
6244    }
6245
6246    pub fn parse_values(&mut self) -> ModalResult<Values> {
6247        let values = self.parse_comma_separated(|parser| {
6248            parser.expect_token(&Token::LParen)?;
6249            let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
6250            parser.expect_token(&Token::RParen)?;
6251            Ok(exprs)
6252        })?;
6253        Ok(Values(values))
6254    }
6255
6256    pub fn parse_start_transaction(&mut self) -> ModalResult<Statement> {
6257        self.expect_keyword(Keyword::TRANSACTION)?;
6258        Ok(Statement::StartTransaction {
6259            modes: self.parse_transaction_modes()?,
6260        })
6261    }
6262
6263    pub fn parse_begin(&mut self) -> ModalResult<Statement> {
6264        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
6265        Ok(Statement::Begin {
6266            modes: self.parse_transaction_modes()?,
6267        })
6268    }
6269
6270    pub fn parse_transaction_modes(&mut self) -> ModalResult<Vec<TransactionMode>> {
6271        let mut modes = vec![];
6272        let mut required = false;
6273        loop {
6274            let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
6275                let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
6276                    TransactionIsolationLevel::ReadUncommitted
6277                } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
6278                    TransactionIsolationLevel::ReadCommitted
6279                } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
6280                    TransactionIsolationLevel::RepeatableRead
6281                } else if self.parse_keyword(Keyword::SERIALIZABLE) {
6282                    TransactionIsolationLevel::Serializable
6283                } else {
6284                    self.expected("isolation level")?
6285                };
6286                TransactionMode::IsolationLevel(iso_level)
6287            } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
6288                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
6289            } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
6290                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
6291            } else if required {
6292                self.expected("transaction mode")?
6293            } else {
6294                break;
6295            };
6296            modes.push(mode);
6297            // ANSI requires a comma after each transaction mode, but
6298            // PostgreSQL, for historical reasons, does not. We follow
6299            // PostgreSQL in making the comma optional, since that is strictly
6300            // more general.
6301            required = self.consume_token(&Token::Comma);
6302        }
6303        Ok(modes)
6304    }
6305
6306    pub fn parse_commit(&mut self) -> ModalResult<Statement> {
6307        Ok(Statement::Commit {
6308            chain: self.parse_commit_rollback_chain()?,
6309        })
6310    }
6311
6312    pub fn parse_rollback(&mut self) -> ModalResult<Statement> {
6313        Ok(Statement::Rollback {
6314            chain: self.parse_commit_rollback_chain()?,
6315        })
6316    }
6317
6318    pub fn parse_commit_rollback_chain(&mut self) -> ModalResult<bool> {
6319        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
6320        if self.parse_keyword(Keyword::AND) {
6321            let chain = !self.parse_keyword(Keyword::NO);
6322            self.expect_keyword(Keyword::CHAIN)?;
6323            Ok(chain)
6324        } else {
6325            Ok(false)
6326        }
6327    }
6328
6329    fn parse_deallocate(&mut self) -> ModalResult<Statement> {
6330        let prepare = self.parse_keyword(Keyword::PREPARE);
6331        let name = if self.parse_keyword(Keyword::ALL) {
6332            None
6333        } else {
6334            Some(self.parse_identifier()?)
6335        };
6336        Ok(Statement::Deallocate { name, prepare })
6337    }
6338
6339    fn parse_execute(&mut self) -> ModalResult<Statement> {
6340        let name = self.parse_identifier()?;
6341
6342        let mut parameters = vec![];
6343        if self.consume_token(&Token::LParen) {
6344            parameters = self.parse_comma_separated(Parser::parse_expr)?;
6345            self.expect_token(&Token::RParen)?;
6346        }
6347
6348        Ok(Statement::Execute { name, parameters })
6349    }
6350
6351    fn parse_prepare(&mut self) -> ModalResult<Statement> {
6352        let name = self.parse_identifier()?;
6353
6354        let mut data_types = vec![];
6355        if self.consume_token(&Token::LParen) {
6356            data_types = self.parse_comma_separated(Parser::parse_data_type)?;
6357            self.expect_token(&Token::RParen)?;
6358        }
6359
6360        self.expect_keyword(Keyword::AS)?;
6361        let statement = Box::new(self.parse_statement()?);
6362        Ok(Statement::Prepare {
6363            name,
6364            data_types,
6365            statement,
6366        })
6367    }
6368
6369    fn parse_comment(&mut self) -> ModalResult<Statement> {
6370        self.expect_keyword(Keyword::ON)?;
6371        let checkpoint = *self;
6372        let token = self.next_token();
6373
6374        let (object_type, object_name) = match token.token {
6375            Token::Word(w) if w.keyword == Keyword::COLUMN => {
6376                let object_name = self.parse_object_name()?;
6377                (CommentObject::Column, object_name)
6378            }
6379            Token::Word(w) if w.keyword == Keyword::TABLE => {
6380                let object_name = self.parse_object_name()?;
6381                (CommentObject::Table, object_name)
6382            }
6383            _ => self.expected_at(checkpoint, "comment object_type")?,
6384        };
6385
6386        self.expect_keyword(Keyword::IS)?;
6387        let comment = if self.parse_keyword(Keyword::NULL) {
6388            None
6389        } else {
6390            Some(self.parse_literal_string()?)
6391        };
6392        Ok(Statement::Comment {
6393            object_type,
6394            object_name,
6395            comment,
6396        })
6397    }
6398
6399    fn parse_use(&mut self) -> ModalResult<Statement> {
6400        let db_name = self.parse_object_name()?;
6401        Ok(Statement::Use { db_name })
6402    }
6403
6404    /// Parse a named window definition for the WINDOW clause
6405    pub fn parse_named_window(&mut self) -> ModalResult<NamedWindow> {
6406        let name = self.parse_identifier()?;
6407        self.expect_keywords(&[Keyword::AS])?;
6408        self.expect_token(&Token::LParen)?;
6409        let window_spec = self.parse_window_spec()?;
6410        self.expect_token(&Token::RParen)?;
6411        Ok(NamedWindow { name, window_spec })
6412    }
6413
6414    /// Parse a window specification (contents of OVER clause or WINDOW clause)
6415    pub fn parse_window_spec(&mut self) -> ModalResult<WindowSpec> {
6416        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
6417            self.parse_comma_separated(Parser::parse_expr)?
6418        } else {
6419            vec![]
6420        };
6421        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6422            self.parse_comma_separated(Parser::parse_order_by_expr)?
6423        } else {
6424            vec![]
6425        };
6426        let window_frame = if !self.peek_token().eq(&Token::RParen) {
6427            Some(self.parse_window_frame()?)
6428        } else {
6429            None
6430        };
6431        Ok(WindowSpec {
6432            partition_by,
6433            order_by,
6434            window_frame,
6435        })
6436    }
6437
6438    pub fn parse_wait(&mut self) -> ModalResult<Statement> {
6439        let target = if self.parse_keyword(Keyword::TABLE) {
6440            WaitTarget::Table(self.parse_object_name()?)
6441        } else if self.parse_keyword(Keyword::MATERIALIZED) {
6442            self.expect_keyword(Keyword::VIEW)?;
6443            WaitTarget::MaterializedView(self.parse_object_name()?)
6444        } else if self.parse_keyword(Keyword::SINK) {
6445            WaitTarget::Sink(self.parse_object_name()?)
6446        } else if self.parse_keyword(Keyword::INDEX) {
6447            WaitTarget::Index(self.parse_object_name()?)
6448        } else {
6449            WaitTarget::All
6450        };
6451
6452        Ok(Statement::Wait(target))
6453    }
6454}
6455
6456impl Word {
6457    /// Convert a Word to a Identifier, return ParserError when the Word's value is a empty string.
6458    pub fn to_ident(&self) -> ModalResult<Ident> {
6459        if self.value.is_empty() {
6460            parser_err!("zero-length delimited identifier at or near \"{self}\"")
6461        } else {
6462            Ok(Ident {
6463                value: self.value.clone(),
6464                quote_style: self.quote_style,
6465            })
6466        }
6467    }
6468}
6469
6470#[cfg(test)]
6471mod tests {
6472    use super::*;
6473    use crate::test_utils::run_parser_method;
6474
6475    #[test]
6476    fn test_parse_integer_min() {
6477        let min_bigint = "-9223372036854775808";
6478        run_parser_method(min_bigint, |parser| {
6479            assert_eq!(
6480                parser.parse_expr().unwrap(),
6481                Expr::Value(Value::Number("-9223372036854775808".to_owned()))
6482            )
6483        });
6484    }
6485
6486    #[test]
6487    fn test_parse_function_arg_secret_ref() {
6488        use crate::ast::{FunctionArg, FunctionArgExpr, SecretRefAsType, SecretRefValue};
6489
6490        // Unnamed secret argument
6491        run_parser_method("SECRET my_secret", |parser| {
6492            let (_variadic, arg) = parser.parse_function_args().unwrap();
6493            assert_eq!(
6494                arg,
6495                FunctionArg::Unnamed(FunctionArgExpr::SecretRef(SecretRefValue {
6496                    secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6497                    ref_as: SecretRefAsType::Text,
6498                }))
6499            );
6500        });
6501
6502        // Unnamed secret argument with AS FILE
6503        run_parser_method("SECRET my_secret AS FILE", |parser| {
6504            let (_variadic, arg) = parser.parse_function_args().unwrap();
6505            assert_eq!(
6506                arg,
6507                FunctionArg::Unnamed(FunctionArgExpr::SecretRef(SecretRefValue {
6508                    secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6509                    ref_as: SecretRefAsType::File,
6510                }))
6511            );
6512        });
6513
6514        // Named secret argument
6515        run_parser_method("header => SECRET my_secret", |parser| {
6516            let (_variadic, arg) = parser.parse_function_args().unwrap();
6517            assert_eq!(
6518                arg,
6519                FunctionArg::Named {
6520                    name: Ident::new_unchecked("header"),
6521                    arg: FunctionArgExpr::SecretRef(SecretRefValue {
6522                        secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6523                        ref_as: SecretRefAsType::Text,
6524                    }),
6525                }
6526            );
6527        });
6528    }
6529}