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