risingwave_sqlparser/
parser.rs

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