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