Skip to main content

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