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::{AlterRateLimit, AlterRateLimitType, 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_rate_limit()? {
3378                AlterTableOperation::AlterRateLimit(rate_limit)
3379            } else if self.parse_keyword(Keyword::CONFIG) {
3380                let entries = self.parse_options()?;
3381                AlterTableOperation::SetConfig { entries }
3382            } else {
3383                return self.expected(
3384                    "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/SOURCE_RATE_LIMIT/DML_RATE_LIMIT/CONFIG after SET",
3385                );
3386            }
3387        } else if self.parse_keyword(Keyword::RESET) {
3388            if self.parse_keyword(Keyword::CONFIG) {
3389                let keys = self.parse_parenthesized_object_name_list()?;
3390                AlterTableOperation::ResetConfig { keys }
3391            } else {
3392                return self.expected("CONFIG after RESET");
3393            }
3394        } else if self.parse_keyword(Keyword::DROP) {
3395            let _ = self.parse_keyword(Keyword::COLUMN);
3396            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3397            let column_name = self.parse_identifier_non_reserved()?;
3398            let cascade = self.parse_keyword(Keyword::CASCADE);
3399            AlterTableOperation::DropColumn {
3400                column_name,
3401                if_exists,
3402                cascade,
3403            }
3404        } else if self.parse_keyword(Keyword::ALTER) {
3405            // `WATERMARK` is non-reserved; require `FOR` so `ALTER <col>` on a
3406            // column named `watermark` still falls through to ALTER COLUMN.
3407            if self.parse_keywords(&[Keyword::WATERMARK, Keyword::FOR]) {
3408                let column_name = self.parse_identifier_non_reserved()?;
3409                self.expect_keyword(Keyword::AS)?;
3410                let expr = self.parse_expr()?;
3411                let with_ttl = self.parse_keywords(&[Keyword::WITH, Keyword::TTL]);
3412                return Ok(Statement::AlterTable {
3413                    name: table_name,
3414                    operation: AlterTableOperation::AlterWatermark {
3415                        column_name,
3416                        expr,
3417                        with_ttl,
3418                    },
3419                });
3420            }
3421            let _ = self.parse_keyword(Keyword::COLUMN);
3422            let column_name = self.parse_identifier_non_reserved()?;
3423
3424            let op = if self.parse_keywords(&[Keyword::SET, Keyword::NOT, Keyword::NULL]) {
3425                AlterColumnOperation::SetNotNull {}
3426            } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
3427                AlterColumnOperation::DropNotNull {}
3428            } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
3429                AlterColumnOperation::SetDefault {
3430                    value: self.parse_expr()?,
3431                }
3432            } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
3433                AlterColumnOperation::DropDefault {}
3434            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE])
3435                || (self.parse_keyword(Keyword::TYPE))
3436            {
3437                let data_type = self.parse_data_type()?;
3438                let using = if self.parse_keyword(Keyword::USING) {
3439                    Some(self.parse_expr()?)
3440                } else {
3441                    None
3442                };
3443                AlterColumnOperation::SetDataType { data_type, using }
3444            } else {
3445                return self
3446                    .expected("SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE after ALTER COLUMN");
3447            };
3448            AlterTableOperation::AlterColumn { column_name, op }
3449        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3450            AlterTableOperation::RefreshSchema
3451        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3452            let target_table = self.parse_object_name()?;
3453            AlterTableOperation::SwapRenameTable { target_table }
3454        } else if self.parse_keyword(Keyword::CONNECTOR) {
3455            let with_options = self.parse_with_properties()?;
3456            AlterTableOperation::AlterConnectorProps {
3457                alter_props: with_options,
3458            }
3459        } else {
3460            return self.expected(
3461                "ADD or RENAME or OWNER TO or SET or RESET or DROP or SWAP or CONNECTOR after ALTER TABLE",
3462            );
3463        };
3464        Ok(Statement::AlterTable {
3465            name: table_name,
3466            operation,
3467        })
3468    }
3469
3470    fn parse_rate_limit_value(&mut self) -> ModalResult<i32> {
3471        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3472            return self.expected("TO or = after rate limit");
3473        }
3474        if self.parse_keyword(Keyword::DEFAULT) {
3475            return Ok(-1);
3476        }
3477        let s = self.parse_number_value()?;
3478        if let Ok(n) = s.parse::<i32>() {
3479            Ok(n)
3480        } else {
3481            self.expected("number or DEFAULT")
3482        }
3483    }
3484
3485    pub fn parse_alter_rate_limit(&mut self) -> ModalResult<Option<AlterRateLimit>> {
3486        for rate_limit_type in [
3487            AlterRateLimitType::Source,
3488            AlterRateLimitType::Backfill,
3489            AlterRateLimitType::Dml,
3490            AlterRateLimitType::Sink,
3491        ] {
3492            if self.parse_word(rate_limit_type.as_str()) {
3493                let rate_limit = self.parse_rate_limit_value()?;
3494                return Ok(Some(AlterRateLimit {
3495                    rate_limit_type,
3496                    rate_limit,
3497                }));
3498            }
3499        }
3500        Ok(None)
3501    }
3502
3503    pub fn parse_alter_index(&mut self) -> ModalResult<Statement> {
3504        let index_name = self.parse_object_name()?;
3505        let operation = if self.parse_keyword(Keyword::RENAME) {
3506            if self.parse_keyword(Keyword::TO) {
3507                let index_name = self.parse_object_name()?;
3508                AlterIndexOperation::RenameIndex { index_name }
3509            } else {
3510                return self.expected("TO after RENAME");
3511            }
3512        } else if self.parse_keyword(Keyword::SET) {
3513            if self.parse_keyword(Keyword::PARALLELISM) {
3514                if self.expect_keyword(Keyword::TO).is_err()
3515                    && self.expect_token(&Token::Eq).is_err()
3516                {
3517                    return self.expected("TO or = after ALTER INDEX SET PARALLELISM");
3518                }
3519
3520                let value = self.parse_set_variable()?;
3521
3522                let deferred = self.parse_keyword(Keyword::DEFERRED);
3523
3524                AlterIndexOperation::SetParallelism {
3525                    parallelism: value,
3526                    deferred,
3527                }
3528            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3529                if self.expect_keyword(Keyword::TO).is_err()
3530                    && self.expect_token(&Token::Eq).is_err()
3531                {
3532                    return self.expected("TO or = after ALTER INDEX SET BACKFILL_PARALLELISM");
3533                }
3534
3535                let value = self.parse_set_variable()?;
3536
3537                let deferred = self.parse_keyword(Keyword::DEFERRED);
3538
3539                AlterIndexOperation::SetBackfillParallelism {
3540                    parallelism: value,
3541                    deferred,
3542                }
3543            } else if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3544                if self.expect_keyword(Keyword::TO).is_err()
3545                    && self.expect_token(&Token::Eq).is_err()
3546                {
3547                    return self.expected("TO or = after ALTER INDEX SET RESOURCE_GROUP");
3548                }
3549                let value = self.parse_set_variable()?;
3550                let deferred = self.parse_keyword(Keyword::DEFERRED);
3551
3552                AlterIndexOperation::SetResourceGroup {
3553                    resource_group: Some(value),
3554                    deferred,
3555                }
3556            } else if self.parse_keyword(Keyword::CONFIG) {
3557                let entries = self.parse_options()?;
3558                AlterIndexOperation::SetConfig { entries }
3559            } else {
3560                return self.expected(
3561                    "PARALLELISM/BACKFILL_PARALLELISM/RESOURCE_GROUP or CONFIG after SET",
3562                );
3563            }
3564        } else if self.parse_keyword(Keyword::RESET) {
3565            if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3566                let deferred = self.parse_keyword(Keyword::DEFERRED);
3567
3568                AlterIndexOperation::SetResourceGroup {
3569                    resource_group: None,
3570                    deferred,
3571                }
3572            } else if self.parse_keyword(Keyword::CONFIG) {
3573                let keys = self.parse_parenthesized_object_name_list()?;
3574                AlterIndexOperation::ResetConfig { keys }
3575            } else {
3576                return self.expected("RESOURCE_GROUP or CONFIG after RESET");
3577            }
3578        } else {
3579            return self.expected("RENAME, SET, or RESET after ALTER INDEX");
3580        };
3581
3582        Ok(Statement::AlterIndex {
3583            name: index_name,
3584            operation,
3585        })
3586    }
3587
3588    pub fn parse_alter_view(&mut self, materialized: bool) -> ModalResult<Statement> {
3589        let view_name = self.parse_object_name()?;
3590        let operation = if self.parse_keyword(Keyword::AS) {
3591            let query = Box::new(self.parse_query()?);
3592            AlterViewOperation::AsQuery { query }
3593        } else if self.parse_keyword(Keyword::RENAME) {
3594            if self.parse_keyword(Keyword::TO) {
3595                let view_name = self.parse_object_name()?;
3596                AlterViewOperation::RenameView { view_name }
3597            } else {
3598                return self.expected("TO after RENAME");
3599            }
3600        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3601            let owner_name: Ident = self.parse_identifier()?;
3602            AlterViewOperation::ChangeOwner {
3603                new_owner_name: owner_name,
3604            }
3605        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3606            let target_view = self.parse_object_name()?;
3607            AlterViewOperation::SwapRenameView { target_view }
3608        } else if self.parse_keyword(Keyword::SET) {
3609            if self.parse_keyword(Keyword::SCHEMA) {
3610                let schema_name = self.parse_object_name()?;
3611                AlterViewOperation::SetSchema {
3612                    new_schema_name: schema_name,
3613                }
3614            } else if self.parse_word("STREAMING_ENABLE_UNALIGNED_JOIN") {
3615                if self.expect_keyword(Keyword::TO).is_err()
3616                    && self.expect_token(&Token::Eq).is_err()
3617                {
3618                    return self
3619                        .expected("TO or = after ALTER TABLE SET STREAMING_ENABLE_UNALIGNED_JOIN");
3620                }
3621                let value = self.parse_boolean()?;
3622                AlterViewOperation::SetStreamingEnableUnalignedJoin { enable: value }
3623            } else if self.parse_keyword(Keyword::PARALLELISM) && materialized {
3624                if self.expect_keyword(Keyword::TO).is_err()
3625                    && self.expect_token(&Token::Eq).is_err()
3626                {
3627                    return self.expected("TO or = after ALTER MATERIALIZED VIEW SET PARALLELISM");
3628                }
3629
3630                let value = self.parse_set_variable()?;
3631
3632                let deferred = self.parse_keyword(Keyword::DEFERRED);
3633
3634                AlterViewOperation::SetParallelism {
3635                    parallelism: value,
3636                    deferred,
3637                }
3638            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) && materialized {
3639                if self.expect_keyword(Keyword::TO).is_err()
3640                    && self.expect_token(&Token::Eq).is_err()
3641                {
3642                    return self.expected(
3643                        "TO or = after ALTER MATERIALIZED VIEW SET BACKFILL_PARALLELISM",
3644                    );
3645                }
3646
3647                let value = self.parse_set_variable()?;
3648
3649                let deferred = self.parse_keyword(Keyword::DEFERRED);
3650
3651                AlterViewOperation::SetBackfillParallelism {
3652                    parallelism: value,
3653                    deferred,
3654                }
3655            } else if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3656                if self.expect_keyword(Keyword::TO).is_err()
3657                    && self.expect_token(&Token::Eq).is_err()
3658                {
3659                    return self
3660                        .expected("TO or = after ALTER MATERIALIZED VIEW SET RESOURCE_GROUP");
3661                }
3662                let value = self.parse_set_variable()?;
3663                let deferred = self.parse_keyword(Keyword::DEFERRED);
3664
3665                AlterViewOperation::SetResourceGroup {
3666                    resource_group: Some(value),
3667                    deferred,
3668                }
3669            } else if let Some(rate_limit) = self.parse_alter_rate_limit()? {
3670                AlterViewOperation::AlterRateLimit(rate_limit)
3671            } else if self.parse_keyword(Keyword::CONFIG) && materialized {
3672                let entries = self.parse_options()?;
3673                AlterViewOperation::SetConfig { entries }
3674            } else {
3675                return self.expected(
3676                    "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/BACKFILL_RATE_LIMIT/CONFIG after SET",
3677                );
3678            }
3679        } else if self.parse_keyword(Keyword::RESET) {
3680            if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3681                let deferred = self.parse_keyword(Keyword::DEFERRED);
3682
3683                AlterViewOperation::SetResourceGroup {
3684                    resource_group: None,
3685                    deferred,
3686                }
3687            } else if self.parse_keyword(Keyword::CONFIG) && materialized {
3688                let keys = self.parse_parenthesized_object_name_list()?;
3689                AlterViewOperation::ResetConfig { keys }
3690            } else {
3691                return self.expected("RESOURCE_GROUP or CONFIG after RESET");
3692            }
3693        } else {
3694            return self.expected(&format!(
3695                "AS, RENAME, OWNER TO, SET, or SWAP after ALTER {}VIEW",
3696                if materialized { "MATERIALIZED " } else { "" }
3697            ));
3698        };
3699
3700        Ok(Statement::AlterView {
3701            materialized,
3702            name: view_name,
3703            operation,
3704        })
3705    }
3706
3707    pub fn parse_alter_sink(&mut self) -> ModalResult<Statement> {
3708        let sink_name = self.parse_object_name()?;
3709        let operation = if self.parse_keyword(Keyword::RENAME) {
3710            if self.parse_keyword(Keyword::TO) {
3711                let sink_name = self.parse_object_name()?;
3712                AlterSinkOperation::RenameSink { sink_name }
3713            } else {
3714                return self.expected("TO after RENAME");
3715            }
3716        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3717            let owner_name: Ident = self.parse_identifier()?;
3718            AlterSinkOperation::ChangeOwner {
3719                new_owner_name: owner_name,
3720            }
3721        } else if self.parse_keyword(Keyword::SET) {
3722            if self.parse_keyword(Keyword::SCHEMA) {
3723                let schema_name = self.parse_object_name()?;
3724                AlterSinkOperation::SetSchema {
3725                    new_schema_name: schema_name,
3726                }
3727            } else if self.parse_word("STREAMING_ENABLE_UNALIGNED_JOIN") {
3728                self.expect_keyword(Keyword::TO)?;
3729                let value = self.parse_boolean()?;
3730                AlterSinkOperation::SetStreamingEnableUnalignedJoin { enable: value }
3731            } else if self.parse_keyword(Keyword::PARALLELISM) {
3732                if self.expect_keyword(Keyword::TO).is_err()
3733                    && self.expect_token(&Token::Eq).is_err()
3734                {
3735                    return self.expected("TO or = after ALTER SINK SET PARALLELISM");
3736                }
3737
3738                let value = self.parse_set_variable()?;
3739                let deferred = self.parse_keyword(Keyword::DEFERRED);
3740
3741                AlterSinkOperation::SetParallelism {
3742                    parallelism: value,
3743                    deferred,
3744                }
3745            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3746                if self.expect_keyword(Keyword::TO).is_err()
3747                    && self.expect_token(&Token::Eq).is_err()
3748                {
3749                    return self.expected("TO or = after ALTER SINK SET BACKFILL_PARALLELISM");
3750                }
3751
3752                let value = self.parse_set_variable()?;
3753                let deferred = self.parse_keyword(Keyword::DEFERRED);
3754
3755                AlterSinkOperation::SetBackfillParallelism {
3756                    parallelism: value,
3757                    deferred,
3758                }
3759            } else if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3760                if self.expect_keyword(Keyword::TO).is_err()
3761                    && self.expect_token(&Token::Eq).is_err()
3762                {
3763                    return self.expected("TO or = after ALTER SINK SET RESOURCE_GROUP");
3764                }
3765                let value = self.parse_set_variable()?;
3766                let deferred = self.parse_keyword(Keyword::DEFERRED);
3767
3768                AlterSinkOperation::SetResourceGroup {
3769                    resource_group: Some(value),
3770                    deferred,
3771                }
3772            } else if let Some(rate_limit) = self.parse_alter_rate_limit()? {
3773                AlterSinkOperation::AlterRateLimit(rate_limit)
3774            } else if self.parse_keyword(Keyword::CONFIG) {
3775                let entries = self.parse_options()?;
3776                AlterSinkOperation::SetConfig { entries }
3777            } else {
3778                return self.expected(
3779                    "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/RESOURCE_GROUP/SINK_RATE_LIMIT/BACKFILL_RATE_LIMIT/STREAMING_ENABLE_UNALIGNED_JOIN/CONFIG after SET",
3780                );
3781            }
3782        } else if self.parse_keyword(Keyword::RESET) {
3783            if self.parse_keyword(Keyword::RESOURCE_GROUP) {
3784                let deferred = self.parse_keyword(Keyword::DEFERRED);
3785
3786                AlterSinkOperation::SetResourceGroup {
3787                    resource_group: None,
3788                    deferred,
3789                }
3790            } else if self.parse_keyword(Keyword::CONFIG) {
3791                let keys = self.parse_parenthesized_object_name_list()?;
3792                AlterSinkOperation::ResetConfig { keys }
3793            } else {
3794                return self.expected("RESOURCE_GROUP or CONFIG after RESET");
3795            }
3796        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3797            let target_sink = self.parse_object_name()?;
3798            AlterSinkOperation::SwapRenameSink { target_sink }
3799        } else if self.parse_keyword(Keyword::CONNECTOR) {
3800            let changed_props = self.parse_with_properties()?;
3801            AlterSinkOperation::AlterConnectorProps {
3802                alter_props: changed_props,
3803            }
3804        } else {
3805            return self
3806                .expected("RENAME or OWNER TO or SET or RESET or CONNECTOR WITH after ALTER SINK");
3807        };
3808
3809        Ok(Statement::AlterSink {
3810            name: sink_name,
3811            operation,
3812        })
3813    }
3814
3815    pub fn parse_alter_subscription(&mut self) -> ModalResult<Statement> {
3816        let subscription_name = self.parse_object_name()?;
3817        let operation = if self.parse_keyword(Keyword::RENAME) {
3818            if self.parse_keyword(Keyword::TO) {
3819                let subscription_name = self.parse_object_name()?;
3820                AlterSubscriptionOperation::RenameSubscription { subscription_name }
3821            } else {
3822                return self.expected("TO after RENAME");
3823            }
3824        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3825            let owner_name: Ident = self.parse_identifier()?;
3826            AlterSubscriptionOperation::ChangeOwner {
3827                new_owner_name: owner_name,
3828            }
3829        } else if self.parse_keyword(Keyword::SET) {
3830            if self.parse_keyword(Keyword::SCHEMA) {
3831                let schema_name = self.parse_object_name()?;
3832                AlterSubscriptionOperation::SetSchema {
3833                    new_schema_name: schema_name,
3834                }
3835            } else if self.parse_keyword(Keyword::RETENTION) {
3836                if self.expect_keyword(Keyword::TO).is_err()
3837                    && self.expect_token(&Token::Eq).is_err()
3838                {
3839                    return self.expected("TO or = after ALTER SUBSCRIPTION SET RETENTION");
3840                }
3841                let retention = self.ensure_parse_value()?;
3842                AlterSubscriptionOperation::SetRetention { retention }
3843            } else {
3844                return self.expected("SCHEMA or RETENTION after SET");
3845            }
3846        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3847            let target_subscription = self.parse_object_name()?;
3848            AlterSubscriptionOperation::SwapRenameSubscription {
3849                target_subscription,
3850            }
3851        } else {
3852            return self.expected("RENAME or OWNER TO or SET or SWAP after ALTER SUBSCRIPTION");
3853        };
3854
3855        Ok(Statement::AlterSubscription {
3856            name: subscription_name,
3857            operation,
3858        })
3859    }
3860
3861    pub fn parse_alter_source(&mut self) -> ModalResult<Statement> {
3862        let source_name = self.parse_object_name()?;
3863        let operation = if self.parse_keyword(Keyword::RENAME) {
3864            if self.parse_keyword(Keyword::TO) {
3865                let source_name = self.parse_object_name()?;
3866                AlterSourceOperation::RenameSource { source_name }
3867            } else {
3868                return self.expected("TO after RENAME");
3869            }
3870        } else if self.parse_keyword(Keyword::ADD) {
3871            let _ = self.parse_keyword(Keyword::COLUMN);
3872            let _if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3873            let column_def = self.parse_column_def()?;
3874            AlterSourceOperation::AddColumn { column_def }
3875        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3876            let owner_name: Ident = self.parse_identifier()?;
3877            AlterSourceOperation::ChangeOwner {
3878                new_owner_name: owner_name,
3879            }
3880        } else if self.parse_keyword(Keyword::SET) {
3881            if self.parse_keyword(Keyword::SCHEMA) {
3882                let schema_name = self.parse_object_name()?;
3883                AlterSourceOperation::SetSchema {
3884                    new_schema_name: schema_name,
3885                }
3886            } else if let Some(rate_limit) = self.parse_alter_rate_limit()? {
3887                AlterSourceOperation::AlterRateLimit(rate_limit)
3888            } else if self.parse_keyword(Keyword::PARALLELISM) {
3889                if self.expect_keyword(Keyword::TO).is_err()
3890                    && self.expect_token(&Token::Eq).is_err()
3891                {
3892                    return self.expected("TO or = after ALTER SOURCE SET PARALLELISM");
3893                }
3894
3895                let value = self.parse_set_variable()?;
3896                let deferred = self.parse_keyword(Keyword::DEFERRED);
3897
3898                AlterSourceOperation::SetParallelism {
3899                    parallelism: value,
3900                    deferred,
3901                }
3902            } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3903                if self.expect_keyword(Keyword::TO).is_err()
3904                    && self.expect_token(&Token::Eq).is_err()
3905                {
3906                    return self.expected("TO or = after ALTER SOURCE SET BACKFILL_PARALLELISM");
3907                }
3908
3909                let value = self.parse_set_variable()?;
3910                let deferred = self.parse_keyword(Keyword::DEFERRED);
3911
3912                AlterSourceOperation::SetBackfillParallelism {
3913                    parallelism: value,
3914                    deferred,
3915                }
3916            } else if self.parse_keyword(Keyword::CONFIG) {
3917                let entries = self.parse_options()?;
3918                AlterSourceOperation::SetConfig { entries }
3919            } else {
3920                return self.expected(
3921                    "SCHEMA, SOURCE_RATE_LIMIT, PARALLELISM, BACKFILL_PARALLELISM or CONFIG after SET",
3922                );
3923            }
3924        } else if self.parse_keyword(Keyword::RESET) {
3925            if self.parse_keyword(Keyword::CONFIG) {
3926                let keys = self.parse_parenthesized_object_name_list()?;
3927                AlterSourceOperation::ResetConfig { keys }
3928            } else {
3929                // RESET without CONFIG means reset CDC source offset to latest
3930                AlterSourceOperation::ResetSource
3931            }
3932        } else if self.peek_nth_any_of_keywords(0, &[Keyword::FORMAT]) {
3933            let format_encode = self.parse_schema()?.unwrap();
3934            if format_encode.key_encode.is_some() {
3935                parser_err!("key encode clause is not supported in source schema");
3936            }
3937            AlterSourceOperation::FormatEncode { format_encode }
3938        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3939            AlterSourceOperation::RefreshSchema
3940        } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3941            let target_source = self.parse_object_name()?;
3942            AlterSourceOperation::SwapRenameSource { target_source }
3943        } else if self.parse_keyword(Keyword::CONNECTOR) {
3944            let with_options = self.parse_with_properties()?;
3945            AlterSourceOperation::AlterConnectorProps {
3946                alter_props: with_options,
3947            }
3948        } else {
3949            return self.expected(
3950                "RENAME, ADD COLUMN, OWNER TO, CONNECTOR, SET or RESET after ALTER SOURCE",
3951            );
3952        };
3953
3954        Ok(Statement::AlterSource {
3955            name: source_name,
3956            operation,
3957        })
3958    }
3959
3960    pub fn parse_alter_function(&mut self) -> ModalResult<Statement> {
3961        let FunctionDesc { name, args } = self.parse_function_desc()?;
3962
3963        let operation = if self.parse_keyword(Keyword::SET) {
3964            if self.parse_keyword(Keyword::SCHEMA) {
3965                let schema_name = self.parse_object_name()?;
3966                AlterFunctionOperation::SetSchema {
3967                    new_schema_name: schema_name,
3968                }
3969            } else {
3970                return self.expected("SCHEMA after SET");
3971            }
3972        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3973            let owner_name: Ident = self.parse_identifier()?;
3974            AlterFunctionOperation::ChangeOwner {
3975                new_owner_name: owner_name,
3976            }
3977        } else {
3978            return self.expected("SET or OWNER TO after ALTER FUNCTION");
3979        };
3980
3981        Ok(Statement::AlterFunction {
3982            name,
3983            args,
3984            operation,
3985        })
3986    }
3987
3988    pub fn parse_alter_connection(&mut self) -> ModalResult<Statement> {
3989        let connection_name = self.parse_object_name()?;
3990        let operation = if self.parse_keyword(Keyword::SET) {
3991            if self.parse_keyword(Keyword::SCHEMA) {
3992                let schema_name = self.parse_object_name()?;
3993                AlterConnectionOperation::SetSchema {
3994                    new_schema_name: schema_name,
3995                }
3996            } else {
3997                return self.expected("SCHEMA after SET");
3998            }
3999        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
4000            let owner_name: Ident = self.parse_identifier()?;
4001            AlterConnectionOperation::ChangeOwner {
4002                new_owner_name: owner_name,
4003            }
4004        } else if self.parse_keyword(Keyword::CONNECTOR) {
4005            let with_options = self.parse_with_properties()?;
4006            AlterConnectionOperation::AlterConnectorProps {
4007                alter_props: with_options,
4008            }
4009        } else {
4010            return self.expected("SET, OWNER TO, or CONNECTOR WITH after ALTER CONNECTION");
4011        };
4012
4013        Ok(Statement::AlterConnection {
4014            name: connection_name,
4015            operation,
4016        })
4017    }
4018
4019    pub fn parse_alter_system(&mut self) -> ModalResult<Statement> {
4020        self.expect_keyword(Keyword::SET)?;
4021        let param = self.parse_identifier()?;
4022        if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4023            return self.expected("TO or = after ALTER SYSTEM SET");
4024        }
4025        let value = self.parse_set_variable()?;
4026        Ok(Statement::AlterSystem { param, value })
4027    }
4028
4029    pub fn parse_alter_secret(&mut self) -> ModalResult<Statement> {
4030        let secret_name = self.parse_object_name()?;
4031        let operation = if self.parse_keyword(Keyword::WITH) {
4032            let with_options = self.parse_options()?;
4033            if self.parse_keyword(Keyword::AS) {
4034                let new_credential = self.ensure_parse_value()?;
4035                AlterSecretOperation::ChangeCredential {
4036                    with_options,
4037                    new_credential,
4038                }
4039            } else {
4040                return self.expected("Keyword AS after Options");
4041            }
4042        } else if self.parse_keyword(Keyword::AS) {
4043            let new_credential = self.ensure_parse_value()?;
4044            AlterSecretOperation::ChangeCredential {
4045                with_options: vec![],
4046                new_credential,
4047            }
4048        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
4049            let owner_name: Ident = self.parse_identifier()?;
4050            AlterSecretOperation::ChangeOwner {
4051                new_owner_name: owner_name,
4052            }
4053        } else {
4054            return self.expected("WITH, AS or OWNER TO after ALTER SECRET");
4055        };
4056        Ok(Statement::AlterSecret {
4057            name: secret_name,
4058            operation,
4059        })
4060    }
4061
4062    pub fn parse_alter_fragment(&mut self) -> ModalResult<Statement> {
4063        let mut fragment_ids = vec![self.parse_literal_u32()?];
4064        while self.consume_token(&Token::Comma) {
4065            fragment_ids.push(self.parse_literal_u32()?);
4066        }
4067        if !self.parse_keyword(Keyword::SET) {
4068            return self.expected("SET after ALTER FRAGMENT");
4069        }
4070        let operation = if self.parse_keyword(Keyword::PARALLELISM) {
4071            if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4072                return self.expected("TO or = after ALTER FRAGMENT SET PARALLELISM");
4073            }
4074            let parallelism = self.parse_set_variable()?;
4075            AlterFragmentOperation::SetParallelism { parallelism }
4076        } else {
4077            let rate_limit = self.parse_alter_fragment_rate_limit()?;
4078            AlterFragmentOperation::AlterRateLimit(rate_limit)
4079        };
4080        Ok(Statement::AlterFragment {
4081            fragment_ids,
4082            operation,
4083        })
4084    }
4085
4086    pub fn parse_alter_compaction_group(&mut self) -> ModalResult<Statement> {
4087        if !self.parse_keyword(Keyword::GROUP) {
4088            return self.expected("GROUP after ALTER COMPACTION");
4089        }
4090        let mut group_ids = vec![self.parse_literal_u64()?];
4091        while self.consume_token(&Token::Comma) {
4092            group_ids.push(self.parse_literal_u64()?);
4093        }
4094        if !self.parse_keyword(Keyword::SET) {
4095            return self.expected("SET after ALTER COMPACTION GROUP <id>");
4096        }
4097        // NOTE: use the `no_list` variant here, because `parse_set_variable` allows comma-separated
4098        // lists (e.g., `SET foo = 1,2,3`), which would conflict with our use of comma to separate
4099        // multiple config assignments.
4100        let configs = self.parse_comma_separated(Parser::parse_config_param_no_list)?;
4101        let operation = AlterCompactionGroupOperation::Set { configs };
4102        Ok(Statement::AlterCompactionGroup {
4103            group_ids,
4104            operation,
4105        })
4106    }
4107
4108    fn parse_alter_fragment_rate_limit(&mut self) -> ModalResult<AlterRateLimit> {
4109        if self.parse_word("RATE_LIMIT") {
4110            let rate_limit = self.parse_rate_limit_value()?;
4111            return Ok(AlterRateLimit {
4112                rate_limit_type: AlterRateLimitType::Backfill,
4113                rate_limit,
4114            });
4115        }
4116        if let Some(rate_limit) = self.parse_alter_rate_limit()? {
4117            Ok(rate_limit)
4118        } else {
4119            self.expected("expected rate limit after SET")
4120        }
4121    }
4122
4123    /// Parse a copy statement
4124    pub fn parse_copy(&mut self) -> ModalResult<Statement> {
4125        let entity = if self.consume_token(&Token::LParen) {
4126            let query = self.parse_query()?;
4127            self.expect_token(&Token::RParen)?;
4128            CopyEntity::Query(query.into())
4129        } else {
4130            let table_name = self.parse_object_name()?;
4131            let columns = self.parse_parenthesized_column_list(Optional)?;
4132            CopyEntity::Table {
4133                table_name,
4134                columns,
4135            }
4136        };
4137
4138        let target = if self.parse_keywords(&[Keyword::FROM, Keyword::STDIN]) {
4139            self.expect_token(&Token::SemiColon)?;
4140            let values = self.parse_tsv();
4141            CopyTarget::Stdin { values }
4142        } else if self.parse_keywords(&[Keyword::TO, Keyword::STDOUT]) {
4143            CopyTarget::Stdout
4144        } else {
4145            return self.expected("FROM STDIN or TO STDOUT");
4146        };
4147
4148        Ok(Statement::Copy { entity, target })
4149    }
4150
4151    /// Parse a tab separated values in
4152    /// COPY payload
4153    fn parse_tsv(&mut self) -> Vec<Option<String>> {
4154        self.parse_tab_value()
4155    }
4156
4157    fn parse_tab_value(&mut self) -> Vec<Option<String>> {
4158        let mut values = vec![];
4159        let mut content = String::from("");
4160        while let Some(t) = self.next_token_no_skip() {
4161            match t.token {
4162                Token::Whitespace(Whitespace::Tab) => {
4163                    values.push(Some(content.clone()));
4164                    content.clear();
4165                }
4166                Token::Whitespace(Whitespace::Newline) => {
4167                    values.push(Some(content.clone()));
4168                    content.clear();
4169                }
4170                Token::Backslash => {
4171                    if self.consume_token(&Token::Period) {
4172                        return values;
4173                    }
4174                    if let Token::Word(w) = self.next_token().token
4175                        && w.value == "N"
4176                    {
4177                        values.push(None);
4178                    }
4179                }
4180                _ => {
4181                    content.push_str(&t.to_string());
4182                }
4183            }
4184        }
4185        values
4186    }
4187
4188    pub fn ensure_parse_value(&mut self) -> ModalResult<Value> {
4189        match self.parse_value_and_obj_ref::<true>()? {
4190            SqlOptionValue::Value(value) => Ok(value),
4191            SqlOptionValue::SecretRef(_)
4192            | SqlOptionValue::ConnectionRef(_)
4193            | SqlOptionValue::BackfillOrder(_) => unreachable!(),
4194        }
4195    }
4196
4197    /// Parse a literal value (numbers, strings, date/time, booleans)
4198    pub fn parse_value_and_obj_ref<const FORBID_OBJ_REF: bool>(
4199        &mut self,
4200    ) -> ModalResult<SqlOptionValue> {
4201        let checkpoint = *self;
4202        let token = self.next_token();
4203        match token.token {
4204            Token::Word(w) => match w.keyword {
4205                Keyword::TRUE => Ok(Value::Boolean(true).into()),
4206                Keyword::FALSE => Ok(Value::Boolean(false).into()),
4207                Keyword::NULL => Ok(Value::Null.into()),
4208                Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
4209                    Some('"') => Ok(Value::DoubleQuotedString(w.value).into()),
4210                    Some('\'') => Ok(Value::SingleQuotedString(w.value).into()),
4211                    _ => self.expected_at(checkpoint, "A value")?,
4212                },
4213                Keyword::SECRET => {
4214                    if FORBID_OBJ_REF {
4215                        return self.expected_at(
4216                            checkpoint,
4217                            "a concrete value rather than a secret reference",
4218                        );
4219                    }
4220                    let secret = self.parse_secret_ref()?;
4221                    Ok(SqlOptionValue::SecretRef(secret))
4222                }
4223                _ => self.expected_at(checkpoint, "a concrete value"),
4224            },
4225            Token::Number(ref n) => Ok(Value::Number(n.clone()).into()),
4226            Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.clone()).into()),
4227            Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone()).into()),
4228            Token::CstyleEscapesString(ref s) => Ok(Value::CstyleEscapedString(s.clone()).into()),
4229            Token::NationalStringLiteral(ref s) => {
4230                Ok(Value::NationalStringLiteral(s.clone()).into())
4231            }
4232            Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.clone()).into()),
4233            _ => self.expected_at(checkpoint, "a value"),
4234        }
4235    }
4236
4237    fn parse_secret_ref(&mut self) -> ModalResult<SecretRefValue> {
4238        let secret_name = self.parse_object_name()?;
4239        let ref_as = if self.parse_keywords(&[Keyword::AS, Keyword::FILE]) {
4240            SecretRefAsType::File
4241        } else {
4242            SecretRefAsType::Text
4243        };
4244        Ok(SecretRefValue {
4245            secret_name,
4246            ref_as,
4247        })
4248    }
4249
4250    fn parse_set_variable(&mut self) -> ModalResult<SetVariableValue> {
4251        alt((
4252            Keyword::DEFAULT.value(SetVariableValue::Default),
4253            separated(
4254                1..,
4255                alt((
4256                    Self::ensure_parse_value.map(SetVariableValueSingle::Literal),
4257                    |parser: &mut Self| {
4258                        let checkpoint = *parser;
4259                        let ident = parser.parse_identifier()?;
4260                        if parser.consume_token(&Token::LParen) {
4261                            let args = parser.parse_comma_separated(Parser::ensure_parse_value)?;
4262                            parser.expect_token(&Token::RParen)?;
4263                            let raw = format!(
4264                                "{}({})",
4265                                ident,
4266                                args.iter().map(ToString::to_string).join(", ")
4267                            );
4268                            return Ok(SetVariableValueSingle::Raw(raw));
4269                        }
4270                        if ident.value == "default" {
4271                            *parser = checkpoint;
4272                            return parser.expected("parameter list value").map_err(|e| e.cut());
4273                        }
4274                        Ok(SetVariableValueSingle::Ident(ident))
4275                    },
4276                    fail.expect("parameter value"),
4277                )),
4278                Token::Comma,
4279            )
4280            .map(|list: Vec<SetVariableValueSingle>| {
4281                if list.len() == 1 {
4282                    SetVariableValue::Single(list[0].clone())
4283                } else {
4284                    SetVariableValue::List(list)
4285                }
4286            }),
4287        ))
4288        .parse_next(self)
4289    }
4290
4291    fn parse_backfill_order_strategy(&mut self) -> ModalResult<BackfillOrderStrategy> {
4292        alt((
4293            Keyword::DEFAULT.value(BackfillOrderStrategy::Default),
4294            Keyword::NONE.value(BackfillOrderStrategy::None),
4295            Keyword::AUTO.value(BackfillOrderStrategy::Auto),
4296            Self::parse_fixed_backfill_order.map(BackfillOrderStrategy::Fixed),
4297            fail.expect("backfill order strategy"),
4298        ))
4299        .parse_next(self)
4300    }
4301
4302    fn parse_fixed_backfill_order(&mut self) -> ModalResult<Vec<(ObjectName, ObjectName)>> {
4303        self.expect_word("FIXED")?;
4304        self.expect_token(&Token::LParen)?;
4305        let edges = separated(
4306            0..,
4307            separated_pair(
4308                Self::parse_object_name,
4309                Token::Op("->".to_owned()),
4310                Self::parse_object_name,
4311            ),
4312            Token::Comma,
4313        )
4314        .parse_next(self)?;
4315        self.expect_token(&Token::RParen)?;
4316        Ok(edges)
4317    }
4318
4319    pub fn parse_number_value(&mut self) -> ModalResult<String> {
4320        let checkpoint = *self;
4321        match self.ensure_parse_value()? {
4322            Value::Number(v) => Ok(v),
4323            _ => self.expected_at(checkpoint, "literal number"),
4324        }
4325    }
4326
4327    pub fn parse_literal_u32(&mut self) -> ModalResult<u32> {
4328        literal_u32(self)
4329    }
4330
4331    pub fn parse_literal_u64(&mut self) -> ModalResult<u64> {
4332        literal_u64(self)
4333    }
4334
4335    pub fn parse_function_definition(&mut self) -> ModalResult<FunctionDefinition> {
4336        alt((
4337            single_quoted_string.map(FunctionDefinition::SingleQuotedDef),
4338            dollar_quoted_string.map(FunctionDefinition::DoubleDollarDef),
4339            Self::parse_identifier.map(|i| FunctionDefinition::Identifier(i.value)),
4340            fail.expect("function definition"),
4341        ))
4342        .parse_next(self)
4343    }
4344
4345    /// Parse a literal string
4346    pub fn parse_literal_string(&mut self) -> ModalResult<String> {
4347        let checkpoint = *self;
4348        let token = self.next_token();
4349        match token.token {
4350            Token::SingleQuotedString(s) => Ok(s),
4351            Token::DollarQuotedString(s) => Ok(s.value),
4352            _ => self.expected_at(checkpoint, "literal string"),
4353        }
4354    }
4355
4356    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
4357    pub fn parse_data_type(&mut self) -> ModalResult<DataType> {
4358        parser_v2::data_type(self)
4359    }
4360
4361    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
4362    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
4363    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
4364    pub fn parse_optional_alias(
4365        &mut self,
4366        reserved_kwds: &[Keyword],
4367    ) -> ModalResult<Option<Ident>> {
4368        let after_as = self.parse_keyword(Keyword::AS);
4369        let checkpoint = *self;
4370        let token = self.next_token();
4371        match token.token {
4372            // Accept any identifier after `AS` (though many dialects have restrictions on
4373            // keywords that may appear here). If there's no `AS`: don't parse keywords,
4374            // which may start a construct allowed in this position, to be parsed as aliases.
4375            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
4376            // not an alias.)
4377            Token::Word(w) if after_as || (!reserved_kwds.contains(&w.keyword)) => {
4378                Ok(Some(w.to_ident()?))
4379            }
4380            _ => {
4381                *self = checkpoint;
4382                if after_as {
4383                    return self.expected("an identifier after AS");
4384                }
4385                Ok(None) // no alias found
4386            }
4387        }
4388    }
4389
4390    /// Parse `AS identifier` when the AS is describing a table-valued object,
4391    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
4392    /// the alias is allowed to optionally name the columns in the table, in
4393    /// addition to the table itself.
4394    pub fn parse_optional_table_alias(
4395        &mut self,
4396        reserved_kwds: &[Keyword],
4397    ) -> ModalResult<Option<TableAlias>> {
4398        match self.parse_optional_alias(reserved_kwds)? {
4399            Some(name) => {
4400                let columns = self.parse_parenthesized_column_list(Optional)?;
4401                Ok(Some(TableAlias { name, columns }))
4402            }
4403            None => Ok(None),
4404        }
4405    }
4406
4407    /// syntax `FOR SYSTEM_TIME AS OF PROCTIME()` is used for temporal join.
4408    pub fn parse_as_of(&mut self) -> ModalResult<AsOf> {
4409        Keyword::FOR.parse_next(self)?;
4410        alt((
4411            preceded(
4412                (Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF),
4413                cut_err(
4414                    alt((
4415                        preceded(
4416                            (
4417                                Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4418                                cut_err(Token::LParen),
4419                                cut_err(Token::RParen),
4420                                Token::Minus,
4421                            ),
4422                            Self::parse_literal_interval.try_map(|e| match e {
4423                                Expr::Value(v) => match v {
4424                                    Value::Interval {
4425                                        value,
4426                                        leading_field,
4427                                        ..
4428                                    } => {
4429                                        let Some(leading_field) = leading_field else {
4430                                            return Err(StrError("expect duration unit".into()));
4431                                        };
4432                                        Ok(AsOf::ProcessTimeWithInterval((value, leading_field)))
4433                                    }
4434                                    _ => Err(StrError("expect Value::Interval".into())),
4435                                },
4436                                _ => Err(StrError("expect Expr::Value".into())),
4437                            }),
4438                        ),
4439                        (
4440                            Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4441                            cut_err(Token::LParen),
4442                            cut_err(Token::RParen),
4443                        )
4444                            .value(AsOf::ProcessTimeWithInterval((
4445                                "0".to_owned(),
4446                                DateTimeField::Second,
4447                            ))),
4448                        (
4449                            Self::parse_identifier.verify(|ident| ident.real_value() == "proctime"),
4450                            cut_err(Token::LParen),
4451                            cut_err(Token::RParen),
4452                        )
4453                            .value(AsOf::ProcessTime),
4454                        literal_i64.map(AsOf::TimestampNum),
4455                        single_quoted_string.map(AsOf::TimestampString),
4456                    ))
4457                    .expect("proctime(), now(), number or string"),
4458                ),
4459            ),
4460            preceded(
4461                (Keyword::SYSTEM_VERSION, Keyword::AS, Keyword::OF),
4462                cut_err(
4463                    alt((
4464                        literal_i64.map(AsOf::VersionNum),
4465                        single_quoted_string.map(AsOf::VersionString),
4466                    ))
4467                    .expect("number or string"),
4468                ),
4469            ),
4470        ))
4471        .parse_next(self)
4472    }
4473
4474    /// Parse a possibly qualified, possibly quoted identifier, e.g.
4475    /// `foo` or `myschema."table"
4476    pub fn parse_object_name(&mut self) -> ModalResult<ObjectName> {
4477        let mut idents = vec![];
4478        loop {
4479            idents.push(self.parse_identifier()?);
4480            if !self.consume_token(&Token::Period) {
4481                break;
4482            }
4483        }
4484        Ok(ObjectName(idents))
4485    }
4486
4487    /// Parse a parenthesized comma-separated list of object names
4488    pub fn parse_parenthesized_object_name_list(&mut self) -> ModalResult<Vec<ObjectName>> {
4489        if self.consume_token(&Token::LParen) {
4490            let names = self.parse_comma_separated(Parser::parse_object_name)?;
4491            self.expect_token(&Token::RParen)?;
4492            Ok(names)
4493        } else {
4494            self.expected("a list of object names in parentheses")
4495        }
4496    }
4497
4498    /// Parse identifiers strictly i.e. don't parse keywords
4499    pub fn parse_identifiers_non_keywords(&mut self) -> ModalResult<Vec<Ident>> {
4500        let mut idents = vec![];
4501        loop {
4502            match self.peek_token().token {
4503                Token::Word(w) => {
4504                    if w.keyword != Keyword::NoKeyword {
4505                        break;
4506                    }
4507
4508                    idents.push(w.to_ident()?);
4509                }
4510                Token::EOF | Token::Eq => break,
4511                _ => {}
4512            }
4513
4514            self.next_token();
4515        }
4516
4517        Ok(idents)
4518    }
4519
4520    /// Parse identifiers
4521    pub fn parse_identifiers(&mut self) -> ModalResult<Vec<Ident>> {
4522        let mut idents = vec![];
4523        loop {
4524            let token = self.next_token();
4525            match token.token {
4526                Token::Word(w) => {
4527                    idents.push(w.to_ident()?);
4528                }
4529                Token::EOF => break,
4530                _ => {}
4531            }
4532        }
4533
4534        Ok(idents)
4535    }
4536
4537    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
4538    pub fn parse_identifier(&mut self) -> ModalResult<Ident> {
4539        let checkpoint = *self;
4540        let token = self.next_token();
4541        match token.token {
4542            Token::Word(w) => Ok(w.to_ident()?),
4543            _ => self.expected_at(checkpoint, "identifier"),
4544        }
4545    }
4546
4547    /// Parse a simple one-word identifier (possibly quoted, possibly a non-reserved keyword)
4548    pub fn parse_identifier_non_reserved(&mut self) -> ModalResult<Ident> {
4549        let checkpoint = *self;
4550        let token = self.next_token();
4551        match token.token {
4552            Token::Word(w) => {
4553                match keywords::RESERVED_FOR_COLUMN_OR_TABLE_NAME.contains(&w.keyword) {
4554                    true => parser_err!("syntax error at or near {w}"),
4555                    false => Ok(w.to_ident()?),
4556                }
4557            }
4558            _ => self.expected_at(checkpoint, "identifier"),
4559        }
4560    }
4561
4562    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
4563    pub fn parse_parenthesized_column_list(
4564        &mut self,
4565        optional: IsOptional,
4566    ) -> ModalResult<Vec<Ident>> {
4567        if self.consume_token(&Token::LParen) {
4568            let cols = self.parse_comma_separated(Parser::parse_identifier_non_reserved)?;
4569            self.expect_token(&Token::RParen)?;
4570            Ok(cols)
4571        } else if optional == Optional {
4572            Ok(vec![])
4573        } else {
4574            self.expected("a list of columns in parentheses")
4575        }
4576    }
4577
4578    pub fn parse_returning(&mut self, optional: IsOptional) -> ModalResult<Vec<SelectItem>> {
4579        if self.parse_keyword(Keyword::RETURNING) {
4580            let cols = self.parse_comma_separated(Parser::parse_select_item)?;
4581            Ok(cols)
4582        } else if optional == Optional {
4583            Ok(vec![])
4584        } else {
4585            self.expected("a list of columns or * after returning")
4586        }
4587    }
4588
4589    pub fn parse_row_expr(&mut self) -> ModalResult<Expr> {
4590        Ok(Expr::Row(self.parse_token_wrapped_exprs(
4591            &Token::LParen,
4592            &Token::RParen,
4593        )?))
4594    }
4595
4596    /// Parse a comma-separated list (maybe empty) from a wrapped expression
4597    pub fn parse_token_wrapped_exprs(
4598        &mut self,
4599        left: &Token,
4600        right: &Token,
4601    ) -> ModalResult<Vec<Expr>> {
4602        if self.consume_token(left) {
4603            let exprs = if self.consume_token(right) {
4604                vec![]
4605            } else {
4606                let exprs = self.parse_comma_separated(Parser::parse_expr)?;
4607                self.expect_token(right)?;
4608                exprs
4609            };
4610            Ok(exprs)
4611        } else {
4612            self.expected(left.to_string().as_str())
4613        }
4614    }
4615
4616    pub fn parse_optional_precision(&mut self) -> ModalResult<Option<u64>> {
4617        if self.consume_token(&Token::LParen) {
4618            let n = self.parse_literal_u64()?;
4619            self.expect_token(&Token::RParen)?;
4620            Ok(Some(n))
4621        } else {
4622            Ok(None)
4623        }
4624    }
4625
4626    pub fn parse_optional_precision_scale(&mut self) -> ModalResult<(Option<u64>, Option<u64>)> {
4627        if self.consume_token(&Token::LParen) {
4628            let n = self.parse_literal_u64()?;
4629            let scale = if self.consume_token(&Token::Comma) {
4630                Some(self.parse_literal_u64()?)
4631            } else {
4632                None
4633            };
4634            self.expect_token(&Token::RParen)?;
4635            Ok((Some(n), scale))
4636        } else {
4637            Ok((None, None))
4638        }
4639    }
4640
4641    pub fn parse_delete(&mut self) -> ModalResult<Statement> {
4642        if self.parse_keyword(Keyword::META) {
4643            let Some(_) = self.parse_one_of_keywords(&[Keyword::SNAPSHOT, Keyword::SNAPSHOTS])
4644            else {
4645                return self.expected("SNAPSHOT or SNAPSHOTS");
4646            };
4647            let snapshot_ids = self.parse_comma_separated(Parser::parse_literal_u64)?;
4648            return Ok(Statement::DeleteMetaSnapshots { snapshot_ids });
4649        }
4650
4651        self.expect_keyword(Keyword::FROM)?;
4652        let table_name = self.parse_object_name()?;
4653        let selection = if self.parse_keyword(Keyword::WHERE) {
4654            Some(self.parse_expr()?)
4655        } else {
4656            None
4657        };
4658        let returning = self.parse_returning(Optional)?;
4659
4660        Ok(Statement::Delete {
4661            table_name,
4662            selection,
4663            returning,
4664        })
4665    }
4666
4667    pub fn parse_boolean(&mut self) -> ModalResult<bool> {
4668        if let Some(keyword) = self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
4669            match keyword {
4670                Keyword::TRUE => Ok(true),
4671                Keyword::FALSE => Ok(false),
4672                _ => unreachable!(),
4673            }
4674        } else {
4675            self.expected("TRUE or FALSE")
4676        }
4677    }
4678
4679    pub fn parse_optional_boolean(&mut self, default: bool) -> bool {
4680        self.parse_boolean().unwrap_or(default)
4681    }
4682
4683    fn parse_explain_options(&mut self) -> ModalResult<(ExplainOptions, Option<u64>)> {
4684        let mut options = ExplainOptions::default();
4685        let mut analyze_duration = None;
4686
4687        const BACKFILL: &str = "backfill";
4688        const VERBOSE: &str = "verbose";
4689        const TRACE: &str = "trace";
4690        const TYPE: &str = "type";
4691        const LOGICAL: &str = "logical";
4692        const PHYSICAL: &str = "physical";
4693        const DISTSQL: &str = "distsql";
4694        const FORMAT: &str = "format";
4695        const DURATION_SECS: &str = "duration_secs";
4696
4697        let explain_options_identifiers = [
4698            BACKFILL,
4699            VERBOSE,
4700            TRACE,
4701            TYPE,
4702            LOGICAL,
4703            PHYSICAL,
4704            DISTSQL,
4705            FORMAT,
4706            DURATION_SECS,
4707        ];
4708
4709        let parse_explain_option = |parser: &mut Parser<'_>| -> ModalResult<()> {
4710            match parser.parse_identifier()?.real_value().as_str() {
4711                VERBOSE => options.verbose = parser.parse_optional_boolean(true),
4712                TRACE => options.trace = parser.parse_optional_boolean(true),
4713                BACKFILL => options.backfill = parser.parse_optional_boolean(true),
4714                TYPE => {
4715                    let explain_type = parser.parse_identifier()?.real_value();
4716                    match explain_type.as_str() {
4717                        LOGICAL => options.explain_type = ExplainType::Logical,
4718                        PHYSICAL => options.explain_type = ExplainType::Physical,
4719                        DISTSQL => options.explain_type = ExplainType::DistSql,
4720                        unexpected => {
4721                            parser_err!("unexpected explain type: [{unexpected}]")
4722                        }
4723                    }
4724                }
4725                LOGICAL => options.explain_type = ExplainType::Logical,
4726                PHYSICAL => options.explain_type = ExplainType::Physical,
4727                DISTSQL => options.explain_type = ExplainType::DistSql,
4728                FORMAT => {
4729                    options.explain_format = {
4730                        let format = parser.parse_identifier()?.real_value();
4731                        match format.as_str() {
4732                            "text" => ExplainFormat::Text,
4733                            "json" => ExplainFormat::Json,
4734                            "xml" => ExplainFormat::Xml,
4735                            "yaml" => ExplainFormat::Yaml,
4736                            "dot" => ExplainFormat::Dot,
4737                            unexpected => {
4738                                parser_err!("unexpected explain format [{unexpected}]")
4739                            }
4740                        }
4741                    }
4742                }
4743                DURATION_SECS => {
4744                    analyze_duration = Some(parser.parse_literal_u64()?);
4745                }
4746                unexpected => {
4747                    parser_err!("unexpected explain options: [{unexpected}]")
4748                }
4749            };
4750            Ok(())
4751        };
4752
4753        // In order to support following statement, we need to peek before consume.
4754        // explain (select 1) union (select 1)
4755        if self.peek_token() == Token::LParen
4756            && let Token::Word(word) = self.peek_nth_token(1).token
4757            && let Ok(ident) = word.to_ident()
4758            && explain_options_identifiers.contains(&ident.real_value().as_str())
4759        {
4760            assert!(self.consume_token(&Token::LParen));
4761            self.parse_comma_separated(parse_explain_option)?;
4762            self.expect_token(&Token::RParen)?;
4763        }
4764
4765        Ok((options, analyze_duration))
4766    }
4767
4768    pub fn parse_explain(&mut self) -> ModalResult<Statement> {
4769        let analyze = self.parse_keyword(Keyword::ANALYZE);
4770        let (options, analyze_duration) = self.parse_explain_options()?;
4771
4772        if analyze {
4773            fn parse_analyze_target(parser: &mut Parser<'_>) -> ModalResult<Option<AnalyzeTarget>> {
4774                if parser.parse_keyword(Keyword::TABLE) {
4775                    let table_name = parser.parse_object_name()?;
4776                    Ok(Some(AnalyzeTarget::Table(table_name)))
4777                } else if parser.parse_keyword(Keyword::INDEX) {
4778                    let index_name = parser.parse_object_name()?;
4779                    Ok(Some(AnalyzeTarget::Index(index_name)))
4780                } else if parser.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
4781                    let view_name = parser.parse_object_name()?;
4782                    Ok(Some(AnalyzeTarget::MaterializedView(view_name)))
4783                } else if parser.parse_keyword(Keyword::INDEX) {
4784                    let index_name = parser.parse_object_name()?;
4785                    Ok(Some(AnalyzeTarget::Index(index_name)))
4786                } else if parser.parse_keyword(Keyword::SINK) {
4787                    let sink_name = parser.parse_object_name()?;
4788                    Ok(Some(AnalyzeTarget::Sink(sink_name)))
4789                } else if parser.parse_word("ID") {
4790                    let job_id = parser.parse_literal_u32()?;
4791                    Ok(Some(AnalyzeTarget::Id(job_id)))
4792                } else {
4793                    Ok(None)
4794                }
4795            }
4796            if let Some(target) = parse_analyze_target(self)? {
4797                let statement = Statement::ExplainAnalyzeStreamJob {
4798                    target,
4799                    duration_secs: analyze_duration,
4800                };
4801                return Ok(statement);
4802            }
4803        }
4804
4805        let statement = match self.parse_statement() {
4806            Ok(statement) => statement,
4807            error @ Err(_) => {
4808                return if analyze {
4809                    self.expected_at(
4810                        *self,
4811                        "SINK, TABLE, MATERIALIZED VIEW, INDEX or a statement after ANALYZE",
4812                    )
4813                } else {
4814                    error
4815                };
4816            }
4817        };
4818        Ok(Statement::Explain {
4819            analyze,
4820            statement: Box::new(statement),
4821            options,
4822        })
4823    }
4824
4825    pub fn parse_describe(&mut self) -> ModalResult<Statement> {
4826        let kind = match self.parse_one_of_keywords(&[Keyword::FRAGMENT, Keyword::FRAGMENTS]) {
4827            Some(Keyword::FRAGMENT) => {
4828                let fragment_id = self.parse_literal_u32()?;
4829                return Ok(Statement::DescribeFragment { fragment_id });
4830            }
4831            Some(Keyword::FRAGMENTS) => DescribeKind::Fragments,
4832            None => DescribeKind::Plain,
4833            Some(_) => unreachable!(),
4834        };
4835        let name = self.parse_object_name()?;
4836        Ok(Statement::Describe { name, kind })
4837    }
4838
4839    /// Parse a query expression, i.e. a `SELECT` statement optionally
4840    /// preceded with some `WITH` CTE declarations and optionally followed
4841    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
4842    /// expect the initial keyword to be already consumed
4843    pub fn parse_query(&mut self) -> ModalResult<Query> {
4844        let with = if self.parse_keyword(Keyword::WITH) {
4845            Some(With {
4846                recursive: self.parse_keyword(Keyword::RECURSIVE),
4847                cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
4848            })
4849        } else {
4850            None
4851        };
4852
4853        let body = self.parse_query_body(0)?;
4854
4855        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
4856            self.parse_comma_separated(Parser::parse_order_by_expr)?
4857        } else {
4858            vec![]
4859        };
4860
4861        let mut limit = None;
4862        let mut offset = None;
4863        for _x in 0..2 {
4864            if limit.is_none() && self.parse_keyword(Keyword::LIMIT) {
4865                limit = self.parse_limit()?
4866            }
4867
4868            if offset.is_none() && self.parse_keyword(Keyword::OFFSET) {
4869                offset = Some(self.parse_offset()?)
4870            }
4871        }
4872
4873        let fetch = if self.parse_keyword(Keyword::FETCH) {
4874            if limit.is_some() {
4875                parser_err!("Cannot specify both LIMIT and FETCH");
4876            }
4877            let fetch = self.parse_fetch()?;
4878            if fetch.with_ties && order_by.is_empty() {
4879                parser_err!("WITH TIES cannot be specified without ORDER BY clause");
4880            }
4881            Some(fetch)
4882        } else {
4883            None
4884        };
4885
4886        Ok(Query {
4887            with,
4888            body,
4889            order_by,
4890            limit,
4891            offset,
4892            fetch,
4893        })
4894    }
4895
4896    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
4897    fn parse_cte(&mut self) -> ModalResult<Cte> {
4898        let name = self.parse_identifier_non_reserved()?;
4899        let cte = if self.parse_keyword(Keyword::AS) {
4900            let cte_inner = self.parse_cte_inner()?;
4901            let alias = TableAlias {
4902                name,
4903                columns: vec![],
4904            };
4905            Cte { alias, cte_inner }
4906        } else {
4907            let columns = self.parse_parenthesized_column_list(Optional)?;
4908            self.expect_keyword(Keyword::AS)?;
4909            let cte_inner = self.parse_cte_inner()?;
4910            let alias = TableAlias { name, columns };
4911            Cte { alias, cte_inner }
4912        };
4913        Ok(cte)
4914    }
4915
4916    fn parse_cte_inner(&mut self) -> ModalResult<CteInner> {
4917        match self.expect_token(&Token::LParen) {
4918            Ok(()) => {
4919                let query = self.parse_query()?;
4920                self.expect_token(&Token::RParen)?;
4921                Ok(CteInner::Query(Box::new(query)))
4922            }
4923            _ => {
4924                let changelog = self.parse_identifier_non_reserved()?;
4925                if changelog.to_string().to_lowercase() != "changelog" {
4926                    parser_err!("Expected 'changelog' but found '{}'", changelog);
4927                }
4928                self.expect_keyword(Keyword::FROM)?;
4929                Ok(CteInner::ChangeLog(self.parse_object_name()?))
4930            }
4931        }
4932    }
4933
4934    /// Parse a "query body", which is an expression with roughly the
4935    /// following grammar:
4936    /// ```text
4937    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
4938    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
4939    ///   subquery ::= query_body [ order_by_limit ]
4940    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
4941    /// ```
4942    fn parse_query_body(&mut self, precedence: u8) -> ModalResult<SetExpr> {
4943        // We parse the expression using a Pratt parser, as in `parse_expr()`.
4944        // Start by parsing a restricted SELECT or a `(subquery)`:
4945        let mut expr = if self.parse_keyword(Keyword::SELECT) {
4946            SetExpr::Select(Box::new(self.parse_select()?))
4947        } else if self.consume_token(&Token::LParen) {
4948            // CTEs are not allowed here, but the parser currently accepts them
4949            let subquery = self.parse_query()?;
4950            self.expect_token(&Token::RParen)?;
4951            SetExpr::Query(Box::new(subquery))
4952        } else if self.parse_keyword(Keyword::VALUES) {
4953            SetExpr::Values(self.parse_values()?)
4954        } else {
4955            return self.expected("SELECT, VALUES, or a subquery in the query body");
4956        };
4957
4958        loop {
4959            // The query can be optionally followed by a set operator:
4960            let op = self.parse_set_operator(&self.peek_token().token);
4961            let next_precedence = match op {
4962                // UNION and EXCEPT have the same binding power and evaluate left-to-right
4963                Some(SetOperator::Union) | Some(SetOperator::Except) => 10,
4964                // INTERSECT has higher precedence than UNION/EXCEPT
4965                Some(SetOperator::Intersect) => 20,
4966                // Unexpected token or EOF => stop parsing the query body
4967                None => break,
4968            };
4969            if precedence >= next_precedence {
4970                break;
4971            }
4972            self.next_token(); // skip past the set operator
4973
4974            let all = self.parse_keyword(Keyword::ALL);
4975            let corresponding = self.parse_corresponding()?;
4976
4977            expr = SetExpr::SetOperation {
4978                left: Box::new(expr),
4979                op: op.unwrap(),
4980                corresponding,
4981                all,
4982                right: Box::new(self.parse_query_body(next_precedence)?),
4983            };
4984        }
4985
4986        Ok(expr)
4987    }
4988
4989    fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
4990        match token {
4991            Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
4992            Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
4993            Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
4994            _ => None,
4995        }
4996    }
4997
4998    fn parse_corresponding(&mut self) -> ModalResult<Corresponding> {
4999        let corresponding = if self.parse_keyword(Keyword::CORRESPONDING) {
5000            let column_list = if self.parse_keyword(Keyword::BY) {
5001                Some(self.parse_parenthesized_column_list(IsOptional::Mandatory)?)
5002            } else {
5003                None
5004            };
5005            Corresponding::with_column_list(column_list)
5006        } else {
5007            Corresponding::none()
5008        };
5009        Ok(corresponding)
5010    }
5011
5012    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
5013    /// assuming the initial `SELECT` was already consumed
5014    pub fn parse_select(&mut self) -> ModalResult<Select> {
5015        let distinct = self.parse_all_or_distinct_on()?;
5016
5017        let projection = self.parse_comma_separated(Parser::parse_select_item)?;
5018
5019        // Note that for keywords to be properly handled here, they need to be
5020        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
5021        // otherwise they may be parsed as an alias as part of the `projection`
5022        // or `from`.
5023
5024        let from = if self.parse_keyword(Keyword::FROM) {
5025            self.parse_comma_separated(Parser::parse_table_and_joins)?
5026        } else {
5027            vec![]
5028        };
5029        let mut lateral_views = vec![];
5030        loop {
5031            if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
5032                let outer = self.parse_keyword(Keyword::OUTER);
5033                let lateral_view = self.parse_expr()?;
5034                let lateral_view_name = self.parse_object_name()?;
5035                let lateral_col_alias = self
5036                    .parse_comma_separated(|parser| {
5037                        parser.parse_optional_alias(&[
5038                            Keyword::WHERE,
5039                            Keyword::GROUP,
5040                            Keyword::CLUSTER,
5041                            Keyword::HAVING,
5042                            Keyword::LATERAL,
5043                        ]) // This couldn't possibly be a bad idea
5044                    })?
5045                    .into_iter()
5046                    .flatten()
5047                    .collect();
5048
5049                lateral_views.push(LateralView {
5050                    lateral_view,
5051                    lateral_view_name,
5052                    lateral_col_alias,
5053                    outer,
5054                });
5055            } else {
5056                break;
5057            }
5058        }
5059
5060        let selection = if self.parse_keyword(Keyword::WHERE) {
5061            Some(self.parse_expr()?)
5062        } else {
5063            None
5064        };
5065
5066        let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
5067            self.parse_comma_separated(Parser::parse_group_by_expr)?
5068        } else {
5069            vec![]
5070        };
5071
5072        let having = if self.parse_keyword(Keyword::HAVING) {
5073            Some(self.parse_expr()?)
5074        } else {
5075            None
5076        };
5077
5078        let window = if self.parse_keyword(Keyword::WINDOW) {
5079            self.parse_comma_separated(Parser::parse_named_window)?
5080        } else {
5081            vec![]
5082        };
5083
5084        Ok(Select {
5085            distinct,
5086            projection,
5087            from,
5088            lateral_views,
5089            selection,
5090            group_by,
5091            having,
5092            window,
5093        })
5094    }
5095
5096    pub fn parse_set(&mut self) -> ModalResult<Statement> {
5097        let modifier = self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL]);
5098        if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
5099            let value = alt((
5100                Keyword::DEFAULT.value(SetTimeZoneValue::Default),
5101                Keyword::LOCAL.value(SetTimeZoneValue::Local),
5102                preceded(
5103                    Keyword::INTERVAL,
5104                    cut_err(Self::parse_literal_interval.try_map(|e| match e {
5105                        // support a special case for clients which would send when initializing the connection
5106                        // like: SET TIME ZONE INTERVAL '+00:00' HOUR TO MINUTE;
5107                        Expr::Value(v) => match v {
5108                            Value::Interval { value, .. } => {
5109                                if value != "+00:00" {
5110                                    return Err(StrError("only support \"+00:00\" ".into()));
5111                                }
5112                                Ok(SetTimeZoneValue::Ident(Ident::with_quote_unchecked(
5113                                    '\'',
5114                                    "UTC".to_owned(),
5115                                )))
5116                            }
5117                            _ => Err(StrError("expect Value::Interval".into())),
5118                        },
5119                        _ => Err(StrError("expect Expr::Value".into())),
5120                    })),
5121                ),
5122                Self::parse_identifier.map(SetTimeZoneValue::Ident),
5123                Self::ensure_parse_value.map(SetTimeZoneValue::Literal),
5124            ))
5125            .expect("variable")
5126            .parse_next(self)?;
5127
5128            Ok(Statement::SetTimeZone {
5129                local: modifier == Some(Keyword::LOCAL),
5130                value,
5131            })
5132        } else if self.parse_keyword(Keyword::CHARACTERISTICS) && modifier == Some(Keyword::SESSION)
5133        {
5134            self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
5135            Ok(Statement::SetTransaction {
5136                modes: self.parse_transaction_modes()?,
5137                snapshot: None,
5138                session: true,
5139            })
5140        } else if self.parse_keyword(Keyword::TRANSACTION) && modifier.is_none() {
5141            if self.parse_keyword(Keyword::SNAPSHOT) {
5142                let snapshot_id = self.ensure_parse_value()?;
5143                return Ok(Statement::SetTransaction {
5144                    modes: vec![],
5145                    snapshot: Some(snapshot_id),
5146                    session: false,
5147                });
5148            }
5149            Ok(Statement::SetTransaction {
5150                modes: self.parse_transaction_modes()?,
5151                snapshot: None,
5152                session: false,
5153            })
5154        } else {
5155            let config_param = self.parse_config_param()?;
5156            Ok(Statement::SetVariable {
5157                local: modifier == Some(Keyword::LOCAL),
5158                variable: config_param.param,
5159                value: config_param.value,
5160            })
5161        }
5162    }
5163
5164    /// If have `databases`,`tables`,`columns`,`schemas` and `materialized views` after show,
5165    /// return `Statement::ShowCommand` or `Statement::ShowColumn`,
5166    /// otherwise, return `Statement::ShowVariable`.
5167    pub fn parse_show(&mut self) -> ModalResult<Statement> {
5168        let checkpoint = *self;
5169        if let Token::Word(w) = self.next_token().token {
5170            match w.keyword {
5171                Keyword::TABLES => {
5172                    return Ok(Statement::ShowObjects {
5173                        object: ShowObject::Table {
5174                            schema: self.parse_from_and_identifier()?,
5175                        },
5176                        filter: self.parse_show_statement_filter()?,
5177                    });
5178                }
5179                Keyword::INTERNAL => {
5180                    self.expect_keyword(Keyword::TABLES)?;
5181                    return Ok(Statement::ShowObjects {
5182                        object: ShowObject::InternalTable {
5183                            schema: self.parse_from_and_identifier()?,
5184                        },
5185                        filter: self.parse_show_statement_filter()?,
5186                    });
5187                }
5188                Keyword::SOURCES => {
5189                    return Ok(Statement::ShowObjects {
5190                        object: ShowObject::Source {
5191                            schema: self.parse_from_and_identifier()?,
5192                        },
5193                        filter: self.parse_show_statement_filter()?,
5194                    });
5195                }
5196                Keyword::SINKS => {
5197                    return Ok(Statement::ShowObjects {
5198                        object: ShowObject::Sink {
5199                            schema: self.parse_from_and_identifier()?,
5200                        },
5201                        filter: self.parse_show_statement_filter()?,
5202                    });
5203                }
5204                Keyword::SUBSCRIPTIONS => {
5205                    return Ok(Statement::ShowObjects {
5206                        object: ShowObject::Subscription {
5207                            schema: self.parse_from_and_identifier()?,
5208                        },
5209                        filter: self.parse_show_statement_filter()?,
5210                    });
5211                }
5212                Keyword::DATABASES => {
5213                    return Ok(Statement::ShowObjects {
5214                        object: ShowObject::Database,
5215                        filter: self.parse_show_statement_filter()?,
5216                    });
5217                }
5218                Keyword::SCHEMAS => {
5219                    return Ok(Statement::ShowObjects {
5220                        object: ShowObject::Schema,
5221                        filter: self.parse_show_statement_filter()?,
5222                    });
5223                }
5224                Keyword::VIEWS => {
5225                    return Ok(Statement::ShowObjects {
5226                        object: ShowObject::View {
5227                            schema: self.parse_from_and_identifier()?,
5228                        },
5229                        filter: self.parse_show_statement_filter()?,
5230                    });
5231                }
5232                Keyword::MATERIALIZED => {
5233                    if self.parse_keyword(Keyword::VIEWS) {
5234                        return Ok(Statement::ShowObjects {
5235                            object: ShowObject::MaterializedView {
5236                                schema: self.parse_from_and_identifier()?,
5237                            },
5238                            filter: self.parse_show_statement_filter()?,
5239                        });
5240                    } else {
5241                        return self.expected("VIEWS after MATERIALIZED");
5242                    }
5243                }
5244                Keyword::COLUMNS => {
5245                    if self.parse_keyword(Keyword::FROM) {
5246                        return Ok(Statement::ShowObjects {
5247                            object: ShowObject::Columns {
5248                                table: self.parse_object_name()?,
5249                            },
5250                            filter: self.parse_show_statement_filter()?,
5251                        });
5252                    } else {
5253                        return self.expected("from after columns");
5254                    }
5255                }
5256                Keyword::SECRETS => {
5257                    return Ok(Statement::ShowObjects {
5258                        object: ShowObject::Secret {
5259                            schema: self.parse_from_and_identifier()?,
5260                        },
5261                        filter: self.parse_show_statement_filter()?,
5262                    });
5263                }
5264                Keyword::CONNECTIONS => {
5265                    return Ok(Statement::ShowObjects {
5266                        object: ShowObject::Connection {
5267                            schema: self.parse_from_and_identifier()?,
5268                        },
5269                        filter: self.parse_show_statement_filter()?,
5270                    });
5271                }
5272                Keyword::FUNCTIONS => {
5273                    return Ok(Statement::ShowObjects {
5274                        object: ShowObject::Function {
5275                            schema: self.parse_from_and_identifier()?,
5276                        },
5277                        filter: self.parse_show_statement_filter()?,
5278                    });
5279                }
5280                Keyword::INDEXES => {
5281                    if self.parse_keyword(Keyword::FROM) {
5282                        return Ok(Statement::ShowObjects {
5283                            object: ShowObject::Indexes {
5284                                table: self.parse_object_name()?,
5285                            },
5286                            filter: self.parse_show_statement_filter()?,
5287                        });
5288                    } else {
5289                        return self.expected("from after indexes");
5290                    }
5291                }
5292                Keyword::CLUSTER => {
5293                    return Ok(Statement::ShowObjects {
5294                        object: ShowObject::Cluster,
5295                        filter: self.parse_show_statement_filter()?,
5296                    });
5297                }
5298                Keyword::JOBS => {
5299                    return Ok(Statement::ShowObjects {
5300                        object: ShowObject::Jobs,
5301                        filter: self.parse_show_statement_filter()?,
5302                    });
5303                }
5304                Keyword::PROCESSLIST => {
5305                    return Ok(Statement::ShowObjects {
5306                        object: ShowObject::ProcessList,
5307                        filter: self.parse_show_statement_filter()?,
5308                    });
5309                }
5310                Keyword::TRANSACTION => {
5311                    self.expect_keywords(&[Keyword::ISOLATION, Keyword::LEVEL])?;
5312                    return Ok(Statement::ShowTransactionIsolationLevel);
5313                }
5314                Keyword::CURSORS => {
5315                    return Ok(Statement::ShowObjects {
5316                        object: ShowObject::Cursor,
5317                        filter: None,
5318                    });
5319                }
5320                Keyword::SUBSCRIPTION => {
5321                    self.expect_keyword(Keyword::CURSORS)?;
5322                    return Ok(Statement::ShowObjects {
5323                        object: ShowObject::SubscriptionCursor,
5324                        filter: None,
5325                    });
5326                }
5327                _ => {}
5328            }
5329        }
5330        *self = checkpoint;
5331        Ok(Statement::ShowVariable {
5332            variable: self.parse_identifiers()?,
5333        })
5334    }
5335
5336    pub fn parse_cancel_job(&mut self) -> ModalResult<Statement> {
5337        // CANCEL [JOBS|JOB] job_ids
5338        match self.peek_token().token {
5339            Token::Word(w) if Keyword::JOBS == w.keyword || Keyword::JOB == w.keyword => {
5340                self.next_token();
5341            }
5342            _ => return self.expected("JOBS or JOB after CANCEL"),
5343        }
5344
5345        let mut job_ids = vec![];
5346        loop {
5347            job_ids.push(self.parse_literal_u32()?);
5348            if !self.consume_token(&Token::Comma) {
5349                break;
5350            }
5351        }
5352        Ok(Statement::CancelJobs(JobIdents(job_ids)))
5353    }
5354
5355    pub fn parse_kill_process(&mut self) -> ModalResult<Statement> {
5356        let worker_process_id = self.parse_literal_string()?;
5357        Ok(Statement::Kill(worker_process_id))
5358    }
5359
5360    /// Parser `from schema` after `show tables` and `show materialized views`, if not conclude
5361    /// `from` then use default schema name.
5362    pub fn parse_from_and_identifier(&mut self) -> ModalResult<Option<Ident>> {
5363        if self.parse_keyword(Keyword::FROM) {
5364            Ok(Some(self.parse_identifier_non_reserved()?))
5365        } else {
5366            Ok(None)
5367        }
5368    }
5369
5370    /// Parse object type and name after `show create`.
5371    pub fn parse_show_create(&mut self) -> ModalResult<Statement> {
5372        if let Token::Word(w) = self.next_token().token {
5373            let show_type = match w.keyword {
5374                Keyword::TABLE => ShowCreateType::Table,
5375                Keyword::MATERIALIZED => {
5376                    if self.parse_keyword(Keyword::VIEW) {
5377                        ShowCreateType::MaterializedView
5378                    } else {
5379                        return self.expected("VIEW after MATERIALIZED");
5380                    }
5381                }
5382                Keyword::VIEW => ShowCreateType::View,
5383                Keyword::INDEX => ShowCreateType::Index,
5384                Keyword::SOURCE => ShowCreateType::Source,
5385                Keyword::SINK => ShowCreateType::Sink,
5386                Keyword::SUBSCRIPTION => ShowCreateType::Subscription,
5387                Keyword::FUNCTION => ShowCreateType::Function,
5388                _ => return self.expected(
5389                    "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5390                ),
5391            };
5392            return Ok(Statement::ShowCreateObject {
5393                create_type: show_type,
5394                name: self.parse_object_name()?,
5395            });
5396        }
5397        self.expected(
5398            "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5399        )
5400    }
5401
5402    pub fn parse_show_statement_filter(&mut self) -> ModalResult<Option<ShowStatementFilter>> {
5403        if self.parse_keyword(Keyword::LIKE) {
5404            Ok(Some(ShowStatementFilter::Like(
5405                self.parse_literal_string()?,
5406            )))
5407        } else if self.parse_keyword(Keyword::ILIKE) {
5408            Ok(Some(ShowStatementFilter::ILike(
5409                self.parse_literal_string()?,
5410            )))
5411        } else if self.parse_keyword(Keyword::WHERE) {
5412            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
5413        } else {
5414            Ok(None)
5415        }
5416    }
5417
5418    pub fn parse_table_and_joins(&mut self) -> ModalResult<TableWithJoins> {
5419        let relation = self.parse_table_factor()?;
5420
5421        // Note that for keywords to be properly handled here, they need to be
5422        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
5423        // a table alias.
5424        let mut joins = vec![];
5425        loop {
5426            let join = if self.parse_keyword(Keyword::CROSS) {
5427                let join_operator = if self.parse_keyword(Keyword::JOIN) {
5428                    JoinOperator::CrossJoin
5429                } else {
5430                    return self.expected("JOIN after CROSS");
5431                };
5432                Join {
5433                    relation: self.parse_table_factor()?,
5434                    join_operator,
5435                }
5436            } else {
5437                let (natural, asof) =
5438                    match self.parse_one_of_keywords(&[Keyword::NATURAL, Keyword::ASOF]) {
5439                        Some(Keyword::NATURAL) => (true, false),
5440                        Some(Keyword::ASOF) => (false, true),
5441                        Some(_) => unreachable!(),
5442                        None => (false, false),
5443                    };
5444                let peek_keyword = if let Token::Word(w) = self.peek_token().token {
5445                    w.keyword
5446                } else {
5447                    Keyword::NoKeyword
5448                };
5449
5450                let join_operator_type = match peek_keyword {
5451                    Keyword::INNER | Keyword::JOIN => {
5452                        let _ = self.parse_keyword(Keyword::INNER);
5453                        self.expect_keyword(Keyword::JOIN)?;
5454                        if asof {
5455                            JoinOperator::AsOfInner
5456                        } else {
5457                            JoinOperator::Inner
5458                        }
5459                    }
5460                    kw @ Keyword::LEFT | kw @ Keyword::RIGHT | kw @ Keyword::FULL => {
5461                        let checkpoint = *self;
5462                        let _ = self.next_token();
5463                        let _ = self.parse_keyword(Keyword::OUTER);
5464                        self.expect_keyword(Keyword::JOIN)?;
5465                        if asof {
5466                            if Keyword::LEFT == kw {
5467                                JoinOperator::AsOfLeft
5468                            } else {
5469                                return self.expected_at(
5470                                    checkpoint,
5471                                    "LEFT after ASOF. RIGHT or FULL are not supported",
5472                                );
5473                            }
5474                        } else {
5475                            match kw {
5476                                Keyword::LEFT => JoinOperator::LeftOuter,
5477                                Keyword::RIGHT => JoinOperator::RightOuter,
5478                                Keyword::FULL => JoinOperator::FullOuter,
5479                                _ => unreachable!(),
5480                            }
5481                        }
5482                    }
5483                    Keyword::OUTER => {
5484                        return self.expected("LEFT, RIGHT, or FULL");
5485                    }
5486                    _ if natural => {
5487                        return self.expected("a join type after NATURAL");
5488                    }
5489                    _ if asof => {
5490                        return self.expected("a join type after ASOF");
5491                    }
5492                    _ => break,
5493                };
5494                let relation = self.parse_table_factor()?;
5495                let join_constraint = self.parse_join_constraint(natural)?;
5496                let join_operator = join_operator_type(join_constraint);
5497                let need_constraint = match join_operator {
5498                    JoinOperator::Inner(JoinConstraint::None) => Some("INNER JOIN"),
5499                    JoinOperator::AsOfInner(JoinConstraint::None) => Some("ASOF INNER JOIN"),
5500                    JoinOperator::AsOfLeft(JoinConstraint::None) => Some("ASOF LEFT JOIN"),
5501                    _ => None,
5502                };
5503                if let Some(join_type) = need_constraint {
5504                    return self.expected(&format!("join constraint after {join_type}"));
5505                }
5506
5507                Join {
5508                    relation,
5509                    join_operator,
5510                }
5511            };
5512            joins.push(join);
5513        }
5514        Ok(TableWithJoins { relation, joins })
5515    }
5516
5517    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
5518    pub fn parse_table_factor(&mut self) -> ModalResult<TableFactor> {
5519        if self.parse_keyword(Keyword::LATERAL) {
5520            // LATERAL must always be followed by a subquery.
5521            if !self.consume_token(&Token::LParen) {
5522                self.expected("subquery after LATERAL")?;
5523            }
5524            self.parse_derived_table_factor(Lateral)
5525        } else if self.consume_token(&Token::LParen) {
5526            // A left paren introduces either a derived table (i.e., a subquery)
5527            // or a nested join. It's nearly impossible to determine ahead of
5528            // time which it is... so we just try to parse both.
5529            //
5530            // Here's an example that demonstrates the complexity:
5531            //                     /-------------------------------------------------------\
5532            //                     | /-----------------------------------\                 |
5533            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
5534            //                   ^ ^ ^ ^
5535            //                   | | | |
5536            //                   | | | |
5537            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
5538            //                   | | (3) starts a derived table (subquery)
5539            //                   | (2) starts a nested join
5540            //                   (1) an additional set of parens around a nested join
5541            //
5542
5543            // It can only be a subquery. We don't use `maybe_parse` so that a meaningful error can
5544            // be returned.
5545            match self.peek_token().token {
5546                Token::Word(w)
5547                    if [Keyword::SELECT, Keyword::WITH, Keyword::VALUES].contains(&w.keyword) =>
5548                {
5549                    return self.parse_derived_table_factor(NotLateral);
5550                }
5551                _ => {}
5552            };
5553            // It can still be a subquery, e.g., the case (3) in the example above:
5554            // (SELECT 1) UNION (SELECT 2)
5555            // TODO: how to produce a good error message here?
5556            if self.peek_token() == Token::LParen {
5557                return_ok_if_some!(
5558                    self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))
5559                );
5560            }
5561
5562            // A parsing error from `parse_derived_table_factor` indicates that the '(' we've
5563            // recently consumed does not start a derived table (cases 1, 2, or 4).
5564            // `maybe_parse` will ignore such an error and rewind to be after the opening '('.
5565
5566            // Inside the parentheses we expect to find an (A) table factor
5567            // followed by some joins or (B) another level of nesting.
5568            let table_and_joins = self.parse_table_and_joins()?;
5569
5570            if !table_and_joins.joins.is_empty() {
5571                self.expect_token(&Token::RParen)?;
5572                Ok(TableFactor::NestedJoin(Box::new(table_and_joins))) // (A)
5573            } else if let TableFactor::NestedJoin(_) = &table_and_joins.relation {
5574                // (B): `table_and_joins` (what we found inside the parentheses)
5575                // is a nested join `(foo JOIN bar)`, not followed by other joins.
5576                self.expect_token(&Token::RParen)?;
5577                Ok(TableFactor::NestedJoin(Box::new(table_and_joins)))
5578            } else {
5579                // The SQL spec prohibits derived tables and bare tables from
5580                // appearing alone in parentheses (e.g. `FROM (mytable)`)
5581                parser_err!(
5582                    "Expected joined table, found: {table_and_joins}, next_token: {}",
5583                    self.peek_token()
5584                );
5585            }
5586        } else {
5587            let name = self.parse_object_name()?;
5588            if self.peek_token() == Token::LParen {
5589                // table-valued function
5590
5591                let arg_list = self.parse_argument_list()?;
5592                if arg_list.distinct {
5593                    parser_err!("DISTINCT is not supported in table-valued function calls");
5594                }
5595                if !arg_list.order_by.is_empty() {
5596                    parser_err!("ORDER BY is not supported in table-valued function calls");
5597                }
5598                if arg_list.ignore_nulls {
5599                    parser_err!("IGNORE NULLS is not supported in table-valued function calls");
5600                }
5601
5602                let args = arg_list.args;
5603                let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
5604                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5605
5606                Ok(TableFactor::TableFunction {
5607                    name,
5608                    alias,
5609                    args,
5610                    with_ordinality,
5611                })
5612            } else {
5613                let as_of = opt(Self::parse_as_of).parse_next(self)?;
5614                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5615                Ok(TableFactor::Table { name, alias, as_of })
5616            }
5617        }
5618    }
5619
5620    pub fn parse_derived_table_factor(&mut self, lateral: IsLateral) -> ModalResult<TableFactor> {
5621        let subquery = Box::new(self.parse_query()?);
5622        self.expect_token(&Token::RParen)?;
5623        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5624        Ok(TableFactor::Derived {
5625            lateral: match lateral {
5626                Lateral => true,
5627                NotLateral => false,
5628            },
5629            subquery,
5630            alias,
5631        })
5632    }
5633
5634    fn parse_join_constraint(&mut self, natural: bool) -> ModalResult<JoinConstraint> {
5635        if natural {
5636            Ok(JoinConstraint::Natural)
5637        } else if self.parse_keyword(Keyword::ON) {
5638            let constraint = self.parse_expr()?;
5639            Ok(JoinConstraint::On(constraint))
5640        } else if self.parse_keyword(Keyword::USING) {
5641            let columns = self.parse_parenthesized_column_list(Mandatory)?;
5642            Ok(JoinConstraint::Using(columns))
5643        } else {
5644            Ok(JoinConstraint::None)
5645            // self.expected("ON, or USING after JOIN")
5646        }
5647    }
5648
5649    /// Parse a GRANT statement.
5650    pub fn parse_grant(&mut self) -> ModalResult<Statement> {
5651        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5652
5653        self.expect_keyword(Keyword::TO)?;
5654        let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5655
5656        let with_grant_option =
5657            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
5658
5659        let granted_by = self
5660            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5661            .then(|| self.parse_identifier().unwrap());
5662
5663        Ok(Statement::Grant {
5664            privileges,
5665            objects,
5666            grantees,
5667            with_grant_option,
5668            granted_by,
5669        })
5670    }
5671
5672    fn parse_privileges(&mut self) -> ModalResult<Privileges> {
5673        let privileges = if self.parse_keyword(Keyword::ALL) {
5674            Privileges::All {
5675                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
5676            }
5677        } else {
5678            Privileges::Actions(
5679                self.parse_comma_separated(Parser::parse_grant_permission)?
5680                    .into_iter()
5681                    .map(|(kw, columns)| match kw {
5682                        Keyword::CONNECT => Action::Connect,
5683                        Keyword::CREATE => Action::Create,
5684                        Keyword::DELETE => Action::Delete,
5685                        Keyword::EXECUTE => Action::Execute,
5686                        Keyword::INSERT => Action::Insert { columns },
5687                        Keyword::REFERENCES => Action::References { columns },
5688                        Keyword::SELECT => Action::Select { columns },
5689                        Keyword::TEMPORARY => Action::Temporary,
5690                        Keyword::TRIGGER => Action::Trigger,
5691                        Keyword::TRUNCATE => Action::Truncate,
5692                        Keyword::UPDATE => Action::Update { columns },
5693                        Keyword::USAGE => Action::Usage,
5694                        _ => unreachable!(),
5695                    })
5696                    .collect(),
5697            )
5698        };
5699
5700        Ok(privileges)
5701    }
5702
5703    fn parse_grant_revoke_privileges_objects(&mut self) -> ModalResult<(Privileges, GrantObjects)> {
5704        let privileges = self.parse_privileges()?;
5705
5706        self.expect_keyword(Keyword::ON)?;
5707
5708        let objects = if self.parse_keywords(&[
5709            Keyword::ALL,
5710            Keyword::TABLES,
5711            Keyword::IN,
5712            Keyword::SCHEMA,
5713        ]) {
5714            GrantObjects::AllTablesInSchema {
5715                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5716            }
5717        } else if self.parse_keywords(&[
5718            Keyword::ALL,
5719            Keyword::SEQUENCES,
5720            Keyword::IN,
5721            Keyword::SCHEMA,
5722        ]) {
5723            GrantObjects::AllSequencesInSchema {
5724                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5725            }
5726        } else if self.parse_keywords(&[
5727            Keyword::ALL,
5728            Keyword::SOURCES,
5729            Keyword::IN,
5730            Keyword::SCHEMA,
5731        ]) {
5732            GrantObjects::AllSourcesInSchema {
5733                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5734            }
5735        } else if self.parse_keywords(&[Keyword::ALL, Keyword::SINKS, Keyword::IN, Keyword::SCHEMA])
5736        {
5737            GrantObjects::AllSinksInSchema {
5738                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5739            }
5740        } else if self.parse_keywords(&[
5741            Keyword::ALL,
5742            Keyword::MATERIALIZED,
5743            Keyword::VIEWS,
5744            Keyword::IN,
5745            Keyword::SCHEMA,
5746        ]) {
5747            GrantObjects::AllMviewsInSchema {
5748                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5749            }
5750        } else if self.parse_keywords(&[Keyword::ALL, Keyword::VIEWS, Keyword::IN, Keyword::SCHEMA])
5751        {
5752            GrantObjects::AllViewsInSchema {
5753                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5754            }
5755        } else if self.parse_keywords(&[
5756            Keyword::ALL,
5757            Keyword::FUNCTIONS,
5758            Keyword::IN,
5759            Keyword::SCHEMA,
5760        ]) {
5761            GrantObjects::AllFunctionsInSchema {
5762                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5763            }
5764        } else if self.parse_keywords(&[
5765            Keyword::ALL,
5766            Keyword::SECRETS,
5767            Keyword::IN,
5768            Keyword::SCHEMA,
5769        ]) {
5770            GrantObjects::AllSecretsInSchema {
5771                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5772            }
5773        } else if self.parse_keywords(&[
5774            Keyword::ALL,
5775            Keyword::CONNECTIONS,
5776            Keyword::IN,
5777            Keyword::SCHEMA,
5778        ]) {
5779            GrantObjects::AllConnectionsInSchema {
5780                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5781            }
5782        } else if self.parse_keywords(&[
5783            Keyword::ALL,
5784            Keyword::SUBSCRIPTIONS,
5785            Keyword::IN,
5786            Keyword::SCHEMA,
5787        ]) {
5788            GrantObjects::AllSubscriptionsInSchema {
5789                schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5790            }
5791        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
5792            GrantObjects::Mviews(self.parse_comma_separated(Parser::parse_object_name)?)
5793        } else {
5794            let object_type = self.parse_one_of_keywords(&[
5795                Keyword::SEQUENCE,
5796                Keyword::DATABASE,
5797                Keyword::SCHEMA,
5798                Keyword::TABLE,
5799                Keyword::SOURCE,
5800                Keyword::SINK,
5801                Keyword::VIEW,
5802                Keyword::SUBSCRIPTION,
5803                Keyword::FUNCTION,
5804                Keyword::CONNECTION,
5805                Keyword::SECRET,
5806            ]);
5807            if let Some(Keyword::FUNCTION) = object_type {
5808                let func_descs = self.parse_comma_separated(Parser::parse_function_desc)?;
5809                GrantObjects::Functions(func_descs)
5810            } else {
5811                let objects = self.parse_comma_separated(Parser::parse_object_name);
5812                match object_type {
5813                    Some(Keyword::DATABASE) => GrantObjects::Databases(objects?),
5814                    Some(Keyword::SCHEMA) => GrantObjects::Schemas(objects?),
5815                    Some(Keyword::SEQUENCE) => GrantObjects::Sequences(objects?),
5816                    Some(Keyword::SOURCE) => GrantObjects::Sources(objects?),
5817                    Some(Keyword::SINK) => GrantObjects::Sinks(objects?),
5818                    Some(Keyword::VIEW) => GrantObjects::Views(objects?),
5819                    Some(Keyword::SUBSCRIPTION) => GrantObjects::Subscriptions(objects?),
5820                    Some(Keyword::CONNECTION) => GrantObjects::Connections(objects?),
5821                    Some(Keyword::SECRET) => GrantObjects::Secrets(objects?),
5822                    Some(Keyword::TABLE) | None => GrantObjects::Tables(objects?),
5823                    _ => unreachable!(),
5824                }
5825            }
5826        };
5827
5828        Ok((privileges, objects))
5829    }
5830
5831    fn parse_grant_permission(&mut self) -> ModalResult<(Keyword, Option<Vec<Ident>>)> {
5832        let kw = self.expect_one_of_keywords(&[
5833            Keyword::CONNECT,
5834            Keyword::CREATE,
5835            Keyword::DELETE,
5836            Keyword::EXECUTE,
5837            Keyword::INSERT,
5838            Keyword::REFERENCES,
5839            Keyword::SELECT,
5840            Keyword::TEMPORARY,
5841            Keyword::TRIGGER,
5842            Keyword::TRUNCATE,
5843            Keyword::UPDATE,
5844            Keyword::USAGE,
5845        ])?;
5846        let columns = match kw {
5847            Keyword::INSERT | Keyword::REFERENCES | Keyword::SELECT | Keyword::UPDATE => {
5848                let columns = self.parse_parenthesized_column_list(Optional)?;
5849                if columns.is_empty() {
5850                    None
5851                } else {
5852                    Some(columns)
5853                }
5854            }
5855            _ => None,
5856        };
5857        Ok((kw, columns))
5858    }
5859
5860    /// Parse a REVOKE statement
5861    pub fn parse_revoke(&mut self) -> ModalResult<Statement> {
5862        let revoke_grant_option =
5863            self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
5864        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5865
5866        self.expect_keyword(Keyword::FROM)?;
5867        let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5868
5869        let granted_by = self
5870            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5871            .then(|| self.parse_identifier().unwrap());
5872
5873        let cascade = self.parse_keyword(Keyword::CASCADE);
5874        let restrict = self.parse_keyword(Keyword::RESTRICT);
5875        if cascade && restrict {
5876            parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE");
5877        }
5878
5879        Ok(Statement::Revoke {
5880            privileges,
5881            objects,
5882            grantees,
5883            granted_by,
5884            revoke_grant_option,
5885            cascade,
5886        })
5887    }
5888
5889    fn parse_privilege_object_types(&mut self) -> ModalResult<PrivilegeObjectType> {
5890        let object_type = if self.parse_keyword(Keyword::TABLES) {
5891            PrivilegeObjectType::Tables
5892        } else if self.parse_keyword(Keyword::SOURCES) {
5893            PrivilegeObjectType::Sources
5894        } else if self.parse_keyword(Keyword::SINKS) {
5895            PrivilegeObjectType::Sinks
5896        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
5897            PrivilegeObjectType::Mviews
5898        } else if self.parse_keyword(Keyword::VIEWS) {
5899            PrivilegeObjectType::Views
5900        } else if self.parse_keyword(Keyword::FUNCTIONS) {
5901            PrivilegeObjectType::Functions
5902        } else if self.parse_keyword(Keyword::SECRETS) {
5903            PrivilegeObjectType::Secrets
5904        } else if self.parse_keyword(Keyword::CONNECTIONS) {
5905            PrivilegeObjectType::Connections
5906        } else if self.parse_keyword(Keyword::SUBSCRIPTIONS) {
5907            PrivilegeObjectType::Subscriptions
5908        } else if self.parse_keyword(Keyword::SCHEMAS) {
5909            PrivilegeObjectType::Schemas
5910        } else {
5911            return self.expected("TABLES, SOURCES, SINKS, MATERIALIZED VIEWS, VIEWS, FUNCTIONS, SECRETS, CONNECTIONS, SUBSCRIPTIONS or SCHEMAS");
5912        };
5913
5914        Ok(object_type)
5915    }
5916
5917    pub fn parse_alter_default_privileges(&mut self) -> ModalResult<Statement> {
5918        // [ FOR USER target_user [, ...] ]
5919        let target_users = if self.parse_keyword(Keyword::FOR) {
5920            self.expect_keyword(Keyword::USER)?;
5921            Some(self.parse_comma_separated(Parser::parse_identifier)?)
5922        } else {
5923            None
5924        };
5925
5926        // [ IN SCHEMA schema_name [, ...] ]
5927        let schema_names = if self.parse_keywords(&[Keyword::IN, Keyword::SCHEMA]) {
5928            Some(self.parse_comma_separated(Parser::parse_object_name)?)
5929        } else {
5930            None
5931        };
5932        let keyword = self.expect_one_of_keywords(&[Keyword::GRANT, Keyword::REVOKE])?;
5933        let for_grant = keyword == Keyword::GRANT;
5934        if for_grant {
5935            let privileges = self.parse_privileges()?;
5936            self.expect_keyword(Keyword::ON)?;
5937            let object_type = self.parse_privilege_object_types()?;
5938            if schema_names.is_some() && object_type == PrivilegeObjectType::Schemas {
5939                parser_err!("cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS");
5940            }
5941            self.expect_keyword(Keyword::TO)?;
5942            let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5943
5944            let with_grant_option =
5945                self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
5946
5947            Ok(Statement::AlterDefaultPrivileges {
5948                target_users,
5949                schema_names,
5950                operation: DefaultPrivilegeOperation::Grant {
5951                    privileges,
5952                    object_type,
5953                    grantees,
5954                    with_grant_option,
5955                },
5956            })
5957        } else {
5958            let revoke_grant_option =
5959                self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
5960            let privileges = self.parse_privileges()?;
5961            self.expect_keyword(Keyword::ON)?;
5962            let object_type = self.parse_privilege_object_types()?;
5963            if schema_names.is_some() && object_type == PrivilegeObjectType::Schemas {
5964                parser_err!("cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS");
5965            }
5966            self.expect_keyword(Keyword::FROM)?;
5967            let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5968            let cascade = self.parse_keyword(Keyword::CASCADE);
5969            let restrict = self.parse_keyword(Keyword::RESTRICT);
5970            if cascade && restrict {
5971                parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE");
5972            }
5973
5974            Ok(Statement::AlterDefaultPrivileges {
5975                target_users,
5976                schema_names,
5977                operation: DefaultPrivilegeOperation::Revoke {
5978                    privileges,
5979                    object_type,
5980                    grantees,
5981                    revoke_grant_option,
5982                    cascade,
5983                },
5984            })
5985        }
5986    }
5987
5988    /// Parse an INSERT statement
5989    pub fn parse_insert(&mut self) -> ModalResult<Statement> {
5990        self.expect_keyword(Keyword::INTO)?;
5991
5992        let table_name = self.parse_object_name()?;
5993        let columns = self.parse_parenthesized_column_list(Optional)?;
5994
5995        let source = Box::new(self.parse_query()?);
5996        let returning = self.parse_returning(Optional)?;
5997        Ok(Statement::Insert {
5998            table_name,
5999            columns,
6000            source,
6001            returning,
6002        })
6003    }
6004
6005    pub fn parse_update(&mut self) -> ModalResult<Statement> {
6006        let table_name = self.parse_object_name()?;
6007
6008        self.expect_keyword(Keyword::SET)?;
6009        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
6010        let selection = if self.parse_keyword(Keyword::WHERE) {
6011            Some(self.parse_expr()?)
6012        } else {
6013            None
6014        };
6015        let returning = self.parse_returning(Optional)?;
6016        Ok(Statement::Update {
6017            table_name,
6018            assignments,
6019            selection,
6020            returning,
6021        })
6022    }
6023
6024    /// Parse a `var = expr` assignment, used in an UPDATE statement
6025    pub fn parse_assignment(&mut self) -> ModalResult<Assignment> {
6026        let id = self.parse_identifiers_non_keywords()?;
6027        self.expect_token(&Token::Eq)?;
6028
6029        let value = if self.parse_keyword(Keyword::DEFAULT) {
6030            AssignmentValue::Default
6031        } else {
6032            AssignmentValue::Expr(self.parse_expr()?)
6033        };
6034
6035        Ok(Assignment { id, value })
6036    }
6037
6038    /// Parse a `[VARIADIC] name => expr`.
6039    fn parse_function_args(&mut self) -> ModalResult<(bool, FunctionArg)> {
6040        let variadic = self.parse_keyword(Keyword::VARIADIC);
6041        let arg = if self.peek_nth_token(1) == Token::RArrow {
6042            let name = self.parse_identifier()?;
6043
6044            self.expect_token(&Token::RArrow)?;
6045            let arg = if self.parse_keyword(Keyword::SECRET) {
6046                FunctionArgExpr::SecretRef(self.parse_secret_ref()?)
6047            } else {
6048                self.parse_wildcard_or_expr()?.into()
6049            };
6050
6051            FunctionArg::Named { name, arg }
6052        } else if self.parse_keyword(Keyword::SECRET) {
6053            FunctionArg::Unnamed(FunctionArgExpr::SecretRef(self.parse_secret_ref()?))
6054        } else {
6055            FunctionArg::Unnamed(self.parse_wildcard_or_expr()?.into())
6056        };
6057        Ok((variadic, arg))
6058    }
6059
6060    pub fn parse_argument_list(&mut self) -> ModalResult<FunctionArgList> {
6061        self.expect_token(&Token::LParen)?;
6062        if self.consume_token(&Token::RParen) {
6063            Ok(FunctionArgList::empty())
6064        } else {
6065            let distinct = self.parse_all_or_distinct()?;
6066            let args = self.parse_comma_separated(Parser::parse_function_args)?;
6067            if args
6068                .iter()
6069                .take(args.len() - 1)
6070                .any(|(variadic, _)| *variadic)
6071            {
6072                parser_err!("VARIADIC argument must be the last");
6073            }
6074            let variadic = args.last().map(|(variadic, _)| *variadic).unwrap_or(false);
6075            let args = args.into_iter().map(|(_, arg)| arg).collect();
6076
6077            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6078                self.parse_comma_separated(Parser::parse_order_by_expr)?
6079            } else {
6080                vec![]
6081            };
6082
6083            let ignore_nulls = self.parse_keywords(&[Keyword::IGNORE, Keyword::NULLS]);
6084
6085            let arg_list = FunctionArgList {
6086                distinct,
6087                args,
6088                variadic,
6089                order_by,
6090                ignore_nulls,
6091            };
6092
6093            self.expect_token(&Token::RParen)?;
6094            Ok(arg_list)
6095        }
6096    }
6097
6098    /// Parse a comma-delimited list of projections after SELECT
6099    pub fn parse_select_item(&mut self) -> ModalResult<SelectItem> {
6100        match self.parse_wildcard_or_expr()? {
6101            WildcardOrExpr::Expr(expr) => self
6102                .parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
6103                .map(|alias| match alias {
6104                    Some(alias) => SelectItem::ExprWithAlias { expr, alias },
6105                    None => SelectItem::UnnamedExpr(expr),
6106                }),
6107            WildcardOrExpr::QualifiedWildcard(prefix, except) => {
6108                Ok(SelectItem::QualifiedWildcard(prefix, except))
6109            }
6110            WildcardOrExpr::ExprQualifiedWildcard(expr, prefix) => {
6111                Ok(SelectItem::ExprQualifiedWildcard(expr, prefix))
6112            }
6113            WildcardOrExpr::Wildcard(except) => Ok(SelectItem::Wildcard(except)),
6114        }
6115    }
6116
6117    /// Parse an expression, optionally followed by ASC or DESC (used in ORDER BY)
6118    pub fn parse_order_by_expr(&mut self) -> ModalResult<OrderByExpr> {
6119        let expr = self.parse_expr()?;
6120
6121        let asc = if self.parse_keyword(Keyword::ASC) {
6122            Some(true)
6123        } else if self.parse_keyword(Keyword::DESC) {
6124            Some(false)
6125        } else {
6126            None
6127        };
6128
6129        let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
6130            Some(true)
6131        } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
6132            Some(false)
6133        } else {
6134            None
6135        };
6136
6137        Ok(OrderByExpr {
6138            expr,
6139            asc,
6140            nulls_first,
6141        })
6142    }
6143
6144    /// Parse a LIMIT clause
6145    pub fn parse_limit(&mut self) -> ModalResult<Option<Expr>> {
6146        if self.parse_keyword(Keyword::ALL) {
6147            Ok(None)
6148        } else {
6149            let expr = self.parse_expr()?;
6150            Ok(Some(expr))
6151        }
6152    }
6153
6154    /// Parse an OFFSET clause
6155    pub fn parse_offset(&mut self) -> ModalResult<String> {
6156        let value = self.parse_number_value()?;
6157        // TODO(Kexiang): support LIMIT expr
6158        if self.consume_token(&Token::DoubleColon) {
6159            self.expect_keyword(Keyword::BIGINT)?;
6160        }
6161        _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
6162        Ok(value)
6163    }
6164
6165    /// Parse a FETCH clause
6166    pub fn parse_fetch(&mut self) -> ModalResult<Fetch> {
6167        self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
6168        let quantity = if self
6169            .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
6170            .is_some()
6171        {
6172            None
6173        } else {
6174            let quantity = self.parse_number_value()?;
6175            self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
6176            Some(quantity)
6177        };
6178        let with_ties = if self.parse_keyword(Keyword::ONLY) {
6179            false
6180        } else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
6181            true
6182        } else {
6183            return self.expected("one of ONLY or WITH TIES");
6184        };
6185        Ok(Fetch {
6186            with_ties,
6187            quantity,
6188        })
6189    }
6190
6191    pub fn parse_values(&mut self) -> ModalResult<Values> {
6192        let values = self.parse_comma_separated(|parser| {
6193            parser.expect_token(&Token::LParen)?;
6194            let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
6195            parser.expect_token(&Token::RParen)?;
6196            Ok(exprs)
6197        })?;
6198        Ok(Values(values))
6199    }
6200
6201    pub fn parse_start_transaction(&mut self) -> ModalResult<Statement> {
6202        self.expect_keyword(Keyword::TRANSACTION)?;
6203        Ok(Statement::StartTransaction {
6204            modes: self.parse_transaction_modes()?,
6205        })
6206    }
6207
6208    pub fn parse_begin(&mut self) -> ModalResult<Statement> {
6209        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
6210        Ok(Statement::Begin {
6211            modes: self.parse_transaction_modes()?,
6212        })
6213    }
6214
6215    pub fn parse_transaction_modes(&mut self) -> ModalResult<Vec<TransactionMode>> {
6216        let mut modes = vec![];
6217        let mut required = false;
6218        loop {
6219            let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
6220                let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
6221                    TransactionIsolationLevel::ReadUncommitted
6222                } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
6223                    TransactionIsolationLevel::ReadCommitted
6224                } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
6225                    TransactionIsolationLevel::RepeatableRead
6226                } else if self.parse_keyword(Keyword::SERIALIZABLE) {
6227                    TransactionIsolationLevel::Serializable
6228                } else {
6229                    self.expected("isolation level")?
6230                };
6231                TransactionMode::IsolationLevel(iso_level)
6232            } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
6233                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
6234            } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
6235                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
6236            } else if required {
6237                self.expected("transaction mode")?
6238            } else {
6239                break;
6240            };
6241            modes.push(mode);
6242            // ANSI requires a comma after each transaction mode, but
6243            // PostgreSQL, for historical reasons, does not. We follow
6244            // PostgreSQL in making the comma optional, since that is strictly
6245            // more general.
6246            required = self.consume_token(&Token::Comma);
6247        }
6248        Ok(modes)
6249    }
6250
6251    pub fn parse_commit(&mut self) -> ModalResult<Statement> {
6252        Ok(Statement::Commit {
6253            chain: self.parse_commit_rollback_chain()?,
6254        })
6255    }
6256
6257    pub fn parse_rollback(&mut self) -> ModalResult<Statement> {
6258        Ok(Statement::Rollback {
6259            chain: self.parse_commit_rollback_chain()?,
6260        })
6261    }
6262
6263    pub fn parse_commit_rollback_chain(&mut self) -> ModalResult<bool> {
6264        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
6265        if self.parse_keyword(Keyword::AND) {
6266            let chain = !self.parse_keyword(Keyword::NO);
6267            self.expect_keyword(Keyword::CHAIN)?;
6268            Ok(chain)
6269        } else {
6270            Ok(false)
6271        }
6272    }
6273
6274    fn parse_deallocate(&mut self) -> ModalResult<Statement> {
6275        let prepare = self.parse_keyword(Keyword::PREPARE);
6276        let name = if self.parse_keyword(Keyword::ALL) {
6277            None
6278        } else {
6279            Some(self.parse_identifier()?)
6280        };
6281        Ok(Statement::Deallocate { name, prepare })
6282    }
6283
6284    fn parse_execute(&mut self) -> ModalResult<Statement> {
6285        let name = self.parse_identifier()?;
6286
6287        let mut parameters = vec![];
6288        if self.consume_token(&Token::LParen) {
6289            parameters = self.parse_comma_separated(Parser::parse_expr)?;
6290            self.expect_token(&Token::RParen)?;
6291        }
6292
6293        Ok(Statement::Execute { name, parameters })
6294    }
6295
6296    fn parse_prepare(&mut self) -> ModalResult<Statement> {
6297        let name = self.parse_identifier()?;
6298
6299        let mut data_types = vec![];
6300        if self.consume_token(&Token::LParen) {
6301            data_types = self.parse_comma_separated(Parser::parse_data_type)?;
6302            self.expect_token(&Token::RParen)?;
6303        }
6304
6305        self.expect_keyword(Keyword::AS)?;
6306        let statement = Box::new(self.parse_statement()?);
6307        Ok(Statement::Prepare {
6308            name,
6309            data_types,
6310            statement,
6311        })
6312    }
6313
6314    fn parse_comment(&mut self) -> ModalResult<Statement> {
6315        self.expect_keyword(Keyword::ON)?;
6316        let checkpoint = *self;
6317        let token = self.next_token();
6318
6319        let (object_type, object_name) = match token.token {
6320            Token::Word(w) if w.keyword == Keyword::COLUMN => {
6321                let object_name = self.parse_object_name()?;
6322                (CommentObject::Column, object_name)
6323            }
6324            Token::Word(w) if w.keyword == Keyword::TABLE => {
6325                let object_name = self.parse_object_name()?;
6326                (CommentObject::Table, object_name)
6327            }
6328            _ => self.expected_at(checkpoint, "comment object_type")?,
6329        };
6330
6331        self.expect_keyword(Keyword::IS)?;
6332        let comment = if self.parse_keyword(Keyword::NULL) {
6333            None
6334        } else {
6335            Some(self.parse_literal_string()?)
6336        };
6337        Ok(Statement::Comment {
6338            object_type,
6339            object_name,
6340            comment,
6341        })
6342    }
6343
6344    fn parse_use(&mut self) -> ModalResult<Statement> {
6345        let db_name = self.parse_object_name()?;
6346        Ok(Statement::Use { db_name })
6347    }
6348
6349    /// Parse a named window definition for the WINDOW clause
6350    pub fn parse_named_window(&mut self) -> ModalResult<NamedWindow> {
6351        let name = self.parse_identifier()?;
6352        self.expect_keywords(&[Keyword::AS])?;
6353        self.expect_token(&Token::LParen)?;
6354        let window_spec = self.parse_window_spec()?;
6355        self.expect_token(&Token::RParen)?;
6356        Ok(NamedWindow { name, window_spec })
6357    }
6358
6359    /// Parse a window specification (contents of OVER clause or WINDOW clause)
6360    pub fn parse_window_spec(&mut self) -> ModalResult<WindowSpec> {
6361        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
6362            self.parse_comma_separated(Parser::parse_expr)?
6363        } else {
6364            vec![]
6365        };
6366        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6367            self.parse_comma_separated(Parser::parse_order_by_expr)?
6368        } else {
6369            vec![]
6370        };
6371        let window_frame = if !self.peek_token().eq(&Token::RParen) {
6372            Some(self.parse_window_frame()?)
6373        } else {
6374            None
6375        };
6376        Ok(WindowSpec {
6377            partition_by,
6378            order_by,
6379            window_frame,
6380        })
6381    }
6382
6383    pub fn parse_wait(&mut self) -> ModalResult<Statement> {
6384        let target = if self.parse_keyword(Keyword::TABLE) {
6385            WaitTarget::Table(self.parse_object_name()?)
6386        } else if self.parse_keyword(Keyword::MATERIALIZED) {
6387            self.expect_keyword(Keyword::VIEW)?;
6388            WaitTarget::MaterializedView(self.parse_object_name()?)
6389        } else if self.parse_keyword(Keyword::SINK) {
6390            WaitTarget::Sink(self.parse_object_name()?)
6391        } else if self.parse_keyword(Keyword::INDEX) {
6392            WaitTarget::Index(self.parse_object_name()?)
6393        } else {
6394            WaitTarget::All
6395        };
6396
6397        Ok(Statement::Wait(target))
6398    }
6399}
6400
6401impl Word {
6402    /// Convert a Word to a Identifier, return ParserError when the Word's value is a empty string.
6403    pub fn to_ident(&self) -> ModalResult<Ident> {
6404        if self.value.is_empty() {
6405            parser_err!("zero-length delimited identifier at or near \"{self}\"")
6406        } else {
6407            Ok(Ident {
6408                value: self.value.clone(),
6409                quote_style: self.quote_style,
6410            })
6411        }
6412    }
6413}
6414
6415#[cfg(test)]
6416mod tests {
6417    use super::*;
6418    use crate::test_utils::run_parser_method;
6419
6420    #[test]
6421    fn test_parse_integer_min() {
6422        let min_bigint = "-9223372036854775808";
6423        run_parser_method(min_bigint, |parser| {
6424            assert_eq!(
6425                parser.parse_expr().unwrap(),
6426                Expr::Value(Value::Number("-9223372036854775808".to_owned()))
6427            )
6428        });
6429    }
6430
6431    #[test]
6432    fn test_parse_function_arg_secret_ref() {
6433        use crate::ast::{FunctionArg, FunctionArgExpr, SecretRefAsType, SecretRefValue};
6434
6435        // Unnamed secret argument
6436        run_parser_method("SECRET my_secret", |parser| {
6437            let (_variadic, arg) = parser.parse_function_args().unwrap();
6438            assert_eq!(
6439                arg,
6440                FunctionArg::Unnamed(FunctionArgExpr::SecretRef(SecretRefValue {
6441                    secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6442                    ref_as: SecretRefAsType::Text,
6443                }))
6444            );
6445        });
6446
6447        // Unnamed secret argument with AS FILE
6448        run_parser_method("SECRET my_secret AS FILE", |parser| {
6449            let (_variadic, arg) = parser.parse_function_args().unwrap();
6450            assert_eq!(
6451                arg,
6452                FunctionArg::Unnamed(FunctionArgExpr::SecretRef(SecretRefValue {
6453                    secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6454                    ref_as: SecretRefAsType::File,
6455                }))
6456            );
6457        });
6458
6459        // Named secret argument
6460        run_parser_method("header => SECRET my_secret", |parser| {
6461            let (_variadic, arg) = parser.parse_function_args().unwrap();
6462            assert_eq!(
6463                arg,
6464                FunctionArg::Named {
6465                    name: Ident::new_unchecked("header"),
6466                    arg: FunctionArgExpr::SecretRef(SecretRefValue {
6467                        secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6468                        ref_as: SecretRefAsType::Text,
6469                    }),
6470                }
6471            );
6472        });
6473    }
6474}