Skip to main content

sqlparser/parser/
mod.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::{
24    fmt::{self, Display},
25    str::FromStr,
26};
27use helpers::attached_token::AttachedToken;
28
29use log::debug;
30
31use recursion::RecursionCounter;
32use IsLateral::*;
33use IsOptional::*;
34
35use crate::ast::*;
36use crate::ast::{
37    comments,
38    helpers::{
39        key_value_options::{
40            KeyValueOption, KeyValueOptionKind, KeyValueOptions, KeyValueOptionsDelimiter,
41        },
42        stmt_create_table::{CreateTableBuilder, CreateTableConfiguration},
43    },
44};
45use crate::dialect::*;
46use crate::keywords::{Keyword, ALL_KEYWORDS};
47use crate::tokenizer::*;
48use sqlparser::parser::ParserState::ColumnDefinition;
49
50/// Errors produced by the SQL parser.
51#[derive(Debug, Clone, PartialEq, Eq)]
52pub enum ParserError {
53    /// Error originating from the tokenizer with a message.
54    TokenizerError(String),
55    /// Generic parser error with a message.
56    ParserError(String),
57    /// Raised when a recursion depth limit is exceeded.
58    RecursionLimitExceeded,
59}
60
61// Use `Parser::expected` instead, if possible
62macro_rules! parser_err {
63    ($MSG:expr, $loc:expr) => {
64        Err(ParserError::ParserError(format!("{}{}", $MSG, $loc)))
65    };
66}
67
68mod alter;
69mod merge;
70
71#[cfg(feature = "std")]
72/// Implementation [`RecursionCounter`] if std is available
73mod recursion {
74    use std::cell::Cell;
75    use std::rc::Rc;
76
77    use super::ParserError;
78
79    /// Tracks remaining recursion depth. This value is decremented on
80    /// each call to [`RecursionCounter::try_decrease()`], when it reaches 0 an error will
81    /// be returned.
82    ///
83    /// Note: Uses an [`std::rc::Rc`] and [`std::cell::Cell`] in order to satisfy the Rust
84    /// borrow checker so the automatic [`DepthGuard`] decrement a
85    /// reference to the counter.
86    ///
87    /// Note: when "recursive-protection" feature is enabled, this crate uses additional stack overflow protection
88    /// for some of its recursive methods. See [`recursive::recursive`] for more information.
89    pub(crate) struct RecursionCounter {
90        remaining_depth: Rc<Cell<usize>>,
91    }
92
93    impl RecursionCounter {
94        /// Creates a [`RecursionCounter`] with the specified maximum
95        /// depth
96        pub fn new(remaining_depth: usize) -> Self {
97            Self {
98                remaining_depth: Rc::new(remaining_depth.into()),
99            }
100        }
101
102        /// Decreases the remaining depth by 1.
103        ///
104        /// Returns [`Err`] if the remaining depth falls to 0.
105        ///
106        /// Returns a [`DepthGuard`] which will adds 1 to the
107        /// remaining depth upon drop;
108        pub fn try_decrease(&self) -> Result<DepthGuard, ParserError> {
109            let old_value = self.remaining_depth.get();
110            // ran out of space
111            if old_value == 0 {
112                Err(ParserError::RecursionLimitExceeded)
113            } else {
114                self.remaining_depth.set(old_value - 1);
115                Ok(DepthGuard::new(Rc::clone(&self.remaining_depth)))
116            }
117        }
118    }
119
120    /// Guard that increases the remaining depth by 1 on drop
121    pub struct DepthGuard {
122        remaining_depth: Rc<Cell<usize>>,
123    }
124
125    impl DepthGuard {
126        fn new(remaining_depth: Rc<Cell<usize>>) -> Self {
127            Self { remaining_depth }
128        }
129    }
130    impl Drop for DepthGuard {
131        fn drop(&mut self) {
132            let old_value = self.remaining_depth.get();
133            self.remaining_depth.set(old_value + 1);
134        }
135    }
136}
137
138#[cfg(not(feature = "std"))]
139mod recursion {
140    /// Implementation [`RecursionCounter`] if std is NOT available (and does not
141    /// guard against stack overflow).
142    ///
143    /// Has the same API as the std [`RecursionCounter`] implementation
144    /// but does not actually limit stack depth.
145    pub(crate) struct RecursionCounter {}
146
147    impl RecursionCounter {
148        pub fn new(_remaining_depth: usize) -> Self {
149            Self {}
150        }
151        pub fn try_decrease(&self) -> Result<DepthGuard, super::ParserError> {
152            Ok(DepthGuard {})
153        }
154    }
155
156    pub struct DepthGuard {}
157}
158
159#[derive(PartialEq, Eq)]
160/// Indicates whether a parser element is optional or mandatory.
161pub enum IsOptional {
162    /// The element is optional.
163    Optional,
164    /// The element is mandatory.
165    Mandatory,
166}
167
168/// Indicates if a table expression is lateral.
169pub enum IsLateral {
170    /// The expression is lateral.
171    Lateral,
172    /// The expression is not lateral.
173    NotLateral,
174}
175
176/// Represents a wildcard expression used in SELECT lists.
177pub enum WildcardExpr {
178    /// A specific expression used instead of a wildcard.
179    Expr(Expr),
180    /// A qualified wildcard like `table.*`.
181    QualifiedWildcard(ObjectName),
182    /// An unqualified `*` wildcard.
183    Wildcard,
184}
185
186impl From<TokenizerError> for ParserError {
187    fn from(e: TokenizerError) -> Self {
188        ParserError::TokenizerError(e.to_string())
189    }
190}
191
192impl fmt::Display for ParserError {
193    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
194        write!(
195            f,
196            "sql parser error: {}",
197            match self {
198                ParserError::TokenizerError(s) => s,
199                ParserError::ParserError(s) => s,
200                ParserError::RecursionLimitExceeded => "recursion limit exceeded",
201            }
202        )
203    }
204}
205
206impl core::error::Error for ParserError {}
207
208// By default, allow expressions up to this deep before erroring
209const DEFAULT_REMAINING_DEPTH: usize = 50;
210
211// A constant EOF token that can be referenced.
212const EOF_TOKEN: TokenWithSpan = TokenWithSpan {
213    token: Token::EOF,
214    span: Span {
215        start: Location { line: 0, column: 0 },
216        end: Location { line: 0, column: 0 },
217    },
218};
219
220/// Composite types declarations using angle brackets syntax can be arbitrary
221/// nested such that the following declaration is possible:
222///      `ARRAY<ARRAY<INT>>`
223/// But the tokenizer recognizes the `>>` as a ShiftRight token.
224/// We work around that limitation when parsing a data type by accepting
225/// either a `>` or `>>` token in such cases, remembering which variant we
226/// matched.
227/// In the latter case having matched a `>>`, the parent type will not look to
228/// match its closing `>` as a result since that will have taken place at the
229/// child type.
230///
231/// See [Parser::parse_data_type] for details
232struct MatchedTrailingBracket(bool);
233
234impl From<bool> for MatchedTrailingBracket {
235    fn from(value: bool) -> Self {
236        Self(value)
237    }
238}
239
240/// Options that control how the [`Parser`] parses SQL text
241#[derive(Debug, Clone, PartialEq, Eq)]
242pub struct ParserOptions {
243    /// Allow trailing commas in lists (e.g. `a, b,`).
244    pub trailing_commas: bool,
245    /// Controls how literal values are unescaped. See
246    /// [`Tokenizer::with_unescape`] for more details.
247    pub unescape: bool,
248    /// Controls if the parser expects a semi-colon token
249    /// between statements. Default is `true`.
250    pub require_semicolon_stmt_delimiter: bool,
251}
252
253impl Default for ParserOptions {
254    fn default() -> Self {
255        Self {
256            trailing_commas: false,
257            unescape: true,
258            require_semicolon_stmt_delimiter: true,
259        }
260    }
261}
262
263impl ParserOptions {
264    /// Create a new [`ParserOptions`]
265    pub fn new() -> Self {
266        Default::default()
267    }
268
269    /// Set if trailing commas are allowed.
270    ///
271    /// If this option is `false` (the default), the following SQL will
272    /// not parse. If the option is `true`, the SQL will parse.
273    ///
274    /// ```sql
275    ///  SELECT
276    ///   foo,
277    ///   bar,
278    ///  FROM baz
279    /// ```
280    pub fn with_trailing_commas(mut self, trailing_commas: bool) -> Self {
281        self.trailing_commas = trailing_commas;
282        self
283    }
284
285    /// Set if literal values are unescaped. Defaults to true. See
286    /// [`Tokenizer::with_unescape`] for more details.
287    pub fn with_unescape(mut self, unescape: bool) -> Self {
288        self.unescape = unescape;
289        self
290    }
291}
292
293#[derive(Copy, Clone)]
294enum ParserState {
295    /// The default state of the parser.
296    Normal,
297    /// The state when parsing a CONNECT BY expression. This allows parsing
298    /// PRIOR expressions while still allowing prior as an identifier name
299    /// in other contexts.
300    ConnectBy,
301    /// The state when parsing column definitions.  This state prohibits
302    /// NOT NULL as an alias for IS NOT NULL.  For example:
303    /// ```sql
304    /// CREATE TABLE foo (abc BIGINT NOT NULL);
305    /// ```
306    ColumnDefinition,
307}
308
309/// A SQL Parser
310///
311/// This struct is the main entry point for parsing SQL queries.
312///
313/// # Functionality:
314/// * Parsing SQL: see examples on [`Parser::new`] and [`Parser::parse_sql`]
315/// * Controlling recursion: See [`Parser::with_recursion_limit`]
316/// * Controlling parser options: See [`Parser::with_options`]
317/// * Providing your own tokens: See [`Parser::with_tokens`]
318///
319/// # Internals
320///
321/// The parser uses a [`Tokenizer`] to tokenize the input SQL string into a
322/// `Vec` of [`TokenWithSpan`]s and maintains an `index` to the current token
323/// being processed. The token vec may contain multiple SQL statements.
324///
325/// * The "current" token is the token at `index - 1`
326/// * The "next" token is the token at `index`
327/// * The "previous" token is the token at `index - 2`
328///
329/// If `index` is equal to the length of the token stream, the 'next' token is
330/// [`Token::EOF`].
331///
332/// For example, the SQL string "SELECT * FROM foo" will be tokenized into
333/// following tokens:
334/// ```text
335///  [
336///    "SELECT", // token index 0
337///    " ",      // whitespace
338///    "*",
339///    " ",
340///    "FROM",
341///    " ",
342///    "foo"
343///   ]
344/// ```
345///
346///
347pub struct Parser<'a> {
348    /// The tokens
349    tokens: Vec<TokenWithSpan>,
350    /// The index of the first unprocessed token in [`Parser::tokens`].
351    index: usize,
352    /// The current state of the parser.
353    state: ParserState,
354    /// The SQL dialect to use.
355    dialect: &'a dyn Dialect,
356    /// Additional options that allow you to mix & match behavior
357    /// otherwise constrained to certain dialects (e.g. trailing
358    /// commas) and/or format of parse (e.g. unescaping).
359    options: ParserOptions,
360    /// Ensures the stack does not overflow by limiting recursion depth.
361    recursion_counter: RecursionCounter,
362}
363
364impl<'a> Parser<'a> {
365    /// Create a parser for a [`Dialect`]
366    ///
367    /// See also [`Parser::parse_sql`]
368    ///
369    /// Example:
370    /// ```
371    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
372    /// # fn main() -> Result<(), ParserError> {
373    /// let dialect = GenericDialect{};
374    /// let statements = Parser::new(&dialect)
375    ///   .try_with_sql("SELECT * FROM foo")?
376    ///   .parse_statements()?;
377    /// # Ok(())
378    /// # }
379    /// ```
380    pub fn new(dialect: &'a dyn Dialect) -> Self {
381        Self {
382            tokens: vec![],
383            index: 0,
384            state: ParserState::Normal,
385            dialect,
386            recursion_counter: RecursionCounter::new(DEFAULT_REMAINING_DEPTH),
387            options: ParserOptions::new().with_trailing_commas(dialect.supports_trailing_commas()),
388        }
389    }
390
391    /// Specify the maximum recursion limit while parsing.
392    ///
393    /// [`Parser`] prevents stack overflows by returning
394    /// [`ParserError::RecursionLimitExceeded`] if the parser exceeds
395    /// this depth while processing the query.
396    ///
397    /// Example:
398    /// ```
399    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
400    /// # fn main() -> Result<(), ParserError> {
401    /// let dialect = GenericDialect{};
402    /// let result = Parser::new(&dialect)
403    ///   .with_recursion_limit(1)
404    ///   .try_with_sql("SELECT * FROM foo WHERE (a OR (b OR (c OR d)))")?
405    ///   .parse_statements();
406    ///   assert_eq!(result, Err(ParserError::RecursionLimitExceeded));
407    /// # Ok(())
408    /// # }
409    /// ```
410    ///
411    /// Note: when "recursive-protection" feature is enabled, this crate uses additional stack overflow protection
412    //  for some of its recursive methods. See [`recursive::recursive`] for more information.
413    pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
414        self.recursion_counter = RecursionCounter::new(recursion_limit);
415        self
416    }
417
418    /// Specify additional parser options
419    ///
420    /// [`Parser`] supports additional options ([`ParserOptions`])
421    /// that allow you to mix & match behavior otherwise constrained
422    /// to certain dialects (e.g. trailing commas).
423    ///
424    /// Example:
425    /// ```
426    /// # use sqlparser::{parser::{Parser, ParserError, ParserOptions}, dialect::GenericDialect};
427    /// # fn main() -> Result<(), ParserError> {
428    /// let dialect = GenericDialect{};
429    /// let options = ParserOptions::new()
430    ///    .with_trailing_commas(true)
431    ///    .with_unescape(false);
432    /// let result = Parser::new(&dialect)
433    ///   .with_options(options)
434    ///   .try_with_sql("SELECT a, b, COUNT(*), FROM foo GROUP BY a, b,")?
435    ///   .parse_statements();
436    ///   assert!(matches!(result, Ok(_)));
437    /// # Ok(())
438    /// # }
439    /// ```
440    pub fn with_options(mut self, options: ParserOptions) -> Self {
441        self.options = options;
442        self
443    }
444
445    /// Reset this parser to parse the specified token stream
446    pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithSpan>) -> Self {
447        self.tokens = tokens;
448        self.index = 0;
449        self
450    }
451
452    /// Reset this parser state to parse the specified tokens
453    pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
454        // Put in dummy locations
455        let tokens_with_locations: Vec<TokenWithSpan> = tokens
456            .into_iter()
457            .map(|token| TokenWithSpan {
458                token,
459                span: Span::empty(),
460            })
461            .collect();
462        self.with_tokens_with_locations(tokens_with_locations)
463    }
464
465    /// Tokenize the sql string and sets this [`Parser`]'s state to
466    /// parse the resulting tokens
467    ///
468    /// Returns an error if there was an error tokenizing the SQL string.
469    ///
470    /// See example on [`Parser::new()`] for an example
471    pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
472        debug!("Parsing sql '{sql}'...");
473        let tokens = Tokenizer::new(self.dialect, sql)
474            .with_unescape(self.options.unescape)
475            .tokenize_with_location()?;
476        Ok(self.with_tokens_with_locations(tokens))
477    }
478
479    /// Parse potentially multiple statements
480    ///
481    /// Example
482    /// ```
483    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
484    /// # fn main() -> Result<(), ParserError> {
485    /// let dialect = GenericDialect{};
486    /// let statements = Parser::new(&dialect)
487    ///   // Parse a SQL string with 2 separate statements
488    ///   .try_with_sql("SELECT * FROM foo; SELECT * FROM bar;")?
489    ///   .parse_statements()?;
490    /// assert_eq!(statements.len(), 2);
491    /// # Ok(())
492    /// # }
493    /// ```
494    pub fn parse_statements(&mut self) -> Result<Vec<Statement>, ParserError> {
495        let mut stmts = Vec::new();
496        let mut expecting_statement_delimiter = false;
497        loop {
498            // ignore empty statements (between successive statement delimiters)
499            while self.consume_token(&Token::SemiColon) {
500                expecting_statement_delimiter = false;
501            }
502
503            if !self.options.require_semicolon_stmt_delimiter {
504                expecting_statement_delimiter = false;
505            }
506
507            match &self.peek_token_ref().token {
508                Token::EOF => break,
509
510                // end of statement
511                Token::Word(word)
512                    if expecting_statement_delimiter && word.keyword == Keyword::END =>
513                {
514                    break;
515                }
516                _ => {}
517            }
518
519            if expecting_statement_delimiter {
520                return self.expected_ref("end of statement", self.peek_token_ref());
521            }
522
523            let statement = self.parse_statement()?;
524            stmts.push(statement);
525            expecting_statement_delimiter = true;
526        }
527        Ok(stmts)
528    }
529
530    /// Convenience method to parse a string with one or more SQL
531    /// statements into produce an Abstract Syntax Tree (AST).
532    ///
533    /// Example
534    /// ```
535    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
536    /// # fn main() -> Result<(), ParserError> {
537    /// let dialect = GenericDialect{};
538    /// let statements = Parser::parse_sql(
539    ///   &dialect, "SELECT * FROM foo"
540    /// )?;
541    /// assert_eq!(statements.len(), 1);
542    /// # Ok(())
543    /// # }
544    /// ```
545    pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
546        Parser::new(dialect).try_with_sql(sql)?.parse_statements()
547    }
548
549    /// Parses the given `sql` into an Abstract Syntax Tree (AST), returning
550    /// also encountered source code comments.
551    ///
552    /// See [Parser::parse_sql].
553    pub fn parse_sql_with_comments(
554        dialect: &'a dyn Dialect,
555        sql: &str,
556    ) -> Result<(Vec<Statement>, comments::Comments), ParserError> {
557        let mut p = Parser::new(dialect).try_with_sql(sql)?;
558        p.parse_statements().map(|stmts| (stmts, p.into_comments()))
559    }
560
561    /// Consumes this parser returning comments from the parsed token stream.
562    fn into_comments(self) -> comments::Comments {
563        let mut comments = comments::Comments::default();
564        for t in self.tokens.into_iter() {
565            match t.token {
566                Token::Whitespace(Whitespace::SingleLineComment { comment, prefix }) => {
567                    comments.offer(comments::CommentWithSpan {
568                        comment: comments::Comment::SingleLine {
569                            content: comment,
570                            prefix,
571                        },
572                        span: t.span,
573                    });
574                }
575                Token::Whitespace(Whitespace::MultiLineComment(comment)) => {
576                    comments.offer(comments::CommentWithSpan {
577                        comment: comments::Comment::MultiLine(comment),
578                        span: t.span,
579                    });
580                }
581                _ => {}
582            }
583        }
584        comments
585    }
586
587    /// Parse a single top-level statement (such as SELECT, INSERT, CREATE, etc.),
588    /// stopping before the statement separator, if any.
589    pub fn parse_statement(&mut self) -> Result<Statement, ParserError> {
590        let _guard = self.recursion_counter.try_decrease()?;
591
592        // allow the dialect to override statement parsing
593        if let Some(statement) = self.dialect.parse_statement(self) {
594            return statement;
595        }
596
597        let next_token = self.next_token();
598        match &next_token.token {
599            Token::Word(w) => match w.keyword {
600                Keyword::KILL => self.parse_kill(),
601                Keyword::FLUSH => self.parse_flush(),
602                Keyword::DESC => self.parse_explain(DescribeAlias::Desc),
603                Keyword::DESCRIBE => self.parse_explain(DescribeAlias::Describe),
604                Keyword::EXPLAIN => self.parse_explain(DescribeAlias::Explain),
605                Keyword::ANALYZE => self.parse_analyze().map(Into::into),
606                Keyword::CASE => {
607                    self.prev_token();
608                    self.parse_case_stmt().map(Into::into)
609                }
610                Keyword::IF => {
611                    self.prev_token();
612                    self.parse_if_stmt().map(Into::into)
613                }
614                Keyword::WHILE => {
615                    self.prev_token();
616                    self.parse_while().map(Into::into)
617                }
618                Keyword::RAISE => {
619                    self.prev_token();
620                    self.parse_raise_stmt().map(Into::into)
621                }
622                Keyword::SELECT | Keyword::WITH | Keyword::VALUES | Keyword::FROM => {
623                    self.prev_token();
624                    self.parse_query().map(Into::into)
625                }
626                Keyword::TRUNCATE => self.parse_truncate().map(Into::into),
627                Keyword::ATTACH => {
628                    if dialect_of!(self is DuckDbDialect) {
629                        self.parse_attach_duckdb_database()
630                    } else {
631                        self.parse_attach_database()
632                    }
633                }
634                Keyword::DETACH if self.dialect.supports_detach() => {
635                    self.parse_detach_duckdb_database()
636                }
637                Keyword::MSCK => self.parse_msck().map(Into::into),
638                Keyword::CREATE => self.parse_create(),
639                Keyword::CACHE => self.parse_cache_table(),
640                Keyword::DROP => self.parse_drop(),
641                Keyword::DISCARD => self.parse_discard(),
642                Keyword::DECLARE => self.parse_declare(),
643                Keyword::FETCH => self.parse_fetch_statement(),
644                Keyword::DELETE => self.parse_delete(next_token),
645                Keyword::INSERT => self.parse_insert(next_token),
646                Keyword::REPLACE => self.parse_replace(next_token),
647                Keyword::UNCACHE => self.parse_uncache_table(),
648                Keyword::UPDATE => self.parse_update(next_token),
649                Keyword::ALTER => self.parse_alter(),
650                Keyword::CALL => self.parse_call(),
651                Keyword::COPY => self.parse_copy(),
652                Keyword::OPEN => {
653                    self.prev_token();
654                    self.parse_open()
655                }
656                Keyword::CLOSE => self.parse_close(),
657                Keyword::SET => self.parse_set(),
658                Keyword::SHOW => self.parse_show(),
659                Keyword::USE => self.parse_use(),
660                Keyword::GRANT => self.parse_grant().map(Into::into),
661                Keyword::DENY => {
662                    self.prev_token();
663                    self.parse_deny()
664                }
665                Keyword::REVOKE => self.parse_revoke().map(Into::into),
666                Keyword::START => self.parse_start_transaction(),
667                Keyword::BEGIN => self.parse_begin(),
668                Keyword::END => self.parse_end(),
669                Keyword::SAVEPOINT => self.parse_savepoint(),
670                Keyword::RELEASE => self.parse_release(),
671                Keyword::COMMIT => self.parse_commit(),
672                Keyword::RAISERROR => Ok(self.parse_raiserror()?),
673                Keyword::THROW => {
674                    self.prev_token();
675                    self.parse_throw().map(Into::into)
676                }
677                Keyword::ROLLBACK => self.parse_rollback(),
678                Keyword::ASSERT => self.parse_assert(),
679                // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
680                // syntaxes. They are used for Postgres prepared statement.
681                Keyword::DEALLOCATE => self.parse_deallocate(),
682                Keyword::EXECUTE | Keyword::EXEC => self.parse_execute(),
683                Keyword::PREPARE => self.parse_prepare(),
684                Keyword::MERGE => self.parse_merge(next_token).map(Into::into),
685                // `LISTEN`, `UNLISTEN` and `NOTIFY` are Postgres-specific
686                // syntaxes. They are used for Postgres statement.
687                Keyword::LISTEN if self.dialect.supports_listen_notify() => self.parse_listen(),
688                Keyword::UNLISTEN if self.dialect.supports_listen_notify() => self.parse_unlisten(),
689                Keyword::NOTIFY if self.dialect.supports_listen_notify() => self.parse_notify(),
690                // `PRAGMA` is sqlite specific https://www.sqlite.org/pragma.html
691                Keyword::PRAGMA => self.parse_pragma(),
692                Keyword::UNLOAD => {
693                    self.prev_token();
694                    self.parse_unload()
695                }
696                Keyword::RENAME => self.parse_rename(),
697                // `INSTALL` is duckdb specific https://duckdb.org/docs/extensions/overview
698                Keyword::INSTALL if self.dialect.supports_install() => self.parse_install(),
699                Keyword::LOAD => self.parse_load(),
700                Keyword::LOCK => {
701                    self.prev_token();
702                    self.parse_lock_statement().map(Into::into)
703                }
704                Keyword::OPTIMIZE if self.dialect.supports_optimize_table() => {
705                    self.parse_optimize_table()
706                }
707                // `COMMENT` is snowflake specific https://docs.snowflake.com/en/sql-reference/sql/comment
708                Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
709                Keyword::PRINT => self.parse_print(),
710                // `WAITFOR` is MSSQL specific https://learn.microsoft.com/en-us/sql/t-sql/language-elements/waitfor-transact-sql
711                Keyword::WAITFOR => self.parse_waitfor(),
712                Keyword::RETURN => self.parse_return(),
713                Keyword::EXPORT => {
714                    self.prev_token();
715                    self.parse_export_data()
716                }
717                Keyword::VACUUM => {
718                    self.prev_token();
719                    self.parse_vacuum()
720                }
721                Keyword::RESET => self.parse_reset().map(Into::into),
722                _ => self.expected("an SQL statement", next_token),
723            },
724            Token::LParen => {
725                self.prev_token();
726                self.parse_query().map(Into::into)
727            }
728            _ => self.expected("an SQL statement", next_token),
729        }
730    }
731
732    /// Parse a `CASE` statement.
733    ///
734    /// See [Statement::Case]
735    pub fn parse_case_stmt(&mut self) -> Result<CaseStatement, ParserError> {
736        let case_token = self.expect_keyword(Keyword::CASE)?;
737
738        let match_expr = if self.peek_keyword(Keyword::WHEN) {
739            None
740        } else {
741            Some(self.parse_expr()?)
742        };
743
744        self.expect_keyword_is(Keyword::WHEN)?;
745        let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
746            parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
747        })?;
748
749        let else_block = if self.parse_keyword(Keyword::ELSE) {
750            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
751        } else {
752            None
753        };
754
755        let mut end_case_token = self.expect_keyword(Keyword::END)?;
756        if self.peek_keyword(Keyword::CASE) {
757            end_case_token = self.expect_keyword(Keyword::CASE)?;
758        }
759
760        Ok(CaseStatement {
761            case_token: AttachedToken(case_token),
762            match_expr,
763            when_blocks,
764            else_block,
765            end_case_token: AttachedToken(end_case_token),
766        })
767    }
768
769    /// Parse an `IF` statement.
770    ///
771    /// See [Statement::If]
772    pub fn parse_if_stmt(&mut self) -> Result<IfStatement, ParserError> {
773        self.expect_keyword_is(Keyword::IF)?;
774        let if_block = self.parse_conditional_statement_block(&[
775            Keyword::ELSE,
776            Keyword::ELSEIF,
777            Keyword::END,
778        ])?;
779
780        let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
781            self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
782                parser.parse_conditional_statement_block(&[
783                    Keyword::ELSEIF,
784                    Keyword::ELSE,
785                    Keyword::END,
786                ])
787            })?
788        } else {
789            vec![]
790        };
791
792        let else_block = if self.parse_keyword(Keyword::ELSE) {
793            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
794        } else {
795            None
796        };
797
798        self.expect_keyword_is(Keyword::END)?;
799        let end_token = self.expect_keyword(Keyword::IF)?;
800
801        Ok(IfStatement {
802            if_block,
803            elseif_blocks,
804            else_block,
805            end_token: Some(AttachedToken(end_token)),
806        })
807    }
808
809    /// Parse a `WHILE` statement.
810    ///
811    /// See [Statement::While]
812    fn parse_while(&mut self) -> Result<WhileStatement, ParserError> {
813        self.expect_keyword_is(Keyword::WHILE)?;
814        let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
815
816        Ok(WhileStatement { while_block })
817    }
818
819    /// Parses an expression and associated list of statements
820    /// belonging to a conditional statement like `IF` or `WHEN` or `WHILE`.
821    ///
822    /// Example:
823    /// ```sql
824    /// IF condition THEN statement1; statement2;
825    /// ```
826    fn parse_conditional_statement_block(
827        &mut self,
828        terminal_keywords: &[Keyword],
829    ) -> Result<ConditionalStatementBlock, ParserError> {
830        let start_token = self.get_current_token().clone(); // self.expect_keyword(keyword)?;
831        let mut then_token = None;
832
833        let condition = match &start_token.token {
834            Token::Word(w) if w.keyword == Keyword::ELSE => None,
835            Token::Word(w) if w.keyword == Keyword::WHILE => {
836                let expr = self.parse_expr()?;
837                Some(expr)
838            }
839            _ => {
840                let expr = self.parse_expr()?;
841                then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
842                Some(expr)
843            }
844        };
845
846        let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
847
848        Ok(ConditionalStatementBlock {
849            start_token: AttachedToken(start_token),
850            condition,
851            then_token,
852            conditional_statements,
853        })
854    }
855
856    /// Parse a BEGIN/END block or a sequence of statements
857    /// This could be inside of a conditional (IF, CASE, WHILE etc.) or an object body defined optionally BEGIN/END and one or more statements.
858    pub(crate) fn parse_conditional_statements(
859        &mut self,
860        terminal_keywords: &[Keyword],
861    ) -> Result<ConditionalStatements, ParserError> {
862        let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
863            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
864            let statements = self.parse_statement_list(terminal_keywords)?;
865            let end_token = self.expect_keyword(Keyword::END)?;
866
867            ConditionalStatements::BeginEnd(BeginEndStatements {
868                begin_token: AttachedToken(begin_token),
869                statements,
870                end_token: AttachedToken(end_token),
871            })
872        } else {
873            ConditionalStatements::Sequence {
874                statements: self.parse_statement_list(terminal_keywords)?,
875            }
876        };
877        Ok(conditional_statements)
878    }
879
880    /// Parse a `RAISE` statement.
881    ///
882    /// See [Statement::Raise]
883    pub fn parse_raise_stmt(&mut self) -> Result<RaiseStatement, ParserError> {
884        self.expect_keyword_is(Keyword::RAISE)?;
885
886        let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
887            self.expect_token(&Token::Eq)?;
888            Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
889        } else {
890            self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
891        };
892
893        Ok(RaiseStatement { value })
894    }
895    /// Parse a COMMENT statement.
896    ///
897    /// See [Statement::Comment]
898    pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
899        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
900
901        self.expect_keyword_is(Keyword::ON)?;
902        let token = self.next_token();
903
904        let (object_type, object_name) = match token.token {
905            Token::Word(w) if w.keyword == Keyword::COLLATION => {
906                (CommentObject::Collation, self.parse_object_name(false)?)
907            }
908            Token::Word(w) if w.keyword == Keyword::COLUMN => {
909                (CommentObject::Column, self.parse_object_name(false)?)
910            }
911            Token::Word(w) if w.keyword == Keyword::DATABASE => {
912                (CommentObject::Database, self.parse_object_name(false)?)
913            }
914            Token::Word(w) if w.keyword == Keyword::DOMAIN => {
915                (CommentObject::Domain, self.parse_object_name(false)?)
916            }
917            Token::Word(w) if w.keyword == Keyword::EXTENSION => {
918                (CommentObject::Extension, self.parse_object_name(false)?)
919            }
920            Token::Word(w) if w.keyword == Keyword::FUNCTION => {
921                (CommentObject::Function, self.parse_object_name(false)?)
922            }
923            Token::Word(w) if w.keyword == Keyword::INDEX => {
924                (CommentObject::Index, self.parse_object_name(false)?)
925            }
926            Token::Word(w) if w.keyword == Keyword::MATERIALIZED => {
927                self.expect_keyword_is(Keyword::VIEW)?;
928                (
929                    CommentObject::MaterializedView,
930                    self.parse_object_name(false)?,
931                )
932            }
933            Token::Word(w) if w.keyword == Keyword::PROCEDURE => {
934                (CommentObject::Procedure, self.parse_object_name(false)?)
935            }
936            Token::Word(w) if w.keyword == Keyword::ROLE => {
937                (CommentObject::Role, self.parse_object_name(false)?)
938            }
939            Token::Word(w) if w.keyword == Keyword::SCHEMA => {
940                (CommentObject::Schema, self.parse_object_name(false)?)
941            }
942            Token::Word(w) if w.keyword == Keyword::SEQUENCE => {
943                (CommentObject::Sequence, self.parse_object_name(false)?)
944            }
945            Token::Word(w) if w.keyword == Keyword::TABLE => {
946                (CommentObject::Table, self.parse_object_name(false)?)
947            }
948            Token::Word(w) if w.keyword == Keyword::TYPE => {
949                (CommentObject::Type, self.parse_object_name(false)?)
950            }
951            Token::Word(w) if w.keyword == Keyword::USER => {
952                (CommentObject::User, self.parse_object_name(false)?)
953            }
954            Token::Word(w) if w.keyword == Keyword::VIEW => {
955                (CommentObject::View, self.parse_object_name(false)?)
956            }
957            _ => self.expected("comment object_type", token)?,
958        };
959
960        self.expect_keyword_is(Keyword::IS)?;
961        let comment = if self.parse_keyword(Keyword::NULL) {
962            None
963        } else {
964            Some(self.parse_literal_string()?)
965        };
966        Ok(Statement::Comment {
967            object_type,
968            object_name,
969            comment,
970            if_exists,
971        })
972    }
973
974    /// Parse `FLUSH` statement.
975    pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
976        let mut channel = None;
977        let mut tables: Vec<ObjectName> = vec![];
978        let mut read_lock = false;
979        let mut export = false;
980
981        if !dialect_of!(self is MySqlDialect | GenericDialect) {
982            return parser_err!(
983                "Unsupported statement FLUSH",
984                self.peek_token_ref().span.start
985            );
986        }
987
988        let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
989            Some(FlushLocation::NoWriteToBinlog)
990        } else if self.parse_keyword(Keyword::LOCAL) {
991            Some(FlushLocation::Local)
992        } else {
993            None
994        };
995
996        let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
997            FlushType::BinaryLogs
998        } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
999            FlushType::EngineLogs
1000        } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
1001            FlushType::ErrorLogs
1002        } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
1003            FlushType::GeneralLogs
1004        } else if self.parse_keywords(&[Keyword::HOSTS]) {
1005            FlushType::Hosts
1006        } else if self.parse_keyword(Keyword::PRIVILEGES) {
1007            FlushType::Privileges
1008        } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
1009            FlushType::OptimizerCosts
1010        } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
1011            if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
1012                channel = Some(self.parse_object_name(false)?.to_string());
1013            }
1014            FlushType::RelayLogs
1015        } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
1016            FlushType::SlowLogs
1017        } else if self.parse_keyword(Keyword::STATUS) {
1018            FlushType::Status
1019        } else if self.parse_keyword(Keyword::USER_RESOURCES) {
1020            FlushType::UserResources
1021        } else if self.parse_keywords(&[Keyword::LOGS]) {
1022            FlushType::Logs
1023        } else if self.parse_keywords(&[Keyword::TABLES]) {
1024            loop {
1025                let next_token = self.next_token();
1026                match &next_token.token {
1027                    Token::Word(w) => match w.keyword {
1028                        Keyword::WITH => {
1029                            read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
1030                        }
1031                        Keyword::FOR => {
1032                            export = self.parse_keyword(Keyword::EXPORT);
1033                        }
1034                        Keyword::NoKeyword => {
1035                            self.prev_token();
1036                            tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
1037                        }
1038                        _ => {}
1039                    },
1040                    _ => {
1041                        break;
1042                    }
1043                }
1044            }
1045
1046            FlushType::Tables
1047        } else {
1048            return self.expected_ref(
1049                "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
1050                 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
1051                self.peek_token_ref(),
1052            );
1053        };
1054
1055        Ok(Statement::Flush {
1056            object_type,
1057            location,
1058            channel,
1059            read_lock,
1060            export,
1061            tables,
1062        })
1063    }
1064
1065    /// Parse `MSCK` statement.
1066    pub fn parse_msck(&mut self) -> Result<Msck, ParserError> {
1067        let repair = self.parse_keyword(Keyword::REPAIR);
1068        self.expect_keyword_is(Keyword::TABLE)?;
1069        let table_name = self.parse_object_name(false)?;
1070        let partition_action = self
1071            .maybe_parse(|parser| {
1072                let pa = match parser.parse_one_of_keywords(&[
1073                    Keyword::ADD,
1074                    Keyword::DROP,
1075                    Keyword::SYNC,
1076                ]) {
1077                    Some(Keyword::ADD) => Some(AddDropSync::ADD),
1078                    Some(Keyword::DROP) => Some(AddDropSync::DROP),
1079                    Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
1080                    _ => None,
1081                };
1082                parser.expect_keyword_is(Keyword::PARTITIONS)?;
1083                Ok(pa)
1084            })?
1085            .unwrap_or_default();
1086        Ok(Msck {
1087            repair,
1088            table_name,
1089            partition_action,
1090        })
1091    }
1092
1093    /// Parse `TRUNCATE` statement.
1094    pub fn parse_truncate(&mut self) -> Result<Truncate, ParserError> {
1095        let table = self.parse_keyword(Keyword::TABLE);
1096        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1097
1098        let table_names = self.parse_comma_separated(|p| {
1099            let only = p.parse_keyword(Keyword::ONLY);
1100            let name = p.parse_object_name(false)?;
1101            let has_asterisk = p.consume_token(&Token::Mul);
1102            Ok(TruncateTableTarget {
1103                name,
1104                only,
1105                has_asterisk,
1106            })
1107        })?;
1108
1109        let mut partitions = None;
1110        if self.parse_keyword(Keyword::PARTITION) {
1111            self.expect_token(&Token::LParen)?;
1112            partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1113            self.expect_token(&Token::RParen)?;
1114        }
1115
1116        let mut identity = None;
1117        let mut cascade = None;
1118
1119        if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
1120            identity = if self.parse_keywords(&[Keyword::RESTART, Keyword::IDENTITY]) {
1121                Some(TruncateIdentityOption::Restart)
1122            } else if self.parse_keywords(&[Keyword::CONTINUE, Keyword::IDENTITY]) {
1123                Some(TruncateIdentityOption::Continue)
1124            } else {
1125                None
1126            };
1127
1128            cascade = self.parse_cascade_option();
1129        };
1130
1131        let on_cluster = self.parse_optional_on_cluster()?;
1132
1133        Ok(Truncate {
1134            table_names,
1135            partitions,
1136            table,
1137            if_exists,
1138            identity,
1139            cascade,
1140            on_cluster,
1141        })
1142    }
1143
1144    fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
1145        if self.parse_keyword(Keyword::CASCADE) {
1146            Some(CascadeOption::Cascade)
1147        } else if self.parse_keyword(Keyword::RESTRICT) {
1148            Some(CascadeOption::Restrict)
1149        } else {
1150            None
1151        }
1152    }
1153
1154    /// Parse options for `ATTACH DUCKDB DATABASE` statement.
1155    pub fn parse_attach_duckdb_database_options(
1156        &mut self,
1157    ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
1158        if !self.consume_token(&Token::LParen) {
1159            return Ok(vec![]);
1160        }
1161
1162        let mut options = vec![];
1163        loop {
1164            if self.parse_keyword(Keyword::READ_ONLY) {
1165                let boolean = if self.parse_keyword(Keyword::TRUE) {
1166                    Some(true)
1167                } else if self.parse_keyword(Keyword::FALSE) {
1168                    Some(false)
1169                } else {
1170                    None
1171                };
1172                options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
1173            } else if self.parse_keyword(Keyword::TYPE) {
1174                let ident = self.parse_identifier()?;
1175                options.push(AttachDuckDBDatabaseOption::Type(ident));
1176            } else {
1177                return self
1178                    .expected_ref("expected one of: ), READ_ONLY, TYPE", self.peek_token_ref());
1179            };
1180
1181            if self.consume_token(&Token::RParen) {
1182                return Ok(options);
1183            } else if self.consume_token(&Token::Comma) {
1184                continue;
1185            } else {
1186                return self.expected_ref("expected one of: ')', ','", self.peek_token_ref());
1187            }
1188        }
1189    }
1190
1191    /// Parse `ATTACH DUCKDB DATABASE` statement.
1192    pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1193        let database = self.parse_keyword(Keyword::DATABASE);
1194        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
1195        let database_path = self.parse_identifier()?;
1196        let database_alias = if self.parse_keyword(Keyword::AS) {
1197            Some(self.parse_identifier()?)
1198        } else {
1199            None
1200        };
1201
1202        let attach_options = self.parse_attach_duckdb_database_options()?;
1203        Ok(Statement::AttachDuckDBDatabase {
1204            if_not_exists,
1205            database,
1206            database_path,
1207            database_alias,
1208            attach_options,
1209        })
1210    }
1211
1212    /// Parse `DETACH DUCKDB DATABASE` statement.
1213    pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1214        let database = self.parse_keyword(Keyword::DATABASE);
1215        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1216        let database_alias = self.parse_identifier()?;
1217        Ok(Statement::DetachDuckDBDatabase {
1218            if_exists,
1219            database,
1220            database_alias,
1221        })
1222    }
1223
1224    /// Parse `ATTACH DATABASE` statement.
1225    pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
1226        let database = self.parse_keyword(Keyword::DATABASE);
1227        let database_file_name = self.parse_expr()?;
1228        self.expect_keyword_is(Keyword::AS)?;
1229        let schema_name = self.parse_identifier()?;
1230        Ok(Statement::AttachDatabase {
1231            database,
1232            schema_name,
1233            database_file_name,
1234        })
1235    }
1236
1237    /// Parse `ANALYZE` statement.
1238    pub fn parse_analyze(&mut self) -> Result<Analyze, ParserError> {
1239        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
1240        let table_name = self.maybe_parse(|parser| parser.parse_object_name(false))?;
1241        let mut for_columns = false;
1242        let mut cache_metadata = false;
1243        let mut noscan = false;
1244        let mut partitions = None;
1245        let mut compute_statistics = false;
1246        let mut columns = vec![];
1247
1248        // PostgreSQL syntax: ANALYZE t (col1, col2)
1249        if table_name.is_some() && self.consume_token(&Token::LParen) {
1250            columns = self.parse_comma_separated(|p| p.parse_identifier())?;
1251            self.expect_token(&Token::RParen)?;
1252        }
1253
1254        loop {
1255            match self.parse_one_of_keywords(&[
1256                Keyword::PARTITION,
1257                Keyword::FOR,
1258                Keyword::CACHE,
1259                Keyword::NOSCAN,
1260                Keyword::COMPUTE,
1261            ]) {
1262                Some(Keyword::PARTITION) => {
1263                    self.expect_token(&Token::LParen)?;
1264                    partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1265                    self.expect_token(&Token::RParen)?;
1266                }
1267                Some(Keyword::NOSCAN) => noscan = true,
1268                Some(Keyword::FOR) => {
1269                    self.expect_keyword_is(Keyword::COLUMNS)?;
1270
1271                    columns = self
1272                        .maybe_parse(|parser| {
1273                            parser.parse_comma_separated(|p| p.parse_identifier())
1274                        })?
1275                        .unwrap_or_default();
1276                    for_columns = true
1277                }
1278                Some(Keyword::CACHE) => {
1279                    self.expect_keyword_is(Keyword::METADATA)?;
1280                    cache_metadata = true
1281                }
1282                Some(Keyword::COMPUTE) => {
1283                    self.expect_keyword_is(Keyword::STATISTICS)?;
1284                    compute_statistics = true
1285                }
1286                _ => break,
1287            }
1288        }
1289
1290        Ok(Analyze {
1291            has_table_keyword,
1292            table_name,
1293            for_columns,
1294            columns,
1295            partitions,
1296            cache_metadata,
1297            noscan,
1298            compute_statistics,
1299        })
1300    }
1301
1302    /// Parse a new expression including wildcard & qualified wildcard.
1303    pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
1304        let index = self.index;
1305
1306        let next_token = self.next_token();
1307        match next_token.token {
1308            t @ (Token::Word(_) | Token::SingleQuotedString(_))
1309                if self.peek_token_ref().token == Token::Period =>
1310            {
1311                let mut id_parts: Vec<Ident> = vec![match t {
1312                    Token::Word(w) => w.into_ident(next_token.span),
1313                    Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
1314                    _ => {
1315                        return Err(ParserError::ParserError(
1316                            "Internal parser error: unexpected token type".to_string(),
1317                        ))
1318                    }
1319                }];
1320
1321                while self.consume_token(&Token::Period) {
1322                    let next_token = self.next_token();
1323                    match next_token.token {
1324                        Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
1325                        Token::SingleQuotedString(s) => {
1326                            // SQLite has single-quoted identifiers
1327                            id_parts.push(Ident::with_quote('\'', s))
1328                        }
1329                        Token::Placeholder(s) => {
1330                            // Snowflake uses $1, $2, etc. for positional column references
1331                            // in staged data queries like: SELECT t.$1 FROM @stage t
1332                            id_parts.push(Ident::new(s))
1333                        }
1334                        Token::Mul => {
1335                            return Ok(Expr::QualifiedWildcard(
1336                                ObjectName::from(id_parts),
1337                                AttachedToken(next_token),
1338                            ));
1339                        }
1340                        _ => {
1341                            return self.expected("an identifier or a '*' after '.'", next_token);
1342                        }
1343                    }
1344                }
1345            }
1346            Token::Mul => {
1347                return Ok(Expr::Wildcard(AttachedToken(next_token)));
1348            }
1349            // Handle parenthesized wildcard: (*)
1350            Token::LParen => {
1351                let [maybe_mul, maybe_rparen] = self.peek_tokens_ref();
1352                if maybe_mul.token == Token::Mul && maybe_rparen.token == Token::RParen {
1353                    let mul_token = self.next_token(); // consume Mul
1354                    self.next_token(); // consume RParen
1355                    return Ok(Expr::Wildcard(AttachedToken(mul_token)));
1356                }
1357            }
1358            _ => (),
1359        };
1360
1361        self.index = index;
1362        self.parse_expr()
1363    }
1364
1365    /// Parse a new expression.
1366    pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
1367        self.parse_subexpr(self.dialect.prec_unknown())
1368    }
1369
1370    /// Parse expression with optional alias and order by.
1371    pub fn parse_expr_with_alias_and_order_by(
1372        &mut self,
1373    ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
1374        let expr = self.parse_expr()?;
1375
1376        fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
1377            explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
1378        }
1379        let alias = self.parse_optional_alias_inner(None, validator)?;
1380        let order_by = OrderByOptions {
1381            sort: self.parse_optional_order_by_sort(),
1382            nulls_first: None,
1383        };
1384        Ok(ExprWithAliasAndOrderBy {
1385            expr: ExprWithAlias { expr, alias },
1386            order_by,
1387        })
1388    }
1389
1390    /// Parse tokens until the precedence changes.
1391    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1392    pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
1393        let _guard = self.recursion_counter.try_decrease()?;
1394        debug!("parsing expr");
1395        let mut expr = self.parse_prefix()?;
1396
1397        expr = self.parse_compound_expr(expr, vec![])?;
1398
1399        // Parse an optional collation cast operator following `expr`.
1400        //
1401        // For example (MSSQL): t1.a COLLATE Latin1_General_CI_AS
1402        if !self.in_column_definition_state() && self.parse_keyword(Keyword::COLLATE) {
1403            expr = Expr::Collate {
1404                expr: Box::new(expr),
1405                collation: self.parse_object_name(false)?,
1406            };
1407        }
1408
1409        debug!("prefix: {expr:?}");
1410        loop {
1411            let next_precedence = self.get_next_precedence()?;
1412            debug!("next precedence: {next_precedence:?}");
1413
1414            if precedence >= next_precedence {
1415                break;
1416            }
1417
1418            // The period operator is handled exclusively by the
1419            // compound field access parsing.
1420            if Token::Period == self.peek_token_ref().token {
1421                break;
1422            }
1423
1424            expr = self.parse_infix(expr, next_precedence)?;
1425        }
1426        Ok(expr)
1427    }
1428
1429    /// Parse `ASSERT` statement.
1430    pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
1431        let condition = self.parse_expr()?;
1432        let message = if self.parse_keyword(Keyword::AS) {
1433            Some(self.parse_expr()?)
1434        } else {
1435            None
1436        };
1437
1438        Ok(Statement::Assert { condition, message })
1439    }
1440
1441    /// Parse `SAVEPOINT` statement.
1442    pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
1443        let name = self.parse_identifier()?;
1444        Ok(Statement::Savepoint { name })
1445    }
1446
1447    /// Parse `RELEASE` statement.
1448    pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
1449        let _ = self.parse_keyword(Keyword::SAVEPOINT);
1450        let name = self.parse_identifier()?;
1451
1452        Ok(Statement::ReleaseSavepoint { name })
1453    }
1454
1455    /// Parse `LISTEN` statement.
1456    pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
1457        let channel = self.parse_identifier()?;
1458        Ok(Statement::LISTEN { channel })
1459    }
1460
1461    /// Parse `UNLISTEN` statement.
1462    pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
1463        let channel = if self.consume_token(&Token::Mul) {
1464            Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
1465        } else {
1466            match self.parse_identifier() {
1467                Ok(expr) => expr,
1468                _ => {
1469                    self.prev_token();
1470                    return self.expected_ref("wildcard or identifier", self.peek_token_ref());
1471                }
1472            }
1473        };
1474        Ok(Statement::UNLISTEN { channel })
1475    }
1476
1477    /// Parse `NOTIFY` statement.
1478    pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
1479        let channel = self.parse_identifier()?;
1480        let payload = if self.consume_token(&Token::Comma) {
1481            Some(self.parse_literal_string()?)
1482        } else {
1483            None
1484        };
1485        Ok(Statement::NOTIFY { channel, payload })
1486    }
1487
1488    /// Parses a `RENAME TABLE` statement. See [Statement::RenameTable]
1489    pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
1490        if self.peek_keyword(Keyword::TABLE) {
1491            self.expect_keyword(Keyword::TABLE)?;
1492            let rename_tables = self.parse_comma_separated(|parser| {
1493                let old_name = parser.parse_object_name(false)?;
1494                parser.expect_keyword(Keyword::TO)?;
1495                let new_name = parser.parse_object_name(false)?;
1496
1497                Ok(RenameTable { old_name, new_name })
1498            })?;
1499            Ok(rename_tables.into())
1500        } else {
1501            self.expected_ref("KEYWORD `TABLE` after RENAME", self.peek_token_ref())
1502        }
1503    }
1504
1505    /// Tries to parse an expression by matching the specified word to known keywords that have a special meaning in the dialect.
1506    /// Returns `None if no match is found.
1507    fn parse_expr_prefix_by_reserved_word(
1508        &mut self,
1509        w: &Word,
1510        w_span: Span,
1511    ) -> Result<Option<Expr>, ParserError> {
1512        match w.keyword {
1513            Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
1514                self.prev_token();
1515                Ok(Some(Expr::Value(self.parse_value()?)))
1516            }
1517            Keyword::NULL => {
1518                self.prev_token();
1519                Ok(Some(Expr::Value(self.parse_value()?)))
1520            }
1521            Keyword::CURRENT_CATALOG
1522            | Keyword::CURRENT_USER
1523            | Keyword::SESSION_USER
1524            | Keyword::USER
1525            if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1526                {
1527                    Ok(Some(Expr::Function(Function {
1528                        name: ObjectName::from(vec![w.to_ident(w_span)]),
1529                        uses_odbc_syntax: false,
1530                        parameters: FunctionArguments::None,
1531                        args: FunctionArguments::None,
1532                        null_treatment: None,
1533                        filter: None,
1534                        over: None,
1535                        within_group: vec![],
1536                    })))
1537                }
1538            Keyword::CURRENT_TIMESTAMP
1539            | Keyword::CURRENT_TIME
1540            | Keyword::CURRENT_DATE
1541            | Keyword::LOCALTIME
1542            | Keyword::LOCALTIMESTAMP => {
1543                Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.to_ident(w_span)]))?))
1544            }
1545            Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
1546            Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
1547            Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
1548            Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
1549            Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
1550            Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
1551            Keyword::EXISTS
1552            // Support parsing Databricks has a function named `exists`.
1553            if !dialect_of!(self is DatabricksDialect)
1554                || matches!(
1555                        self.peek_nth_token_ref(1).token,
1556                        Token::Word(Word {
1557                            keyword: Keyword::SELECT | Keyword::WITH,
1558                            ..
1559                        })
1560                    ) =>
1561                {
1562                    Ok(Some(self.parse_exists_expr(false)?))
1563                }
1564            Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
1565            Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
1566            Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
1567            Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
1568                Ok(Some(self.parse_position_expr(w.to_ident(w_span))?))
1569            }
1570            Keyword::SUBSTR | Keyword::SUBSTRING => {
1571                self.prev_token();
1572                Ok(Some(self.parse_substring()?))
1573            }
1574            Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
1575            Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
1576            Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
1577            // Treat ARRAY[1,2,3] as an array [1,2,3], otherwise try as subquery or a function call
1578            Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
1579                self.expect_token(&Token::LBracket)?;
1580                Ok(Some(self.parse_array_expr(true)?))
1581            }
1582            Keyword::ARRAY
1583            if self.peek_token_ref().token == Token::LParen
1584                && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1585                {
1586                    self.expect_token(&Token::LParen)?;
1587                    let query = self.parse_query()?;
1588                    self.expect_token(&Token::RParen)?;
1589                    Ok(Some(Expr::Function(Function {
1590                        name: ObjectName::from(vec![w.to_ident(w_span)]),
1591                        uses_odbc_syntax: false,
1592                        parameters: FunctionArguments::None,
1593                        args: FunctionArguments::Subquery(query),
1594                        filter: None,
1595                        null_treatment: None,
1596                        over: None,
1597                        within_group: vec![],
1598                    })))
1599                }
1600            Keyword::NOT => Ok(Some(self.parse_not()?)),
1601            Keyword::MATCH if self.dialect.supports_match_against() => {
1602                Ok(Some(self.parse_match_against()?))
1603            }
1604            Keyword::STRUCT if self.dialect.supports_struct_literal() => {
1605                let struct_expr = self.parse_struct_literal()?;
1606                Ok(Some(struct_expr))
1607            }
1608            Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
1609                let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
1610                Ok(Some(Expr::Prior(Box::new(expr))))
1611            }
1612            Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
1613                Ok(Some(self.parse_duckdb_map_literal()?))
1614            }
1615            Keyword::LAMBDA if self.dialect.supports_lambda_functions() => {
1616                Ok(Some(self.parse_lambda_expr()?))
1617            }
1618            _ if self.dialect.supports_geometric_types() => match w.keyword {
1619                Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
1620                Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
1621                Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
1622                Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
1623                Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
1624                Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
1625                Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
1626                _ => Ok(None),
1627            },
1628            _ => Ok(None),
1629        }
1630    }
1631
1632    /// Tries to parse an expression by a word that is not known to have a special meaning in the dialect.
1633    fn parse_expr_prefix_by_unreserved_word(
1634        &mut self,
1635        w: &Word,
1636        w_span: Span,
1637    ) -> Result<Expr, ParserError> {
1638        let is_outer_join = self.peek_outer_join_operator();
1639        match &self.peek_token_ref().token {
1640            Token::LParen if !is_outer_join => {
1641                let id_parts = vec![w.to_ident(w_span)];
1642                self.parse_function(ObjectName::from(id_parts))
1643            }
1644            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
1645            Token::SingleQuotedString(_)
1646            | Token::DoubleQuotedString(_)
1647            | Token::HexStringLiteral(_)
1648                if w.value.starts_with('_') =>
1649            {
1650                Ok(Expr::Prefixed {
1651                    prefix: w.to_ident(w_span),
1652                    value: self.parse_introduced_string_expr()?.into(),
1653                })
1654            }
1655            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
1656            Token::SingleQuotedString(_)
1657            | Token::DoubleQuotedString(_)
1658            | Token::HexStringLiteral(_)
1659                if w.value.starts_with('_') =>
1660            {
1661                Ok(Expr::Prefixed {
1662                    prefix: w.to_ident(w_span),
1663                    value: self.parse_introduced_string_expr()?.into(),
1664                })
1665            }
1666            // An unreserved word (likely an identifier) is followed by an arrow,
1667            // which indicates a lambda function with a single, untyped parameter.
1668            // For example: `a -> a * 2`.
1669            Token::Arrow if self.dialect.supports_lambda_functions() => {
1670                self.expect_token(&Token::Arrow)?;
1671                Ok(Expr::Lambda(LambdaFunction {
1672                    params: OneOrManyWithParens::One(LambdaFunctionParameter {
1673                        name: w.to_ident(w_span),
1674                        data_type: None,
1675                    }),
1676                    body: Box::new(self.parse_expr()?),
1677                    syntax: LambdaSyntax::Arrow,
1678                }))
1679            }
1680            // An unreserved word (likely an identifier) that is followed by another word (likley a data type)
1681            // which is then followed by an arrow, which indicates a lambda function with a single, typed parameter.
1682            // For example: `a INT -> a * 2`.
1683            Token::Word(_)
1684                if self.dialect.supports_lambda_functions()
1685                    && self.peek_nth_token_ref(1).token == Token::Arrow =>
1686            {
1687                let data_type = self.parse_data_type()?;
1688                self.expect_token(&Token::Arrow)?;
1689                Ok(Expr::Lambda(LambdaFunction {
1690                    params: OneOrManyWithParens::One(LambdaFunctionParameter {
1691                        name: w.to_ident(w_span),
1692                        data_type: Some(data_type),
1693                    }),
1694                    body: Box::new(self.parse_expr()?),
1695                    syntax: LambdaSyntax::Arrow,
1696                }))
1697            }
1698            _ => Ok(Expr::Identifier(w.to_ident(w_span))),
1699        }
1700    }
1701
1702    /// Returns true if the given [ObjectName] is a single unquoted
1703    /// identifier matching `expected` (case-insensitive).
1704    fn is_simple_unquoted_object_name(name: &ObjectName, expected: &str) -> bool {
1705        if let [ObjectNamePart::Identifier(ident)] = name.0.as_slice() {
1706            ident.quote_style.is_none() && ident.value.eq_ignore_ascii_case(expected)
1707        } else {
1708            false
1709        }
1710    }
1711
1712    /// Parse an expression prefix.
1713    pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
1714        // allow the dialect to override prefix parsing
1715        if let Some(prefix) = self.dialect.parse_prefix(self) {
1716            return prefix;
1717        }
1718
1719        // PostgreSQL allows any string literal to be preceded by a type name, indicating that the
1720        // string literal represents a literal of that type. Some examples:
1721        //
1722        //      DATE '2020-05-20'
1723        //      TIMESTAMP WITH TIME ZONE '2020-05-20 7:43:54'
1724        //      BOOL 'true'
1725        //
1726        // The first two are standard SQL, while the latter is a PostgreSQL extension. Complicating
1727        // matters is the fact that INTERVAL string literals may optionally be followed by special
1728        // keywords, e.g.:
1729        //
1730        //      INTERVAL '7' DAY
1731        //
1732        // Note also that naively `SELECT date` looks like a syntax error because the `date` type
1733        // name is not followed by a string literal, but in fact in PostgreSQL it is a valid
1734        // expression that should parse as the column name "date".
1735        let loc = self.peek_token_ref().span.start;
1736        let opt_expr = self.maybe_parse(|parser| {
1737            match parser.parse_data_type()? {
1738                DataType::Interval { .. } => parser.parse_interval(),
1739                // PostgreSQL allows almost any identifier to be used as custom data type name,
1740                // and we support that in `parse_data_type()`. But unlike Postgres we don't
1741                // have a list of globally reserved keywords (since they vary across dialects),
1742                // so given `NOT 'a' LIKE 'b'`, we'd accept `NOT` as a possible custom data type
1743                // name, resulting in `NOT 'a'` being recognized as a `TypedString` instead of
1744                // an unary negation `NOT ('a' LIKE 'b')`. To solve this, we don't accept the
1745                // `type 'string'` syntax for the custom data types at all ...
1746                //
1747                // ... with the exception of `xml '...'` on dialects that support XML
1748                // expressions, which is a valid PostgreSQL typed string literal.
1749                DataType::Custom(ref name, ref modifiers)
1750                    if modifiers.is_empty()
1751                        && Self::is_simple_unquoted_object_name(name, "xml")
1752                        && parser.dialect.supports_xml_expressions() =>
1753                {
1754                    Ok(Expr::TypedString(TypedString {
1755                        data_type: DataType::Custom(name.clone(), modifiers.clone()),
1756                        value: parser.parse_value()?,
1757                        uses_odbc_syntax: false,
1758                    }))
1759                }
1760                DataType::Custom(..) => parser_err!("dummy", loc),
1761                // MySQL supports using the `BINARY` keyword as a cast to binary type.
1762                DataType::Binary(..) if self.dialect.supports_binary_kw_as_cast() => {
1763                    Ok(Expr::Cast {
1764                        kind: CastKind::Cast,
1765                        expr: Box::new(parser.parse_expr()?),
1766                        data_type: DataType::Binary(None),
1767                        array: false,
1768                        format: None,
1769                    })
1770                }
1771                data_type => Ok(Expr::TypedString(TypedString {
1772                    data_type,
1773                    value: parser.parse_value()?,
1774                    uses_odbc_syntax: false,
1775                })),
1776            }
1777        })?;
1778
1779        if let Some(expr) = opt_expr {
1780            return Ok(expr);
1781        }
1782
1783        // Cache some dialect properties to avoid lifetime issues with the
1784        // next_token reference.
1785
1786        let dialect = self.dialect;
1787
1788        self.advance_token();
1789        let next_token_index = self.get_current_index();
1790        let next_token = self.get_current_token();
1791        let span = next_token.span;
1792        let expr = match &next_token.token {
1793            Token::Word(w) => {
1794                // The word we consumed may fall into one of two cases: it has a special meaning, or not.
1795                // For example, in Snowflake, the word `interval` may have two meanings depending on the context:
1796                // `SELECT CURRENT_DATE() + INTERVAL '1 DAY', MAX(interval) FROM tbl;`
1797                //                          ^^^^^^^^^^^^^^^^      ^^^^^^^^
1798                //                         interval expression   identifier
1799                //
1800                // We first try to parse the word and following tokens as a special expression, and if that fails,
1801                // we rollback and try to parse it as an identifier.
1802                let w = w.clone();
1803                match self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span)) {
1804                    // This word indicated an expression prefix and parsing was successful
1805                    Ok(Some(expr)) => Ok(expr),
1806
1807                    // No expression prefix associated with this word
1808                    Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
1809
1810                    // If parsing of the word as a special expression failed, we are facing two options:
1811                    // 1. The statement is malformed, e.g. `SELECT INTERVAL '1 DAI` (`DAI` instead of `DAY`)
1812                    // 2. The word is used as an identifier, e.g. `SELECT MAX(interval) FROM tbl`
1813                    // We first try to parse the word as an identifier and if that fails
1814                    // we rollback and return the parsing error we got from trying to parse a
1815                    // special expression (to maintain backwards compatibility of parsing errors).
1816                    Err(e) => {
1817                        if !self.dialect.is_reserved_for_identifier(w.keyword) {
1818                            if let Ok(Some(expr)) = self.maybe_parse(|parser| {
1819                                parser.parse_expr_prefix_by_unreserved_word(&w, span)
1820                            }) {
1821                                return Ok(expr);
1822                            }
1823                        }
1824                        return Err(e);
1825                    }
1826                }
1827            } // End of Token::Word
1828            // array `[1, 2, 3]`
1829            Token::LBracket => self.parse_array_expr(false),
1830            tok @ Token::Minus | tok @ Token::Plus => {
1831                let op = if *tok == Token::Plus {
1832                    UnaryOperator::Plus
1833                } else {
1834                    UnaryOperator::Minus
1835                };
1836                Ok(Expr::UnaryOp {
1837                    op,
1838                    expr: Box::new(
1839                        self.parse_subexpr(self.dialect.prec_value(Precedence::MulDivModOp))?,
1840                    ),
1841                })
1842            }
1843            Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
1844                op: UnaryOperator::BangNot,
1845                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
1846            }),
1847            tok @ Token::DoubleExclamationMark
1848            | tok @ Token::PGSquareRoot
1849            | tok @ Token::PGCubeRoot
1850            | tok @ Token::AtSign
1851                if dialect_is!(dialect is PostgreSqlDialect) =>
1852            {
1853                let op = match tok {
1854                    Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1855                    Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1856                    Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1857                    Token::AtSign => UnaryOperator::PGAbs,
1858                    _ => {
1859                        return Err(ParserError::ParserError(
1860                            "Internal parser error: unexpected unary operator token".to_string(),
1861                        ))
1862                    }
1863                };
1864                Ok(Expr::UnaryOp {
1865                    op,
1866                    expr: Box::new(
1867                        self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1868                    ),
1869                })
1870            }
1871            Token::Tilde => Ok(Expr::UnaryOp {
1872                op: UnaryOperator::BitwiseNot,
1873                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?),
1874            }),
1875            tok @ Token::Sharp
1876            | tok @ Token::AtDashAt
1877            | tok @ Token::AtAt
1878            | tok @ Token::QuestionMarkDash
1879            | tok @ Token::QuestionPipe
1880                if self.dialect.supports_geometric_types() =>
1881            {
1882                let op = match tok {
1883                    Token::Sharp => UnaryOperator::Hash,
1884                    Token::AtDashAt => UnaryOperator::AtDashAt,
1885                    Token::AtAt => UnaryOperator::DoubleAt,
1886                    Token::QuestionMarkDash => UnaryOperator::QuestionDash,
1887                    Token::QuestionPipe => UnaryOperator::QuestionPipe,
1888                    _ => {
1889                        return Err(ParserError::ParserError(format!(
1890                            "Unexpected token in unary operator parsing: {tok:?}"
1891                        )))
1892                    }
1893                };
1894                Ok(Expr::UnaryOp {
1895                    op,
1896                    expr: Box::new(
1897                        self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1898                    ),
1899                })
1900            }
1901            Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
1902            {
1903                self.prev_token();
1904                Ok(Expr::Value(self.parse_value()?))
1905            }
1906            Token::UnicodeStringLiteral(_) => {
1907                self.prev_token();
1908                Ok(Expr::Value(self.parse_value()?))
1909            }
1910            Token::Number(_, _)
1911            | Token::SingleQuotedString(_)
1912            | Token::DoubleQuotedString(_)
1913            | Token::TripleSingleQuotedString(_)
1914            | Token::TripleDoubleQuotedString(_)
1915            | Token::DollarQuotedString(_)
1916            | Token::SingleQuotedByteStringLiteral(_)
1917            | Token::DoubleQuotedByteStringLiteral(_)
1918            | Token::TripleSingleQuotedByteStringLiteral(_)
1919            | Token::TripleDoubleQuotedByteStringLiteral(_)
1920            | Token::SingleQuotedRawStringLiteral(_)
1921            | Token::DoubleQuotedRawStringLiteral(_)
1922            | Token::TripleSingleQuotedRawStringLiteral(_)
1923            | Token::TripleDoubleQuotedRawStringLiteral(_)
1924            | Token::NationalStringLiteral(_)
1925            | Token::QuoteDelimitedStringLiteral(_)
1926            | Token::NationalQuoteDelimitedStringLiteral(_)
1927            | Token::HexStringLiteral(_) => {
1928                self.prev_token();
1929                Ok(Expr::Value(self.parse_value()?))
1930            }
1931            Token::LParen => {
1932                let expr =
1933                    if let Some(expr) = self.try_parse_expr_sub_query()? {
1934                        expr
1935                    } else if let Some(lambda) = self.try_parse_lambda()? {
1936                        return Ok(lambda);
1937                    } else {
1938                        // Parentheses in expressions switch to "normal" parsing state.
1939                        // This matters for dialects (SQLite, DuckDB) where `NOT NULL` can
1940                        // be an alias for `IS NOT NULL`. In column definitions like:
1941                        //
1942                        //   CREATE TABLE t (c INT DEFAULT (42 NOT NULL) NOT NULL)
1943                        //
1944                        // The `(42 NOT NULL)` is an expression with parens, so it parses
1945                        // as `IsNotNull(42)`. The trailing `NOT NULL` is outside those
1946                        // expression parens (the outer parens are CREATE TABLE syntax),
1947                        // so it remains a column constraint.
1948                        let exprs = self.with_state(ParserState::Normal, |p| {
1949                            p.parse_comma_separated(Parser::parse_expr)
1950                        })?;
1951                        match exprs.len() {
1952                            0 => return Err(ParserError::ParserError(
1953                                "Internal parser error: parse_comma_separated returned empty list"
1954                                    .to_string(),
1955                            )),
1956                            1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
1957                            _ => Expr::Tuple(exprs),
1958                        }
1959                    };
1960                self.expect_token(&Token::RParen)?;
1961                Ok(expr)
1962            }
1963            Token::Placeholder(_) | Token::Colon | Token::AtSign => {
1964                self.prev_token();
1965                Ok(Expr::Value(self.parse_value()?))
1966            }
1967            Token::LBrace => {
1968                self.prev_token();
1969                self.parse_lbrace_expr()
1970            }
1971            _ => self.expected_at("an expression", next_token_index),
1972        }?;
1973
1974        Ok(expr)
1975    }
1976
1977    fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
1978        Ok(Expr::TypedString(TypedString {
1979            data_type: DataType::GeometricType(kind),
1980            value: self.parse_value()?,
1981            uses_odbc_syntax: false,
1982        }))
1983    }
1984
1985    /// Try to parse an [Expr::CompoundFieldAccess] like `a.b.c` or `a.b[1].c`.
1986    /// If all the fields are `Expr::Identifier`s, return an [Expr::CompoundIdentifier] instead.
1987    /// If only the root exists, return the root.
1988    /// Parses compound expressions which may be delimited by period
1989    /// or bracket notation.
1990    /// For example: `a.b.c`, `a.b[1]`.
1991    pub fn parse_compound_expr(
1992        &mut self,
1993        root: Expr,
1994        mut chain: Vec<AccessExpr>,
1995    ) -> Result<Expr, ParserError> {
1996        let mut ending_wildcard: Option<TokenWithSpan> = None;
1997        loop {
1998            if self.consume_token(&Token::Period) {
1999                let next_token = self.peek_token_ref();
2000                match &next_token.token {
2001                    Token::Mul => {
2002                        // Postgres explicitly allows funcnm(tablenm.*) and the
2003                        // function array_agg traverses this control flow
2004                        if dialect_of!(self is PostgreSqlDialect) {
2005                            ending_wildcard = Some(self.next_token());
2006                        } else {
2007                            // Put back the consumed `.` tokens before exiting.
2008                            // If this expression is being parsed in the
2009                            // context of a projection, then the `.*` could imply
2010                            // a wildcard expansion. For example:
2011                            // `SELECT STRUCT('foo').* FROM T`
2012                            self.prev_token(); // .
2013                        }
2014
2015                        break;
2016                    }
2017                    Token::SingleQuotedString(s) => {
2018                        let expr =
2019                            Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
2020                        chain.push(AccessExpr::Dot(expr));
2021                        self.advance_token(); // The consumed string
2022                    }
2023                    Token::Placeholder(s) => {
2024                        // Snowflake uses $1, $2, etc. for positional column references
2025                        // in staged data queries like: SELECT t.$1 FROM @stage t
2026                        let expr = Expr::Identifier(Ident::with_span(next_token.span, s));
2027                        chain.push(AccessExpr::Dot(expr));
2028                        self.advance_token(); // The consumed placeholder
2029                    }
2030                    // Fallback to parsing an arbitrary expression, but restrict to expression
2031                    // types that are valid after the dot operator. This ensures that e.g.
2032                    // `T.interval` is parsed as a compound identifier, not as an interval
2033                    // expression.
2034                    _ => {
2035                        let expr = self.maybe_parse(|parser| {
2036                            let expr = parser
2037                                .parse_subexpr(parser.dialect.prec_value(Precedence::Period))?;
2038                            match &expr {
2039                                Expr::CompoundFieldAccess { .. }
2040                                | Expr::CompoundIdentifier(_)
2041                                | Expr::Identifier(_)
2042                                | Expr::Value(_)
2043                                | Expr::Function(_) => Ok(expr),
2044                                _ => parser.expected_ref(
2045                                    "an identifier or value",
2046                                    parser.peek_token_ref(),
2047                                ),
2048                            }
2049                        })?;
2050
2051                        match expr {
2052                            // If we get back a compound field access or identifier,
2053                            // we flatten the nested expression.
2054                            // For example if the current root is `foo`
2055                            // and we get back a compound identifier expression `bar.baz`
2056                            // The full expression should be `foo.bar.baz` (i.e.
2057                            // a root with an access chain with 2 entries) and not
2058                            // `foo.(bar.baz)` (i.e. a root with an access chain with
2059                            // 1 entry`).
2060                            Some(Expr::CompoundFieldAccess { root, access_chain }) => {
2061                                chain.push(AccessExpr::Dot(*root));
2062                                chain.extend(access_chain);
2063                            }
2064                            Some(Expr::CompoundIdentifier(parts)) => chain.extend(
2065                                parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot),
2066                            ),
2067                            Some(expr) => {
2068                                chain.push(AccessExpr::Dot(expr));
2069                            }
2070                            // If the expression is not a valid suffix, fall back to
2071                            // parsing as an identifier. This handles cases like `T.interval`
2072                            // where `interval` is a keyword but should be treated as an identifier.
2073                            None => {
2074                                chain.push(AccessExpr::Dot(Expr::Identifier(
2075                                    self.parse_identifier()?,
2076                                )));
2077                            }
2078                        }
2079                    }
2080                }
2081            } else if !self.dialect.supports_partiql()
2082                && self.peek_token_ref().token == Token::LBracket
2083            {
2084                self.parse_multi_dim_subscript(&mut chain)?;
2085            } else {
2086                break;
2087            }
2088        }
2089
2090        let tok_index = self.get_current_index();
2091        if let Some(wildcard_token) = ending_wildcard {
2092            if !Self::is_all_ident(&root, &chain) {
2093                return self
2094                    .expected_ref("an identifier or a '*' after '.'", self.peek_token_ref());
2095            };
2096            Ok(Expr::QualifiedWildcard(
2097                ObjectName::from(Self::exprs_to_idents(root, chain)?),
2098                AttachedToken(wildcard_token),
2099            ))
2100        } else if self.maybe_parse_outer_join_operator() {
2101            if !Self::is_all_ident(&root, &chain) {
2102                return self.expected_at("column identifier before (+)", tok_index);
2103            };
2104            let expr = if chain.is_empty() {
2105                root
2106            } else {
2107                Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
2108            };
2109            Ok(Expr::OuterJoin(expr.into()))
2110        } else {
2111            Self::build_compound_expr(root, chain)
2112        }
2113    }
2114
2115    /// Combines a root expression and access chain to form
2116    /// a compound expression. Which may be a [Expr::CompoundFieldAccess]
2117    /// or other special cased expressions like [Expr::CompoundIdentifier],
2118    /// [Expr::OuterJoin].
2119    fn build_compound_expr(
2120        root: Expr,
2121        mut access_chain: Vec<AccessExpr>,
2122    ) -> Result<Expr, ParserError> {
2123        if access_chain.is_empty() {
2124            return Ok(root);
2125        }
2126
2127        if Self::is_all_ident(&root, &access_chain) {
2128            return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
2129                root,
2130                access_chain,
2131            )?));
2132        }
2133
2134        // Flatten qualified function calls.
2135        // For example, the expression `a.b.c.foo(1,2,3)` should
2136        // represent a function called `a.b.c.foo`, rather than
2137        // a composite expression.
2138        if matches!(root, Expr::Identifier(_))
2139            && matches!(
2140                access_chain.last(),
2141                Some(AccessExpr::Dot(Expr::Function(_)))
2142            )
2143            && access_chain
2144                .iter()
2145                .rev()
2146                .skip(1) // All except the Function
2147                .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
2148        {
2149            let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
2150                return parser_err!("expected function expression", root.span().start);
2151            };
2152
2153            let compound_func_name = [root]
2154                .into_iter()
2155                .chain(access_chain.into_iter().flat_map(|access| match access {
2156                    AccessExpr::Dot(expr) => Some(expr),
2157                    _ => None,
2158                }))
2159                .flat_map(|expr| match expr {
2160                    Expr::Identifier(ident) => Some(ident),
2161                    _ => None,
2162                })
2163                .map(ObjectNamePart::Identifier)
2164                .chain(func.name.0)
2165                .collect::<Vec<_>>();
2166            func.name = ObjectName(compound_func_name);
2167
2168            return Ok(Expr::Function(func));
2169        }
2170
2171        // Flatten qualified outer join expressions.
2172        // For example, the expression `T.foo(+)` should
2173        // represent an outer join on the column name `T.foo`
2174        // rather than a composite expression.
2175        if access_chain.len() == 1
2176            && matches!(
2177                access_chain.last(),
2178                Some(AccessExpr::Dot(Expr::OuterJoin(_)))
2179            )
2180        {
2181            let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
2182                return parser_err!("expected (+) expression", root.span().start);
2183            };
2184
2185            if !Self::is_all_ident(&root, &[]) {
2186                return parser_err!("column identifier before (+)", root.span().start);
2187            };
2188
2189            let token_start = root.span().start;
2190            let mut idents = Self::exprs_to_idents(root, vec![])?;
2191            match *inner_expr {
2192                Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
2193                Expr::Identifier(suffix) => idents.push(suffix),
2194                _ => {
2195                    return parser_err!("column identifier before (+)", token_start);
2196                }
2197            }
2198
2199            return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
2200        }
2201
2202        Ok(Expr::CompoundFieldAccess {
2203            root: Box::new(root),
2204            access_chain,
2205        })
2206    }
2207
2208    fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
2209        match k {
2210            Keyword::LOCAL => Some(ContextModifier::Local),
2211            Keyword::GLOBAL => Some(ContextModifier::Global),
2212            Keyword::SESSION => Some(ContextModifier::Session),
2213            _ => None,
2214        }
2215    }
2216
2217    /// Check if the root is an identifier and all fields are identifiers.
2218    fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
2219        if !matches!(root, Expr::Identifier(_)) {
2220            return false;
2221        }
2222        fields
2223            .iter()
2224            .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
2225    }
2226
2227    /// Convert a root and a list of fields to a list of identifiers.
2228    fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
2229        let mut idents = vec![];
2230        if let Expr::Identifier(root) = root {
2231            idents.push(root);
2232            for x in fields {
2233                if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
2234                    idents.push(ident);
2235                } else {
2236                    return parser_err!(
2237                        format!("Expected identifier, found: {}", x),
2238                        x.span().start
2239                    );
2240                }
2241            }
2242            Ok(idents)
2243        } else {
2244            parser_err!(
2245                format!("Expected identifier, found: {}", root),
2246                root.span().start
2247            )
2248        }
2249    }
2250
2251    /// Returns true if the next tokens indicate the outer join operator `(+)`.
2252    fn peek_outer_join_operator(&mut self) -> bool {
2253        if !self.dialect.supports_outer_join_operator() {
2254            return false;
2255        }
2256
2257        let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
2258        Token::LParen == maybe_lparen.token
2259            && Token::Plus == maybe_plus.token
2260            && Token::RParen == maybe_rparen.token
2261    }
2262
2263    /// If the next tokens indicates the outer join operator `(+)`, consume
2264    /// the tokens and return true.
2265    fn maybe_parse_outer_join_operator(&mut self) -> bool {
2266        self.dialect.supports_outer_join_operator()
2267            && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
2268    }
2269
2270    /// Parse utility options in the form of `(option1, option2 arg2, option3 arg3, ...)`
2271    pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
2272        self.expect_token(&Token::LParen)?;
2273        let options = self.parse_comma_separated(Self::parse_utility_option)?;
2274        self.expect_token(&Token::RParen)?;
2275
2276        Ok(options)
2277    }
2278
2279    fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
2280        let name = self.parse_identifier()?;
2281
2282        let next_token = self.peek_token_ref();
2283        if next_token == &Token::Comma || next_token == &Token::RParen {
2284            return Ok(UtilityOption { name, arg: None });
2285        }
2286        let arg = self.parse_expr()?;
2287
2288        Ok(UtilityOption {
2289            name,
2290            arg: Some(arg),
2291        })
2292    }
2293
2294    fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
2295        if !self.peek_sub_query() {
2296            return Ok(None);
2297        }
2298
2299        Ok(Some(Expr::Subquery(self.parse_query()?)))
2300    }
2301
2302    fn try_parse_lambda(&mut self) -> Result<Option<Expr>, ParserError> {
2303        if !self.dialect.supports_lambda_functions() {
2304            return Ok(None);
2305        }
2306        self.maybe_parse(|p| {
2307            let params = p.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2308            p.expect_token(&Token::RParen)?;
2309            p.expect_token(&Token::Arrow)?;
2310            let expr = p.parse_expr()?;
2311            Ok(Expr::Lambda(LambdaFunction {
2312                params: OneOrManyWithParens::Many(params),
2313                body: Box::new(expr),
2314                syntax: LambdaSyntax::Arrow,
2315            }))
2316        })
2317    }
2318
2319    /// Parses a lambda expression following the `LAMBDA` keyword syntax.
2320    ///
2321    /// Syntax: `LAMBDA <params> : <expr>`
2322    ///
2323    /// Examples:
2324    /// - `LAMBDA x : x + 1`
2325    /// - `LAMBDA x, i : x > i`
2326    ///
2327    /// See <https://duckdb.org/docs/stable/sql/functions/lambda>
2328    fn parse_lambda_expr(&mut self) -> Result<Expr, ParserError> {
2329        // Parse the parameters: either a single identifier or comma-separated identifiers
2330        let params = self.parse_lambda_function_parameters()?;
2331        // Expect the colon separator
2332        self.expect_token(&Token::Colon)?;
2333        // Parse the body expression
2334        let body = self.parse_expr()?;
2335        Ok(Expr::Lambda(LambdaFunction {
2336            params,
2337            body: Box::new(body),
2338            syntax: LambdaSyntax::LambdaKeyword,
2339        }))
2340    }
2341
2342    /// Parses the parameters of a lambda function with optional typing.
2343    fn parse_lambda_function_parameters(
2344        &mut self,
2345    ) -> Result<OneOrManyWithParens<LambdaFunctionParameter>, ParserError> {
2346        // Parse the parameters: either a single identifier or comma-separated identifiers
2347        let params = if self.consume_token(&Token::LParen) {
2348            // Parenthesized parameters: (x, y)
2349            let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2350            self.expect_token(&Token::RParen)?;
2351            OneOrManyWithParens::Many(params)
2352        } else {
2353            // Unparenthesized parameters: x or x, y
2354            let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2355            if params.len() == 1 {
2356                OneOrManyWithParens::One(params.into_iter().next().unwrap())
2357            } else {
2358                OneOrManyWithParens::Many(params)
2359            }
2360        };
2361        Ok(params)
2362    }
2363
2364    /// Parses a single parameter of a lambda function, with optional typing.
2365    fn parse_lambda_function_parameter(&mut self) -> Result<LambdaFunctionParameter, ParserError> {
2366        let name = self.parse_identifier()?;
2367        let data_type = match &self.peek_token_ref().token {
2368            Token::Word(_) => self.maybe_parse(|p| p.parse_data_type())?,
2369            _ => None,
2370        };
2371        Ok(LambdaFunctionParameter { name, data_type })
2372    }
2373
2374    /// Tries to parse the body of an [ODBC escaping sequence]
2375    /// i.e. without the enclosing braces
2376    /// Currently implemented:
2377    /// Scalar Function Calls
2378    /// Date, Time, and Timestamp Literals
2379    /// See <https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/escape-sequences-in-odbc?view=sql-server-2017>
2380    fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
2381        // Attempt 1: Try to parse it as a function.
2382        if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
2383            return Ok(Some(expr));
2384        }
2385        // Attempt 2: Try to parse it as a Date, Time or Timestamp Literal
2386        self.maybe_parse_odbc_body_datetime()
2387    }
2388
2389    /// Tries to parse the body of an [ODBC Date, Time, and Timestamp Literals] call.
2390    ///
2391    /// ```sql
2392    /// {d '2025-07-17'}
2393    /// {t '14:12:01'}
2394    /// {ts '2025-07-17 14:12:01'}
2395    /// ```
2396    ///
2397    /// [ODBC Date, Time, and Timestamp Literals]:
2398    /// https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/date-time-and-timestamp-literals?view=sql-server-2017
2399    fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
2400        self.maybe_parse(|p| {
2401            let token = p.next_token().clone();
2402            let word_string = token.token.to_string();
2403            let data_type = match word_string.as_str() {
2404                "t" => DataType::Time(None, TimezoneInfo::None),
2405                "d" => DataType::Date,
2406                "ts" => DataType::Timestamp(None, TimezoneInfo::None),
2407                _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
2408            };
2409            let value = p.parse_value()?;
2410            Ok(Expr::TypedString(TypedString {
2411                data_type,
2412                value,
2413                uses_odbc_syntax: true,
2414            }))
2415        })
2416    }
2417
2418    /// Tries to parse the body of an [ODBC function] call.
2419    /// i.e. without the enclosing braces
2420    ///
2421    /// ```sql
2422    /// fn myfunc(1,2,3)
2423    /// ```
2424    ///
2425    /// [ODBC function]: https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/scalar-function-calls?view=sql-server-2017
2426    fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
2427        self.maybe_parse(|p| {
2428            p.expect_keyword(Keyword::FN)?;
2429            let fn_name = p.parse_object_name(false)?;
2430            let mut fn_call = p.parse_function_call(fn_name)?;
2431            fn_call.uses_odbc_syntax = true;
2432            Ok(Expr::Function(fn_call))
2433        })
2434    }
2435
2436    /// Parse a function call expression named by `name` and return it as an `Expr`.
2437    pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2438        self.parse_function_call(name).map(Expr::Function)
2439    }
2440
2441    fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
2442        self.expect_token(&Token::LParen)?;
2443
2444        // Snowflake permits a subquery to be passed as an argument without
2445        // an enclosing set of parens if it's the only argument.
2446        if self.dialect.supports_subquery_as_function_arg() && self.peek_sub_query() {
2447            let subquery = self.parse_query()?;
2448            self.expect_token(&Token::RParen)?;
2449            return Ok(Function {
2450                name,
2451                uses_odbc_syntax: false,
2452                parameters: FunctionArguments::None,
2453                args: FunctionArguments::Subquery(subquery),
2454                filter: None,
2455                null_treatment: None,
2456                over: None,
2457                within_group: vec![],
2458            });
2459        }
2460
2461        let mut args = self.parse_function_argument_list()?;
2462        let mut parameters = FunctionArguments::None;
2463        // ClickHouse aggregations support parametric functions like `HISTOGRAM(0.5, 0.6)(x, y)`
2464        // which (0.5, 0.6) is a parameter to the function.
2465        if dialect_of!(self is ClickHouseDialect | GenericDialect)
2466            && self.consume_token(&Token::LParen)
2467        {
2468            parameters = FunctionArguments::List(args);
2469            args = self.parse_function_argument_list()?;
2470        }
2471
2472        let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
2473            self.expect_token(&Token::LParen)?;
2474            self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
2475            let order_by = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2476            self.expect_token(&Token::RParen)?;
2477            order_by
2478        } else {
2479            vec![]
2480        };
2481
2482        let filter = if self.dialect.supports_filter_during_aggregation()
2483            && self.parse_keyword(Keyword::FILTER)
2484            && self.consume_token(&Token::LParen)
2485            && self.parse_keyword(Keyword::WHERE)
2486        {
2487            let filter = Some(Box::new(self.parse_expr()?));
2488            self.expect_token(&Token::RParen)?;
2489            filter
2490        } else {
2491            None
2492        };
2493
2494        // Syntax for null treatment shows up either in the args list
2495        // or after the function call, but not both.
2496        let null_treatment = if args
2497            .clauses
2498            .iter()
2499            .all(|clause| !matches!(clause, FunctionArgumentClause::IgnoreOrRespectNulls(_)))
2500        {
2501            self.parse_null_treatment()?
2502        } else {
2503            None
2504        };
2505
2506        let over = if self.parse_keyword(Keyword::OVER) {
2507            if self.consume_token(&Token::LParen) {
2508                let window_spec = self.parse_window_spec()?;
2509                Some(WindowType::WindowSpec(window_spec))
2510            } else {
2511                Some(WindowType::NamedWindow(self.parse_identifier()?))
2512            }
2513        } else {
2514            None
2515        };
2516
2517        Ok(Function {
2518            name,
2519            uses_odbc_syntax: false,
2520            parameters,
2521            args: FunctionArguments::List(args),
2522            null_treatment,
2523            filter,
2524            over,
2525            within_group,
2526        })
2527    }
2528
2529    /// Optionally parses a null treatment clause.
2530    fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
2531        match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
2532            Some(keyword) => {
2533                self.expect_keyword_is(Keyword::NULLS)?;
2534
2535                Ok(match keyword {
2536                    Keyword::RESPECT => Some(NullTreatment::RespectNulls),
2537                    Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
2538                    _ => None,
2539                })
2540            }
2541            None => Ok(None),
2542        }
2543    }
2544
2545    /// Parse time-related function `name` possibly followed by `(...)` arguments.
2546    pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2547        let args = if self.consume_token(&Token::LParen) {
2548            FunctionArguments::List(self.parse_function_argument_list()?)
2549        } else {
2550            FunctionArguments::None
2551        };
2552        Ok(Expr::Function(Function {
2553            name,
2554            uses_odbc_syntax: false,
2555            parameters: FunctionArguments::None,
2556            args,
2557            filter: None,
2558            over: None,
2559            null_treatment: None,
2560            within_group: vec![],
2561        }))
2562    }
2563
2564    /// Parse window frame `UNITS` clause: `ROWS`, `RANGE`, or `GROUPS`.
2565    pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
2566        let next_token = self.next_token();
2567        match &next_token.token {
2568            Token::Word(w) => match w.keyword {
2569                Keyword::ROWS => Ok(WindowFrameUnits::Rows),
2570                Keyword::RANGE => Ok(WindowFrameUnits::Range),
2571                Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
2572                _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
2573            },
2574            _ => self.expected("ROWS, RANGE, GROUPS", next_token),
2575        }
2576    }
2577
2578    /// Parse a `WINDOW` frame definition (units and bounds).
2579    pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
2580        let units = self.parse_window_frame_units()?;
2581        let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
2582            let start_bound = self.parse_window_frame_bound()?;
2583            self.expect_keyword_is(Keyword::AND)?;
2584            let end_bound = Some(self.parse_window_frame_bound()?);
2585            (start_bound, end_bound)
2586        } else {
2587            (self.parse_window_frame_bound()?, None)
2588        };
2589        Ok(WindowFrame {
2590            units,
2591            start_bound,
2592            end_bound,
2593        })
2594    }
2595
2596    /// Parse a window frame bound: `CURRENT ROW` or `<n> PRECEDING|FOLLOWING`.
2597    pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
2598        if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
2599            Ok(WindowFrameBound::CurrentRow)
2600        } else {
2601            let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
2602                None
2603            } else {
2604                Some(Box::new(match &self.peek_token_ref().token {
2605                    Token::SingleQuotedString(_) => self.parse_interval()?,
2606                    _ => self.parse_expr()?,
2607                }))
2608            };
2609            if self.parse_keyword(Keyword::PRECEDING) {
2610                Ok(WindowFrameBound::Preceding(rows))
2611            } else if self.parse_keyword(Keyword::FOLLOWING) {
2612                Ok(WindowFrameBound::Following(rows))
2613            } else {
2614                self.expected_ref("PRECEDING or FOLLOWING", self.peek_token_ref())
2615            }
2616        }
2617    }
2618
2619    /// Parse a group by expr. Group by expr can be one of group sets, roll up, cube, or simple expr.
2620    fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
2621        if self.dialect.supports_group_by_expr() {
2622            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
2623                self.expect_token(&Token::LParen)?;
2624                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2625                self.expect_token(&Token::RParen)?;
2626                Ok(Expr::GroupingSets(result))
2627            } else if self.parse_keyword(Keyword::CUBE) {
2628                self.expect_token(&Token::LParen)?;
2629                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2630                self.expect_token(&Token::RParen)?;
2631                Ok(Expr::Cube(result))
2632            } else if self.parse_keyword(Keyword::ROLLUP) {
2633                self.expect_token(&Token::LParen)?;
2634                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2635                self.expect_token(&Token::RParen)?;
2636                Ok(Expr::Rollup(result))
2637            } else if self.consume_tokens(&[Token::LParen, Token::RParen]) {
2638                // PostgreSQL allow to use empty tuple as a group by expression,
2639                // e.g. `GROUP BY (), name`. Please refer to GROUP BY Clause section in
2640                // [PostgreSQL](https://www.postgresql.org/docs/16/sql-select.html)
2641                Ok(Expr::Tuple(vec![]))
2642            } else {
2643                self.parse_expr()
2644            }
2645        } else {
2646            // TODO parse rollup for other dialects
2647            self.parse_expr()
2648        }
2649    }
2650
2651    /// Parse a tuple with `(` and `)`.
2652    /// If `lift_singleton` is true, then a singleton tuple is lifted to a tuple of length 1, otherwise it will fail.
2653    /// If `allow_empty` is true, then an empty tuple is allowed.
2654    fn parse_tuple(
2655        &mut self,
2656        lift_singleton: bool,
2657        allow_empty: bool,
2658    ) -> Result<Vec<Expr>, ParserError> {
2659        if lift_singleton {
2660            if self.consume_token(&Token::LParen) {
2661                let result = if allow_empty && self.consume_token(&Token::RParen) {
2662                    vec![]
2663                } else {
2664                    let result = self.parse_comma_separated(Parser::parse_expr)?;
2665                    self.expect_token(&Token::RParen)?;
2666                    result
2667                };
2668                Ok(result)
2669            } else {
2670                Ok(vec![self.parse_expr()?])
2671            }
2672        } else {
2673            self.expect_token(&Token::LParen)?;
2674            let result = if allow_empty && self.consume_token(&Token::RParen) {
2675                vec![]
2676            } else {
2677                let result = self.parse_comma_separated(Parser::parse_expr)?;
2678                self.expect_token(&Token::RParen)?;
2679                result
2680            };
2681            Ok(result)
2682        }
2683    }
2684
2685    /// Parse a `CASE` expression and return an [`Expr::Case`].
2686    pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
2687        let case_token = AttachedToken(self.get_current_token().clone());
2688        let mut operand = None;
2689        if !self.parse_keyword(Keyword::WHEN) {
2690            operand = Some(Box::new(self.parse_expr()?));
2691            self.expect_keyword_is(Keyword::WHEN)?;
2692        }
2693        let mut conditions = vec![];
2694        loop {
2695            let condition = self.parse_expr()?;
2696            self.expect_keyword_is(Keyword::THEN)?;
2697            let result = self.parse_expr()?;
2698            conditions.push(CaseWhen { condition, result });
2699            if !self.parse_keyword(Keyword::WHEN) {
2700                break;
2701            }
2702        }
2703        let else_result = if self.parse_keyword(Keyword::ELSE) {
2704            Some(Box::new(self.parse_expr()?))
2705        } else {
2706            None
2707        };
2708        let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
2709        Ok(Expr::Case {
2710            case_token,
2711            end_token,
2712            operand,
2713            conditions,
2714            else_result,
2715        })
2716    }
2717
2718    /// Parse an optional `FORMAT` clause for `CAST` expressions.
2719    pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
2720        if self.parse_keyword(Keyword::FORMAT) {
2721            let value = self.parse_value()?;
2722            match self.parse_optional_time_zone()? {
2723                Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
2724                None => Ok(Some(CastFormat::Value(value))),
2725            }
2726        } else {
2727            Ok(None)
2728        }
2729    }
2730
2731    /// Parse an optional `AT TIME ZONE` clause.
2732    pub fn parse_optional_time_zone(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
2733        if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
2734            self.parse_value().map(Some)
2735        } else {
2736            Ok(None)
2737        }
2738    }
2739
2740    /// mssql-like convert function
2741    fn parse_mssql_convert(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2742        self.expect_token(&Token::LParen)?;
2743        let data_type = self.parse_data_type()?;
2744        self.expect_token(&Token::Comma)?;
2745        let expr = self.parse_expr()?;
2746        let styles = if self.consume_token(&Token::Comma) {
2747            self.parse_comma_separated(Parser::parse_expr)?
2748        } else {
2749            Default::default()
2750        };
2751        self.expect_token(&Token::RParen)?;
2752        Ok(Expr::Convert {
2753            is_try,
2754            expr: Box::new(expr),
2755            data_type: Some(data_type),
2756            charset: None,
2757            target_before_value: true,
2758            styles,
2759        })
2760    }
2761
2762    /// Parse a SQL CONVERT function:
2763    ///  - `CONVERT('héhé' USING utf8mb4)` (MySQL)
2764    ///  - `CONVERT('héhé', CHAR CHARACTER SET utf8mb4)` (MySQL)
2765    ///  - `CONVERT(DECIMAL(10, 5), 42)` (MSSQL) - the type comes first
2766    pub fn parse_convert_expr(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2767        if self.dialect.convert_type_before_value() {
2768            return self.parse_mssql_convert(is_try);
2769        }
2770        self.expect_token(&Token::LParen)?;
2771        let expr = self.parse_expr()?;
2772        if self.parse_keyword(Keyword::USING) {
2773            let charset = self.parse_object_name(false)?;
2774            self.expect_token(&Token::RParen)?;
2775            return Ok(Expr::Convert {
2776                is_try,
2777                expr: Box::new(expr),
2778                data_type: None,
2779                charset: Some(charset),
2780                target_before_value: false,
2781                styles: vec![],
2782            });
2783        }
2784        self.expect_token(&Token::Comma)?;
2785        let data_type = self.parse_data_type()?;
2786        let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
2787            Some(self.parse_object_name(false)?)
2788        } else {
2789            None
2790        };
2791        self.expect_token(&Token::RParen)?;
2792        Ok(Expr::Convert {
2793            is_try,
2794            expr: Box::new(expr),
2795            data_type: Some(data_type),
2796            charset,
2797            target_before_value: false,
2798            styles: vec![],
2799        })
2800    }
2801
2802    /// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
2803    pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
2804        self.expect_token(&Token::LParen)?;
2805        let expr = self.parse_expr()?;
2806        self.expect_keyword_is(Keyword::AS)?;
2807        let data_type = self.parse_data_type()?;
2808        let array = self.parse_keyword(Keyword::ARRAY);
2809        let format = self.parse_optional_cast_format()?;
2810        self.expect_token(&Token::RParen)?;
2811        Ok(Expr::Cast {
2812            kind,
2813            expr: Box::new(expr),
2814            data_type,
2815            array,
2816            format,
2817        })
2818    }
2819
2820    /// Parse a SQL EXISTS expression e.g. `WHERE EXISTS(SELECT ...)`.
2821    pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
2822        self.expect_token(&Token::LParen)?;
2823        let exists_node = Expr::Exists {
2824            negated,
2825            subquery: self.parse_query()?,
2826        };
2827        self.expect_token(&Token::RParen)?;
2828        Ok(exists_node)
2829    }
2830
2831    /// Parse a SQL `EXTRACT` expression e.g. `EXTRACT(YEAR FROM date)`.
2832    pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
2833        self.expect_token(&Token::LParen)?;
2834        let field = self.parse_date_time_field()?;
2835
2836        let syntax = if self.parse_keyword(Keyword::FROM) {
2837            ExtractSyntax::From
2838        } else if self.dialect.supports_extract_comma_syntax() && self.consume_token(&Token::Comma)
2839        {
2840            ExtractSyntax::Comma
2841        } else {
2842            return Err(ParserError::ParserError(
2843                "Expected 'FROM' or ','".to_string(),
2844            ));
2845        };
2846
2847        let expr = self.parse_expr()?;
2848        self.expect_token(&Token::RParen)?;
2849        Ok(Expr::Extract {
2850            field,
2851            expr: Box::new(expr),
2852            syntax,
2853        })
2854    }
2855
2856    /// Parse a `CEIL` or `FLOOR` expression.
2857    pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
2858        self.expect_token(&Token::LParen)?;
2859        let expr = self.parse_expr()?;
2860        // Parse `CEIL/FLOOR(expr)`
2861        let field = if self.parse_keyword(Keyword::TO) {
2862            // Parse `CEIL/FLOOR(expr TO DateTimeField)`
2863            CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
2864        } else if self.consume_token(&Token::Comma) {
2865            // Parse `CEIL/FLOOR(expr, scale)`
2866            let v = self.parse_value()?;
2867            if matches!(v.value, Value::Number(_, _)) {
2868                CeilFloorKind::Scale(v)
2869            } else {
2870                return Err(ParserError::ParserError(
2871                    "Scale field can only be of number type".to_string(),
2872                ));
2873            }
2874        } else {
2875            CeilFloorKind::DateTimeField(DateTimeField::NoDateTime)
2876        };
2877        self.expect_token(&Token::RParen)?;
2878        if is_ceil {
2879            Ok(Expr::Ceil {
2880                expr: Box::new(expr),
2881                field,
2882            })
2883        } else {
2884            Ok(Expr::Floor {
2885                expr: Box::new(expr),
2886                field,
2887            })
2888        }
2889    }
2890
2891    /// Parse a `POSITION` expression.
2892    pub fn parse_position_expr(&mut self, ident: Ident) -> Result<Expr, ParserError> {
2893        let between_prec = self.dialect.prec_value(Precedence::Between);
2894        let position_expr = self.maybe_parse(|p| {
2895            // PARSE SELECT POSITION('@' in field)
2896            p.expect_token(&Token::LParen)?;
2897
2898            // Parse the subexpr till the IN keyword
2899            let expr = p.parse_subexpr(between_prec)?;
2900            p.expect_keyword_is(Keyword::IN)?;
2901            let from = p.parse_expr()?;
2902            p.expect_token(&Token::RParen)?;
2903            Ok(Expr::Position {
2904                expr: Box::new(expr),
2905                r#in: Box::new(from),
2906            })
2907        })?;
2908        match position_expr {
2909            Some(expr) => Ok(expr),
2910            // Snowflake supports `position` as an ordinary function call
2911            // without the special `IN` syntax.
2912            None => self.parse_function(ObjectName::from(vec![ident])),
2913        }
2914    }
2915
2916    /// Parse `SUBSTRING`/`SUBSTR` expressions: `SUBSTRING(expr FROM start FOR length)` or `SUBSTR(expr, start, length)`.
2917    pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
2918        let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
2919            Keyword::SUBSTR => true,
2920            Keyword::SUBSTRING => false,
2921            _ => {
2922                self.prev_token();
2923                return self.expected_ref("SUBSTR or SUBSTRING", self.peek_token_ref());
2924            }
2925        };
2926        self.expect_token(&Token::LParen)?;
2927        let expr = self.parse_expr()?;
2928        let mut from_expr = None;
2929        let special = self.consume_token(&Token::Comma);
2930        if special || self.parse_keyword(Keyword::FROM) {
2931            from_expr = Some(self.parse_expr()?);
2932        }
2933
2934        let mut to_expr = None;
2935        if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
2936            to_expr = Some(self.parse_expr()?);
2937        }
2938        self.expect_token(&Token::RParen)?;
2939
2940        Ok(Expr::Substring {
2941            expr: Box::new(expr),
2942            substring_from: from_expr.map(Box::new),
2943            substring_for: to_expr.map(Box::new),
2944            special,
2945            shorthand,
2946        })
2947    }
2948
2949    /// Parse an OVERLAY expression.
2950    ///
2951    /// See [Expr::Overlay]
2952    pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
2953        // PARSE OVERLAY (EXPR PLACING EXPR FROM 1 [FOR 3])
2954        self.expect_token(&Token::LParen)?;
2955        let expr = self.parse_expr()?;
2956        self.expect_keyword_is(Keyword::PLACING)?;
2957        let what_expr = self.parse_expr()?;
2958        self.expect_keyword_is(Keyword::FROM)?;
2959        let from_expr = self.parse_expr()?;
2960        let mut for_expr = None;
2961        if self.parse_keyword(Keyword::FOR) {
2962            for_expr = Some(self.parse_expr()?);
2963        }
2964        self.expect_token(&Token::RParen)?;
2965
2966        Ok(Expr::Overlay {
2967            expr: Box::new(expr),
2968            overlay_what: Box::new(what_expr),
2969            overlay_from: Box::new(from_expr),
2970            overlay_for: for_expr.map(Box::new),
2971        })
2972    }
2973
2974    /// ```sql
2975    /// TRIM ([WHERE] ['text' FROM] 'text')
2976    /// TRIM ('text')
2977    /// TRIM(<expr>, [, characters]) -- PostgreSQL, DuckDB, Snowflake, BigQuery, Generic
2978    /// ```
2979    pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
2980        self.expect_token(&Token::LParen)?;
2981        let mut trim_where = None;
2982        if let Token::Word(word) = &self.peek_token_ref().token {
2983            if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
2984                trim_where = Some(self.parse_trim_where()?);
2985            }
2986        }
2987        let expr = self.parse_expr()?;
2988        if self.parse_keyword(Keyword::FROM) {
2989            let trim_what = Box::new(expr);
2990            let expr = self.parse_expr()?;
2991            self.expect_token(&Token::RParen)?;
2992            Ok(Expr::Trim {
2993                expr: Box::new(expr),
2994                trim_where,
2995                trim_what: Some(trim_what),
2996                trim_characters: None,
2997            })
2998        } else if self.dialect.supports_comma_separated_trim() && self.consume_token(&Token::Comma)
2999        {
3000            let characters = self.parse_comma_separated(Parser::parse_expr)?;
3001            self.expect_token(&Token::RParen)?;
3002            Ok(Expr::Trim {
3003                expr: Box::new(expr),
3004                trim_where: None,
3005                trim_what: None,
3006                trim_characters: Some(characters),
3007            })
3008        } else {
3009            self.expect_token(&Token::RParen)?;
3010            Ok(Expr::Trim {
3011                expr: Box::new(expr),
3012                trim_where,
3013                trim_what: None,
3014                trim_characters: None,
3015            })
3016        }
3017    }
3018
3019    /// Parse the `WHERE` field for a `TRIM` expression.
3020    ///
3021    /// See [TrimWhereField]
3022    pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
3023        let next_token = self.next_token();
3024        match &next_token.token {
3025            Token::Word(w) => match w.keyword {
3026                Keyword::BOTH => Ok(TrimWhereField::Both),
3027                Keyword::LEADING => Ok(TrimWhereField::Leading),
3028                Keyword::TRAILING => Ok(TrimWhereField::Trailing),
3029                _ => self.expected("trim_where field", next_token)?,
3030            },
3031            _ => self.expected("trim_where field", next_token),
3032        }
3033    }
3034
3035    /// Parses an array expression `[ex1, ex2, ..]`
3036    /// if `named` is `true`, came from an expression like  `ARRAY[ex1, ex2]`
3037    pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
3038        let exprs = self.parse_comma_separated0(Parser::parse_expr, Token::RBracket)?;
3039        self.expect_token(&Token::RBracket)?;
3040        Ok(Expr::Array(Array { elem: exprs, named }))
3041    }
3042
3043    /// Parse the `ON OVERFLOW` clause for `LISTAGG`.
3044    ///
3045    /// See [`ListAggOnOverflow`]
3046    pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
3047        if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
3048            if self.parse_keyword(Keyword::ERROR) {
3049                Ok(Some(ListAggOnOverflow::Error))
3050            } else {
3051                self.expect_keyword_is(Keyword::TRUNCATE)?;
3052                let filler = match &self.peek_token_ref().token {
3053                    Token::Word(w)
3054                        if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
3055                    {
3056                        None
3057                    }
3058                    Token::SingleQuotedString(_)
3059                    | Token::EscapedStringLiteral(_)
3060                    | Token::UnicodeStringLiteral(_)
3061                    | Token::NationalStringLiteral(_)
3062                    | Token::QuoteDelimitedStringLiteral(_)
3063                    | Token::NationalQuoteDelimitedStringLiteral(_)
3064                    | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
3065                    _ => self.expected_ref(
3066                        "either filler, WITH, or WITHOUT in LISTAGG",
3067                        self.peek_token_ref(),
3068                    )?,
3069                };
3070                let with_count = self.parse_keyword(Keyword::WITH);
3071                if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
3072                    self.expected_ref("either WITH or WITHOUT in LISTAGG", self.peek_token_ref())?;
3073                }
3074                self.expect_keyword_is(Keyword::COUNT)?;
3075                Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
3076            }
3077        } else {
3078            Ok(None)
3079        }
3080    }
3081
3082    /// Parse a date/time field for `EXTRACT`, interval qualifiers, and ceil/floor operations.
3083    ///
3084    /// `EXTRACT` supports a wider set of date/time fields than interval qualifiers,
3085    /// so this function may need to be split in two.
3086    ///
3087    /// See [`DateTimeField`]
3088    pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
3089        let next_token = self.next_token();
3090        match &next_token.token {
3091            Token::Word(w) => match w.keyword {
3092                Keyword::YEAR => Ok(DateTimeField::Year),
3093                Keyword::YEARS => Ok(DateTimeField::Years),
3094                Keyword::MONTH => Ok(DateTimeField::Month),
3095                Keyword::MONTHS => Ok(DateTimeField::Months),
3096                Keyword::WEEK => {
3097                    let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
3098                        && self.consume_token(&Token::LParen)
3099                    {
3100                        let week_day = self.parse_identifier()?;
3101                        self.expect_token(&Token::RParen)?;
3102                        Some(week_day)
3103                    } else {
3104                        None
3105                    };
3106                    Ok(DateTimeField::Week(week_day))
3107                }
3108                Keyword::WEEKS => Ok(DateTimeField::Weeks),
3109                Keyword::DAY => Ok(DateTimeField::Day),
3110                Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
3111                Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
3112                Keyword::DAYS => Ok(DateTimeField::Days),
3113                Keyword::DATE => Ok(DateTimeField::Date),
3114                Keyword::DATETIME => Ok(DateTimeField::Datetime),
3115                Keyword::HOUR => Ok(DateTimeField::Hour),
3116                Keyword::HOURS => Ok(DateTimeField::Hours),
3117                Keyword::MINUTE => Ok(DateTimeField::Minute),
3118                Keyword::MINUTES => Ok(DateTimeField::Minutes),
3119                Keyword::SECOND => Ok(DateTimeField::Second),
3120                Keyword::SECONDS => Ok(DateTimeField::Seconds),
3121                Keyword::CENTURY => Ok(DateTimeField::Century),
3122                Keyword::DECADE => Ok(DateTimeField::Decade),
3123                Keyword::DOY => Ok(DateTimeField::Doy),
3124                Keyword::DOW => Ok(DateTimeField::Dow),
3125                Keyword::EPOCH => Ok(DateTimeField::Epoch),
3126                Keyword::ISODOW => Ok(DateTimeField::Isodow),
3127                Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
3128                Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
3129                Keyword::JULIAN => Ok(DateTimeField::Julian),
3130                Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
3131                Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
3132                Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
3133                Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
3134                Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
3135                Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
3136                Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
3137                Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
3138                Keyword::QUARTER => Ok(DateTimeField::Quarter),
3139                Keyword::TIME => Ok(DateTimeField::Time),
3140                Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
3141                Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
3142                Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
3143                Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
3144                Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
3145                _ if self.dialect.allow_extract_custom() => {
3146                    self.prev_token();
3147                    let custom = self.parse_identifier()?;
3148                    Ok(DateTimeField::Custom(custom))
3149                }
3150                _ => self.expected("date/time field", next_token),
3151            },
3152            Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
3153                self.prev_token();
3154                let custom = self.parse_identifier()?;
3155                Ok(DateTimeField::Custom(custom))
3156            }
3157            _ => self.expected("date/time field", next_token),
3158        }
3159    }
3160
3161    /// Parse a `NOT` expression.
3162    ///
3163    /// Represented in the AST as `Expr::UnaryOp` with `UnaryOperator::Not`.
3164    pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
3165        match &self.peek_token_ref().token {
3166            Token::Word(w) => match w.keyword {
3167                Keyword::EXISTS => {
3168                    let negated = true;
3169                    let _ = self.parse_keyword(Keyword::EXISTS);
3170                    self.parse_exists_expr(negated)
3171                }
3172                _ => Ok(Expr::UnaryOp {
3173                    op: UnaryOperator::Not,
3174                    expr: Box::new(
3175                        self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
3176                    ),
3177                }),
3178            },
3179            _ => Ok(Expr::UnaryOp {
3180                op: UnaryOperator::Not,
3181                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
3182            }),
3183        }
3184    }
3185
3186    /// Parse expression types that start with a left brace '{'.
3187    /// Examples:
3188    /// ```sql
3189    /// -- Dictionary expr.
3190    /// {'key1': 'value1', 'key2': 'value2'}
3191    ///
3192    /// -- Function call using the ODBC syntax.
3193    /// { fn CONCAT('foo', 'bar') }
3194    /// ```
3195    fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
3196        let token = self.expect_token(&Token::LBrace)?;
3197
3198        if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
3199            self.expect_token(&Token::RBrace)?;
3200            return Ok(fn_expr);
3201        }
3202
3203        if self.dialect.supports_dictionary_syntax() {
3204            self.prev_token(); // Put back the '{'
3205            return self.parse_dictionary();
3206        }
3207
3208        self.expected("an expression", token)
3209    }
3210
3211    /// Parses fulltext expressions [`sqlparser::ast::Expr::MatchAgainst`]
3212    ///
3213    /// # Errors
3214    /// This method will raise an error if the column list is empty or with invalid identifiers,
3215    /// the match expression is not a literal string, or if the search modifier is not valid.
3216    pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
3217        let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
3218
3219        self.expect_keyword_is(Keyword::AGAINST)?;
3220
3221        self.expect_token(&Token::LParen)?;
3222
3223        // MySQL is too permissive about the value, IMO we can't validate it perfectly on syntax level.
3224        let match_value = self.parse_value()?;
3225
3226        let in_natural_language_mode_keywords = &[
3227            Keyword::IN,
3228            Keyword::NATURAL,
3229            Keyword::LANGUAGE,
3230            Keyword::MODE,
3231        ];
3232
3233        let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
3234
3235        let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
3236
3237        let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
3238            if self.parse_keywords(with_query_expansion_keywords) {
3239                Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
3240            } else {
3241                Some(SearchModifier::InNaturalLanguageMode)
3242            }
3243        } else if self.parse_keywords(in_boolean_mode_keywords) {
3244            Some(SearchModifier::InBooleanMode)
3245        } else if self.parse_keywords(with_query_expansion_keywords) {
3246            Some(SearchModifier::WithQueryExpansion)
3247        } else {
3248            None
3249        };
3250
3251        self.expect_token(&Token::RParen)?;
3252
3253        Ok(Expr::MatchAgainst {
3254            columns,
3255            match_value,
3256            opt_search_modifier,
3257        })
3258    }
3259
3260    /// Parse an `INTERVAL` expression.
3261    ///
3262    /// Some syntactically valid intervals:
3263    ///
3264    /// ```sql
3265    ///   1. INTERVAL '1' DAY
3266    ///   2. INTERVAL '1-1' YEAR TO MONTH
3267    ///   3. INTERVAL '1' SECOND
3268    ///   4. INTERVAL '1:1:1.1' HOUR (5) TO SECOND (5)
3269    ///   5. INTERVAL '1.1' SECOND (2, 2)
3270    ///   6. INTERVAL '1:1' HOUR (5) TO MINUTE (5)
3271    ///   7. (MySql & BigQuery only): INTERVAL 1 DAY
3272    /// ```
3273    ///
3274    /// Note that we do not currently attempt to parse the quoted value.
3275    pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
3276        // The SQL standard allows an optional sign before the value string, but
3277        // it is not clear if any implementations support that syntax, so we
3278        // don't currently try to parse it. (The sign can instead be included
3279        // inside the value string.)
3280
3281        // to match the different flavours of INTERVAL syntax, we only allow expressions
3282        // if the dialect requires an interval qualifier,
3283        // see https://github.com/sqlparser-rs/sqlparser-rs/pull/1398 for more details
3284        let value = if self.dialect.require_interval_qualifier() {
3285            // parse a whole expression so `INTERVAL 1 + 1 DAY` is valid
3286            self.parse_expr()?
3287        } else {
3288            // parse a prefix expression so `INTERVAL 1 DAY` is valid, but `INTERVAL 1 + 1 DAY` is not
3289            // this also means that `INTERVAL '5 days' > INTERVAL '1 day'` treated properly
3290            self.parse_prefix()?
3291        };
3292
3293        // Following the string literal is a qualifier which indicates the units
3294        // of the duration specified in the string literal.
3295        //
3296        // Note that PostgreSQL allows omitting the qualifier, so we provide
3297        // this more general implementation.
3298        let leading_field = if self.next_token_is_temporal_unit() {
3299            Some(self.parse_date_time_field()?)
3300        } else if self.dialect.require_interval_qualifier() {
3301            return parser_err!(
3302                "INTERVAL requires a unit after the literal value",
3303                self.peek_token_ref().span.start
3304            );
3305        } else {
3306            None
3307        };
3308
3309        let (leading_precision, last_field, fsec_precision) =
3310            if leading_field == Some(DateTimeField::Second) {
3311                // SQL mandates special syntax for `SECOND TO SECOND` literals.
3312                // Instead of
3313                //     `SECOND [(<leading precision>)] TO SECOND[(<fractional seconds precision>)]`
3314                // one must use the special format:
3315                //     `SECOND [( <leading precision> [ , <fractional seconds precision>] )]`
3316                let last_field = None;
3317                let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
3318                (leading_precision, last_field, fsec_precision)
3319            } else {
3320                let leading_precision = self.parse_optional_precision()?;
3321                if self.parse_keyword(Keyword::TO) {
3322                    let last_field = Some(self.parse_date_time_field()?);
3323                    let fsec_precision = if last_field == Some(DateTimeField::Second) {
3324                        self.parse_optional_precision()?
3325                    } else {
3326                        None
3327                    };
3328                    (leading_precision, last_field, fsec_precision)
3329                } else {
3330                    (leading_precision, None, None)
3331                }
3332            };
3333
3334        Ok(Expr::Interval(Interval {
3335            value: Box::new(value),
3336            leading_field,
3337            leading_precision,
3338            last_field,
3339            fractional_seconds_precision: fsec_precision,
3340        }))
3341    }
3342
3343    /// Peek at the next token and determine if it is a temporal unit
3344    /// like `second`.
3345    pub fn next_token_is_temporal_unit(&mut self) -> bool {
3346        if let Token::Word(word) = &self.peek_token_ref().token {
3347            matches!(
3348                word.keyword,
3349                Keyword::YEAR
3350                    | Keyword::YEARS
3351                    | Keyword::MONTH
3352                    | Keyword::MONTHS
3353                    | Keyword::WEEK
3354                    | Keyword::WEEKS
3355                    | Keyword::DAY
3356                    | Keyword::DAYS
3357                    | Keyword::HOUR
3358                    | Keyword::HOURS
3359                    | Keyword::MINUTE
3360                    | Keyword::MINUTES
3361                    | Keyword::SECOND
3362                    | Keyword::SECONDS
3363                    | Keyword::CENTURY
3364                    | Keyword::DECADE
3365                    | Keyword::DOW
3366                    | Keyword::DOY
3367                    | Keyword::EPOCH
3368                    | Keyword::ISODOW
3369                    | Keyword::ISOYEAR
3370                    | Keyword::JULIAN
3371                    | Keyword::MICROSECOND
3372                    | Keyword::MICROSECONDS
3373                    | Keyword::MILLENIUM
3374                    | Keyword::MILLENNIUM
3375                    | Keyword::MILLISECOND
3376                    | Keyword::MILLISECONDS
3377                    | Keyword::NANOSECOND
3378                    | Keyword::NANOSECONDS
3379                    | Keyword::QUARTER
3380                    | Keyword::TIMEZONE
3381                    | Keyword::TIMEZONE_HOUR
3382                    | Keyword::TIMEZONE_MINUTE
3383            )
3384        } else {
3385            false
3386        }
3387    }
3388
3389    /// Syntax
3390    /// ```sql
3391    /// -- typed
3392    /// STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
3393    /// -- typeless
3394    /// STRUCT( expr1 [AS field_name] [, ... ])
3395    /// ```
3396    fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
3397        // Parse the fields definition if exist `<[field_name] field_type, ...>`
3398        self.prev_token();
3399        let (fields, trailing_bracket) =
3400            self.parse_struct_type_def(Self::parse_struct_field_def)?;
3401        if trailing_bracket.0 {
3402            return parser_err!(
3403                "unmatched > in STRUCT literal",
3404                self.peek_token_ref().span.start
3405            );
3406        }
3407
3408        // Parse the struct values `(expr1 [, ... ])`
3409        self.expect_token(&Token::LParen)?;
3410        let values = self
3411            .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
3412        self.expect_token(&Token::RParen)?;
3413
3414        Ok(Expr::Struct { values, fields })
3415    }
3416
3417    /// Parse an expression value for a struct literal
3418    /// Syntax
3419    /// ```sql
3420    /// expr [AS name]
3421    /// ```
3422    ///
3423    /// For biquery [1], Parameter typed_syntax is set to true if the expression
3424    /// is to be parsed as a field expression declared using typed
3425    /// struct syntax [2], and false if using typeless struct syntax [3].
3426    ///
3427    /// [1]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct
3428    /// [2]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typed_struct_syntax
3429    /// [3]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typeless_struct_syntax
3430    fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
3431        let expr = self.parse_expr()?;
3432        if self.parse_keyword(Keyword::AS) {
3433            if typed_syntax {
3434                return parser_err!("Typed syntax does not allow AS", {
3435                    self.prev_token();
3436                    self.peek_token_ref().span.start
3437                });
3438            }
3439            let field_name = self.parse_identifier()?;
3440            Ok(Expr::Named {
3441                expr: expr.into(),
3442                name: field_name,
3443            })
3444        } else {
3445            Ok(expr)
3446        }
3447    }
3448
3449    /// Parse a Struct type definition as a sequence of field-value pairs.
3450    /// The syntax of the Struct elem differs by dialect so it is customised
3451    /// by the `elem_parser` argument.
3452    ///
3453    /// Syntax
3454    /// ```sql
3455    /// Hive:
3456    /// STRUCT<field_name: field_type>
3457    ///
3458    /// BigQuery:
3459    /// STRUCT<[field_name] field_type>
3460    /// ```
3461    fn parse_struct_type_def<F>(
3462        &mut self,
3463        mut elem_parser: F,
3464    ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
3465    where
3466        F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
3467    {
3468        self.expect_keyword_is(Keyword::STRUCT)?;
3469
3470        // Nothing to do if we have no type information.
3471        if self.peek_token_ref().token != Token::Lt {
3472            return Ok((Default::default(), false.into()));
3473        }
3474        self.next_token();
3475
3476        let mut field_defs = vec![];
3477        let trailing_bracket = loop {
3478            let (def, trailing_bracket) = elem_parser(self)?;
3479            field_defs.push(def);
3480            // The struct field definition is finished if it occurs `>>` or comma.
3481            if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
3482                break trailing_bracket;
3483            }
3484        };
3485
3486        Ok((
3487            field_defs,
3488            self.expect_closing_angle_bracket(trailing_bracket)?,
3489        ))
3490    }
3491
3492    /// Duckdb Struct Data Type <https://duckdb.org/docs/sql/data_types/struct.html#retrieving-from-structs>
3493    fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3494        self.expect_keyword_is(Keyword::STRUCT)?;
3495        self.expect_token(&Token::LParen)?;
3496        let struct_body = self.parse_comma_separated(|parser| {
3497            let field_name = parser.parse_identifier()?;
3498            let field_type = parser.parse_data_type()?;
3499
3500            Ok(StructField {
3501                field_name: Some(field_name),
3502                field_type,
3503                options: None,
3504            })
3505        });
3506        self.expect_token(&Token::RParen)?;
3507        struct_body
3508    }
3509
3510    /// Parse a field definition in a [struct] or [tuple].
3511    /// Syntax:
3512    ///
3513    /// ```sql
3514    /// [field_name] field_type
3515    /// field_name: field_type
3516    /// ```
3517    ///
3518    /// [struct]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#declaring_a_struct_type
3519    /// [tuple]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
3520    /// [databricks]: https://docs.databricks.com/en/sql/language-manual/data-types/struct-type.html
3521    fn parse_struct_field_def(
3522        &mut self,
3523    ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
3524        // Look beyond the next item to infer whether both field name
3525        // and type are specified.
3526        let is_named_field = matches!(
3527            (self.peek_nth_token(0).token, self.peek_nth_token(1).token),
3528            (Token::Word(_), Token::Word(_)) | (Token::Word(_), Token::Colon)
3529        );
3530
3531        let field_name = if is_named_field {
3532            let name = self.parse_identifier()?;
3533            let _ = self.consume_token(&Token::Colon);
3534            Some(name)
3535        } else {
3536            None
3537        };
3538
3539        let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
3540
3541        let options = self.maybe_parse_options(Keyword::OPTIONS)?;
3542        Ok((
3543            StructField {
3544                field_name,
3545                field_type,
3546                options,
3547            },
3548            trailing_bracket,
3549        ))
3550    }
3551
3552    /// DuckDB specific: Parse a Union type definition as a sequence of field-value pairs.
3553    ///
3554    /// Syntax:
3555    ///
3556    /// ```sql
3557    /// UNION(field_name field_type[,...])
3558    /// ```
3559    ///
3560    /// [1]: https://duckdb.org/docs/sql/data_types/union.html
3561    fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
3562        self.expect_keyword_is(Keyword::UNION)?;
3563
3564        self.expect_token(&Token::LParen)?;
3565
3566        let fields = self.parse_comma_separated(|p| {
3567            Ok(UnionField {
3568                field_name: p.parse_identifier()?,
3569                field_type: p.parse_data_type()?,
3570            })
3571        })?;
3572
3573        self.expect_token(&Token::RParen)?;
3574
3575        Ok(fields)
3576    }
3577
3578    /// DuckDB and ClickHouse specific: Parse a duckdb [dictionary] or a clickhouse [map] setting
3579    ///
3580    /// Syntax:
3581    ///
3582    /// ```sql
3583    /// {'field_name': expr1[, ... ]}
3584    /// ```
3585    ///
3586    /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
3587    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
3588    fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
3589        self.expect_token(&Token::LBrace)?;
3590
3591        let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
3592
3593        self.expect_token(&Token::RBrace)?;
3594
3595        Ok(Expr::Dictionary(fields))
3596    }
3597
3598    /// Parse a field for a duckdb [dictionary] or a clickhouse [map] setting
3599    ///
3600    /// Syntax
3601    ///
3602    /// ```sql
3603    /// 'name': expr
3604    /// ```
3605    ///
3606    /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
3607    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
3608    fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
3609        let key = self.parse_identifier()?;
3610
3611        self.expect_token(&Token::Colon)?;
3612
3613        let expr = self.parse_expr()?;
3614
3615        Ok(DictionaryField {
3616            key,
3617            value: Box::new(expr),
3618        })
3619    }
3620
3621    /// DuckDB specific: Parse a duckdb [map]
3622    ///
3623    /// Syntax:
3624    ///
3625    /// ```sql
3626    /// Map {key1: value1[, ... ]}
3627    /// ```
3628    ///
3629    /// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
3630    fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
3631        self.expect_token(&Token::LBrace)?;
3632        let fields = self.parse_comma_separated0(Self::parse_duckdb_map_field, Token::RBrace)?;
3633        self.expect_token(&Token::RBrace)?;
3634        Ok(Expr::Map(Map { entries: fields }))
3635    }
3636
3637    /// Parse a field for a duckdb [map]
3638    ///
3639    /// Syntax
3640    ///
3641    /// ```sql
3642    /// key: value
3643    /// ```
3644    ///
3645    /// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
3646    fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
3647        // Stop before `:` so it can act as a key/value separator
3648        let key = self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
3649
3650        self.expect_token(&Token::Colon)?;
3651
3652        let value = self.parse_expr()?;
3653
3654        Ok(MapEntry {
3655            key: Box::new(key),
3656            value: Box::new(value),
3657        })
3658    }
3659
3660    /// Parse clickhouse [map]
3661    ///
3662    /// Syntax
3663    ///
3664    /// ```sql
3665    /// Map(key_data_type, value_data_type)
3666    /// ```
3667    ///
3668    /// [map]: https://clickhouse.com/docs/en/sql-reference/data-types/map
3669    fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
3670        self.expect_keyword_is(Keyword::MAP)?;
3671        self.expect_token(&Token::LParen)?;
3672        let key_data_type = self.parse_data_type()?;
3673        self.expect_token(&Token::Comma)?;
3674        let value_data_type = self.parse_data_type()?;
3675        self.expect_token(&Token::RParen)?;
3676
3677        Ok((key_data_type, value_data_type))
3678    }
3679
3680    /// Parse clickhouse [tuple]
3681    ///
3682    /// Syntax
3683    ///
3684    /// ```sql
3685    /// Tuple([field_name] field_type, ...)
3686    /// ```
3687    ///
3688    /// [tuple]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
3689    fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3690        self.expect_keyword_is(Keyword::TUPLE)?;
3691        self.expect_token(&Token::LParen)?;
3692        let mut field_defs = vec![];
3693        loop {
3694            let (def, _) = self.parse_struct_field_def()?;
3695            field_defs.push(def);
3696            if !self.consume_token(&Token::Comma) {
3697                break;
3698            }
3699        }
3700        self.expect_token(&Token::RParen)?;
3701
3702        Ok(field_defs)
3703    }
3704
3705    /// For nested types that use the angle bracket syntax, this matches either
3706    /// `>`, `>>` or nothing depending on which variant is expected (specified by the previously
3707    /// matched `trailing_bracket` argument). It returns whether there is a trailing
3708    /// left to be matched - (i.e. if '>>' was matched).
3709    fn expect_closing_angle_bracket(
3710        &mut self,
3711        trailing_bracket: MatchedTrailingBracket,
3712    ) -> Result<MatchedTrailingBracket, ParserError> {
3713        let trailing_bracket = if !trailing_bracket.0 {
3714            match &self.peek_token_ref().token {
3715                Token::Gt => {
3716                    self.next_token();
3717                    false.into()
3718                }
3719                Token::ShiftRight => {
3720                    self.next_token();
3721                    true.into()
3722                }
3723                _ => return self.expected_ref(">", self.peek_token_ref()),
3724            }
3725        } else {
3726            false.into()
3727        };
3728
3729        Ok(trailing_bracket)
3730    }
3731
3732    /// Parse an operator following an expression
3733    pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
3734        // allow the dialect to override infix parsing
3735        if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
3736            return infix;
3737        }
3738
3739        let dialect = self.dialect;
3740
3741        self.advance_token();
3742        let tok = self.get_current_token();
3743        debug!("infix: {tok:?}");
3744        let tok_index = self.get_current_index();
3745        let span = tok.span;
3746        let regular_binary_operator = match &tok.token {
3747            Token::Spaceship => Some(BinaryOperator::Spaceship),
3748            Token::DoubleEq => Some(BinaryOperator::Eq),
3749            Token::Assignment => Some(BinaryOperator::Assignment),
3750            Token::Eq => Some(BinaryOperator::Eq),
3751            Token::Neq => Some(BinaryOperator::NotEq),
3752            Token::Gt => Some(BinaryOperator::Gt),
3753            Token::GtEq => Some(BinaryOperator::GtEq),
3754            Token::Lt => Some(BinaryOperator::Lt),
3755            Token::LtEq => Some(BinaryOperator::LtEq),
3756            Token::Plus => Some(BinaryOperator::Plus),
3757            Token::Minus => Some(BinaryOperator::Minus),
3758            Token::Mul => Some(BinaryOperator::Multiply),
3759            Token::Mod => Some(BinaryOperator::Modulo),
3760            Token::StringConcat => Some(BinaryOperator::StringConcat),
3761            Token::Pipe => Some(BinaryOperator::BitwiseOr),
3762            Token::Caret => {
3763                // In PostgreSQL, ^ stands for the exponentiation operation,
3764                // and # stands for XOR. See https://www.postgresql.org/docs/current/functions-math.html
3765                if dialect_is!(dialect is PostgreSqlDialect) {
3766                    Some(BinaryOperator::PGExp)
3767                } else {
3768                    Some(BinaryOperator::BitwiseXor)
3769                }
3770            }
3771            Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
3772            Token::Div => Some(BinaryOperator::Divide),
3773            Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
3774                Some(BinaryOperator::DuckIntegerDivide)
3775            }
3776            Token::ShiftLeft if dialect.supports_bitwise_shift_operators() => {
3777                Some(BinaryOperator::PGBitwiseShiftLeft)
3778            }
3779            Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
3780                Some(BinaryOperator::PGBitwiseShiftRight)
3781            }
3782            Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3783                Some(BinaryOperator::PGBitwiseXor)
3784            }
3785            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3786                Some(BinaryOperator::PGOverlap)
3787            }
3788            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3789                Some(BinaryOperator::PGOverlap)
3790            }
3791            Token::Overlap if dialect.supports_double_ampersand_operator() => {
3792                Some(BinaryOperator::And)
3793            }
3794            Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3795                Some(BinaryOperator::PGStartsWith)
3796            }
3797            Token::Tilde => Some(BinaryOperator::PGRegexMatch),
3798            Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
3799            Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
3800            Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
3801            Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
3802            Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
3803            Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
3804            Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
3805            Token::Arrow => Some(BinaryOperator::Arrow),
3806            Token::LongArrow => Some(BinaryOperator::LongArrow),
3807            Token::HashArrow => Some(BinaryOperator::HashArrow),
3808            Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
3809            Token::AtArrow => Some(BinaryOperator::AtArrow),
3810            Token::ArrowAt => Some(BinaryOperator::ArrowAt),
3811            Token::HashMinus => Some(BinaryOperator::HashMinus),
3812            Token::AtQuestion => Some(BinaryOperator::AtQuestion),
3813            Token::AtAt => Some(BinaryOperator::AtAt),
3814            Token::Question => Some(BinaryOperator::Question),
3815            Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
3816            Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
3817            Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
3818            Token::DoubleSharp if self.dialect.supports_geometric_types() => {
3819                Some(BinaryOperator::DoubleHash)
3820            }
3821
3822            Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
3823                Some(BinaryOperator::AndLt)
3824            }
3825            Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
3826                Some(BinaryOperator::AndGt)
3827            }
3828            Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
3829                Some(BinaryOperator::QuestionDash)
3830            }
3831            Token::AmpersandLeftAngleBracketVerticalBar
3832                if self.dialect.supports_geometric_types() =>
3833            {
3834                Some(BinaryOperator::AndLtPipe)
3835            }
3836            Token::VerticalBarAmpersandRightAngleBracket
3837                if self.dialect.supports_geometric_types() =>
3838            {
3839                Some(BinaryOperator::PipeAndGt)
3840            }
3841            Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
3842                Some(BinaryOperator::LtDashGt)
3843            }
3844            Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
3845                Some(BinaryOperator::LtCaret)
3846            }
3847            Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
3848                Some(BinaryOperator::GtCaret)
3849            }
3850            Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
3851                Some(BinaryOperator::QuestionHash)
3852            }
3853            Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
3854                Some(BinaryOperator::QuestionDoublePipe)
3855            }
3856            Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
3857                Some(BinaryOperator::QuestionDashPipe)
3858            }
3859            Token::TildeEqual if self.dialect.supports_geometric_types() => {
3860                Some(BinaryOperator::TildeEq)
3861            }
3862            Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
3863                Some(BinaryOperator::LtLtPipe)
3864            }
3865            Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
3866                Some(BinaryOperator::PipeGtGt)
3867            }
3868            Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
3869
3870            Token::Word(w) => match w.keyword {
3871                Keyword::AND => Some(BinaryOperator::And),
3872                Keyword::OR => Some(BinaryOperator::Or),
3873                Keyword::XOR => Some(BinaryOperator::Xor),
3874                Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
3875                Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3876                    self.expect_token(&Token::LParen)?;
3877                    // there are special rules for operator names in
3878                    // postgres so we can not use 'parse_object'
3879                    // or similar.
3880                    // See https://www.postgresql.org/docs/current/sql-createoperator.html
3881                    let mut idents = vec![];
3882                    loop {
3883                        self.advance_token();
3884                        idents.push(self.get_current_token().to_string());
3885                        if !self.consume_token(&Token::Period) {
3886                            break;
3887                        }
3888                    }
3889                    self.expect_token(&Token::RParen)?;
3890                    Some(BinaryOperator::PGCustomBinaryOperator(idents))
3891                }
3892                _ => None,
3893            },
3894            _ => None,
3895        };
3896
3897        let tok = self.token_at(tok_index);
3898        if let Some(op) = regular_binary_operator {
3899            if let Some(keyword) =
3900                self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
3901            {
3902                self.expect_token(&Token::LParen)?;
3903                let right = if self.peek_sub_query() {
3904                    // We have a subquery ahead (SELECT\WITH ...) need to rewind and
3905                    // use the parenthesis for parsing the subquery as an expression.
3906                    self.prev_token(); // LParen
3907                    self.parse_subexpr(precedence)?
3908                } else {
3909                    // Non-subquery expression
3910                    let right = self.parse_subexpr(precedence)?;
3911                    self.expect_token(&Token::RParen)?;
3912                    right
3913                };
3914
3915                if !matches!(
3916                    op,
3917                    BinaryOperator::Gt
3918                        | BinaryOperator::Lt
3919                        | BinaryOperator::GtEq
3920                        | BinaryOperator::LtEq
3921                        | BinaryOperator::Eq
3922                        | BinaryOperator::NotEq
3923                        | BinaryOperator::PGRegexMatch
3924                        | BinaryOperator::PGRegexIMatch
3925                        | BinaryOperator::PGRegexNotMatch
3926                        | BinaryOperator::PGRegexNotIMatch
3927                        | BinaryOperator::PGLikeMatch
3928                        | BinaryOperator::PGILikeMatch
3929                        | BinaryOperator::PGNotLikeMatch
3930                        | BinaryOperator::PGNotILikeMatch
3931                ) {
3932                    return parser_err!(
3933                        format!(
3934                        "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
3935                    ),
3936                        span.start
3937                    );
3938                };
3939
3940                Ok(match keyword {
3941                    Keyword::ALL => Expr::AllOp {
3942                        left: Box::new(expr),
3943                        compare_op: op,
3944                        right: Box::new(right),
3945                    },
3946                    Keyword::ANY | Keyword::SOME => Expr::AnyOp {
3947                        left: Box::new(expr),
3948                        compare_op: op,
3949                        right: Box::new(right),
3950                        is_some: keyword == Keyword::SOME,
3951                    },
3952                    unexpected_keyword => return Err(ParserError::ParserError(
3953                        format!("Internal parser error: expected any of {{ALL, ANY, SOME}}, got {unexpected_keyword:?}"),
3954                    )),
3955                })
3956            } else {
3957                Ok(Expr::BinaryOp {
3958                    left: Box::new(expr),
3959                    op,
3960                    right: Box::new(self.parse_subexpr(precedence)?),
3961                })
3962            }
3963        } else if let Token::Word(w) = &tok.token {
3964            match w.keyword {
3965                Keyword::IS => {
3966                    if self.parse_keyword(Keyword::NULL) {
3967                        Ok(Expr::IsNull(Box::new(expr)))
3968                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
3969                        Ok(Expr::IsNotNull(Box::new(expr)))
3970                    } else if self.parse_keywords(&[Keyword::TRUE]) {
3971                        Ok(Expr::IsTrue(Box::new(expr)))
3972                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
3973                        Ok(Expr::IsNotTrue(Box::new(expr)))
3974                    } else if self.parse_keywords(&[Keyword::FALSE]) {
3975                        Ok(Expr::IsFalse(Box::new(expr)))
3976                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
3977                        Ok(Expr::IsNotFalse(Box::new(expr)))
3978                    } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
3979                        Ok(Expr::IsUnknown(Box::new(expr)))
3980                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
3981                        Ok(Expr::IsNotUnknown(Box::new(expr)))
3982                    } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
3983                        let expr2 = self.parse_expr()?;
3984                        Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
3985                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
3986                    {
3987                        let expr2 = self.parse_expr()?;
3988                        Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
3989                    } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
3990                        Ok(is_normalized)
3991                    } else {
3992                        self.expected_ref(
3993                            "[NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS",
3994                            self.peek_token_ref(),
3995                        )
3996                    }
3997                }
3998                Keyword::AT => {
3999                    self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
4000                    Ok(Expr::AtTimeZone {
4001                        timestamp: Box::new(expr),
4002                        time_zone: Box::new(self.parse_subexpr(precedence)?),
4003                    })
4004                }
4005                Keyword::NOT
4006                | Keyword::IN
4007                | Keyword::BETWEEN
4008                | Keyword::LIKE
4009                | Keyword::ILIKE
4010                | Keyword::SIMILAR
4011                | Keyword::REGEXP
4012                | Keyword::RLIKE => {
4013                    self.prev_token();
4014                    let negated = self.parse_keyword(Keyword::NOT);
4015                    let regexp = self.parse_keyword(Keyword::REGEXP);
4016                    let rlike = self.parse_keyword(Keyword::RLIKE);
4017                    let null = if !self.in_column_definition_state() {
4018                        self.parse_keyword(Keyword::NULL)
4019                    } else {
4020                        false
4021                    };
4022                    if regexp || rlike {
4023                        Ok(Expr::RLike {
4024                            negated,
4025                            expr: Box::new(expr),
4026                            pattern: Box::new(
4027                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4028                            ),
4029                            regexp,
4030                        })
4031                    } else if negated && null {
4032                        Ok(Expr::IsNotNull(Box::new(expr)))
4033                    } else if self.parse_keyword(Keyword::IN) {
4034                        self.parse_in(expr, negated)
4035                    } else if self.parse_keyword(Keyword::BETWEEN) {
4036                        self.parse_between(expr, negated)
4037                    } else if self.parse_keyword(Keyword::LIKE) {
4038                        Ok(Expr::Like {
4039                            negated,
4040                            any: self.parse_keyword(Keyword::ANY),
4041                            expr: Box::new(expr),
4042                            pattern: Box::new(
4043                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4044                            ),
4045                            escape_char: self.parse_escape_char()?,
4046                        })
4047                    } else if self.parse_keyword(Keyword::ILIKE) {
4048                        Ok(Expr::ILike {
4049                            negated,
4050                            any: self.parse_keyword(Keyword::ANY),
4051                            expr: Box::new(expr),
4052                            pattern: Box::new(
4053                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4054                            ),
4055                            escape_char: self.parse_escape_char()?,
4056                        })
4057                    } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
4058                        Ok(Expr::SimilarTo {
4059                            negated,
4060                            expr: Box::new(expr),
4061                            pattern: Box::new(
4062                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4063                            ),
4064                            escape_char: self.parse_escape_char()?,
4065                        })
4066                    } else {
4067                        self.expected_ref("IN or BETWEEN after NOT", self.peek_token_ref())
4068                    }
4069                }
4070                Keyword::NOTNULL if dialect.supports_notnull_operator() => {
4071                    Ok(Expr::IsNotNull(Box::new(expr)))
4072                }
4073                Keyword::MEMBER => {
4074                    if self.parse_keyword(Keyword::OF) {
4075                        self.expect_token(&Token::LParen)?;
4076                        let array = self.parse_expr()?;
4077                        self.expect_token(&Token::RParen)?;
4078                        Ok(Expr::MemberOf(MemberOf {
4079                            value: Box::new(expr),
4080                            array: Box::new(array),
4081                        }))
4082                    } else {
4083                        self.expected_ref("OF after MEMBER", self.peek_token_ref())
4084                    }
4085                }
4086                // Can only happen if `get_next_precedence` got out of sync with this function
4087                _ => parser_err!(
4088                    format!("No infix parser for token {:?}", tok.token),
4089                    tok.span.start
4090                ),
4091            }
4092        } else if Token::DoubleColon == *tok {
4093            Ok(Expr::Cast {
4094                kind: CastKind::DoubleColon,
4095                expr: Box::new(expr),
4096                data_type: self.parse_data_type()?,
4097                array: false,
4098                format: None,
4099            })
4100        } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
4101            Ok(Expr::UnaryOp {
4102                op: UnaryOperator::PGPostfixFactorial,
4103                expr: Box::new(expr),
4104            })
4105        } else if Token::LBracket == *tok && self.dialect.supports_partiql()
4106            || (Token::Colon == *tok)
4107        {
4108            self.prev_token();
4109            self.parse_json_access(expr)
4110        } else {
4111            // Can only happen if `get_next_precedence` got out of sync with this function
4112            parser_err!(
4113                format!("No infix parser for token {:?}", tok.token),
4114                tok.span.start
4115            )
4116        }
4117    }
4118
4119    /// Parse the `ESCAPE CHAR` portion of `LIKE`, `ILIKE`, and `SIMILAR TO`
4120    pub fn parse_escape_char(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
4121        if self.parse_keyword(Keyword::ESCAPE) {
4122            Ok(Some(self.parse_value()?))
4123        } else {
4124            Ok(None)
4125        }
4126    }
4127
4128    /// Parses an array subscript like
4129    /// * `[:]`
4130    /// * `[l]`
4131    /// * `[l:]`
4132    /// * `[:u]`
4133    /// * `[l:u]`
4134    /// * `[l:u:s]`
4135    ///
4136    /// Parser is right after `[`
4137    fn parse_subscript_inner(&mut self) -> Result<Subscript, ParserError> {
4138        // at either `<lower>:(rest)` or `:(rest)]`
4139        let lower_bound = if self.consume_token(&Token::Colon) {
4140            None
4141        } else {
4142            // parse expr until we hit a colon (or any token with lower precedence)
4143            Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4144        };
4145
4146        // check for end
4147        if self.consume_token(&Token::RBracket) {
4148            if let Some(lower_bound) = lower_bound {
4149                return Ok(Subscript::Index { index: lower_bound });
4150            };
4151            return Ok(Subscript::Slice {
4152                lower_bound,
4153                upper_bound: None,
4154                stride: None,
4155            });
4156        }
4157
4158        // consume the `:`
4159        if lower_bound.is_some() {
4160            self.expect_token(&Token::Colon)?;
4161        }
4162
4163        // we are now at either `]`, `<upper>(rest)]`
4164        let upper_bound = if self.consume_token(&Token::RBracket) {
4165            return Ok(Subscript::Slice {
4166                lower_bound,
4167                upper_bound: None,
4168                stride: None,
4169            });
4170        } else {
4171            // parse expr until we hit a colon (or any token with lower precedence)
4172            Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4173        };
4174
4175        // check for end
4176        if self.consume_token(&Token::RBracket) {
4177            return Ok(Subscript::Slice {
4178                lower_bound,
4179                upper_bound,
4180                stride: None,
4181            });
4182        }
4183
4184        // we are now at `:]` or `:stride]`
4185        self.expect_token(&Token::Colon)?;
4186        let stride = if self.consume_token(&Token::RBracket) {
4187            None
4188        } else {
4189            Some(self.parse_expr()?)
4190        };
4191
4192        if stride.is_some() {
4193            self.expect_token(&Token::RBracket)?;
4194        }
4195
4196        Ok(Subscript::Slice {
4197            lower_bound,
4198            upper_bound,
4199            stride,
4200        })
4201    }
4202
4203    /// Parse a multi-dimension array accessing like `[1:3][1][1]`
4204    pub fn parse_multi_dim_subscript(
4205        &mut self,
4206        chain: &mut Vec<AccessExpr>,
4207    ) -> Result<(), ParserError> {
4208        while self.consume_token(&Token::LBracket) {
4209            self.parse_subscript(chain)?;
4210        }
4211        Ok(())
4212    }
4213
4214    /// Parses an array subscript like `[1:3]`
4215    ///
4216    /// Parser is right after `[`
4217    fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
4218        let subscript = self.parse_subscript_inner()?;
4219        chain.push(AccessExpr::Subscript(subscript));
4220        Ok(())
4221    }
4222
4223    fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
4224        let token = self.next_token();
4225        match token.token {
4226            Token::Word(Word {
4227                value,
4228                // path segments in SF dot notation can be unquoted or double-quoted;
4229                // Databricks also supports backtick-quoted identifiers
4230                quote_style: quote_style @ (Some('"') | Some('`') | None),
4231                // some experimentation suggests that snowflake permits
4232                // any keyword here unquoted.
4233                keyword: _,
4234            }) => Ok(JsonPathElem::Dot {
4235                key: value,
4236                quoted: quote_style.is_some(),
4237            }),
4238
4239            // This token should never be generated on snowflake or generic
4240            // dialects, but we handle it just in case this is used on future
4241            // dialects.
4242            Token::DoubleQuotedString(key) => Ok(JsonPathElem::Dot { key, quoted: true }),
4243
4244            _ => self.expected("variant object key name", token),
4245        }
4246    }
4247
4248    fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4249        let path = self.parse_json_path()?;
4250        Ok(Expr::JsonAccess {
4251            value: Box::new(expr),
4252            path,
4253        })
4254    }
4255
4256    fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
4257        let mut path = Vec::new();
4258        loop {
4259            match self.next_token().token {
4260                Token::Colon if path.is_empty() && self.peek_token_ref() == &Token::LBracket => {
4261                    self.next_token();
4262                    let key = self.parse_wildcard_expr()?;
4263                    self.expect_token(&Token::RBracket)?;
4264                    path.push(JsonPathElem::ColonBracket { key });
4265                }
4266                Token::Colon if path.is_empty() => {
4267                    path.push(self.parse_json_path_object_key()?);
4268                }
4269                Token::Period if !path.is_empty() => {
4270                    path.push(self.parse_json_path_object_key()?);
4271                }
4272                Token::LBracket => {
4273                    let key = self.parse_wildcard_expr()?;
4274                    self.expect_token(&Token::RBracket)?;
4275
4276                    path.push(JsonPathElem::Bracket { key });
4277                }
4278                _ => {
4279                    self.prev_token();
4280                    break;
4281                }
4282            };
4283        }
4284
4285        debug_assert!(!path.is_empty());
4286        Ok(JsonPath { path })
4287    }
4288
4289    /// Parses the parens following the `[ NOT ] IN` operator.
4290    pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4291        // BigQuery allows `IN UNNEST(array_expression)`
4292        // https://cloud.google.com/bigquery/docs/reference/standard-sql/operators#in_operators
4293        if self.parse_keyword(Keyword::UNNEST) {
4294            self.expect_token(&Token::LParen)?;
4295            let array_expr = self.parse_expr()?;
4296            self.expect_token(&Token::RParen)?;
4297            return Ok(Expr::InUnnest {
4298                expr: Box::new(expr),
4299                array_expr: Box::new(array_expr),
4300                negated,
4301            });
4302        }
4303        self.expect_token(&Token::LParen)?;
4304        let in_op = match self.maybe_parse(|p| p.parse_query())? {
4305            Some(subquery) => Expr::InSubquery {
4306                expr: Box::new(expr),
4307                subquery,
4308                negated,
4309            },
4310            None => Expr::InList {
4311                expr: Box::new(expr),
4312                list: if self.dialect.supports_in_empty_list() {
4313                    self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
4314                } else {
4315                    self.parse_comma_separated(Parser::parse_expr)?
4316                },
4317                negated,
4318            },
4319        };
4320        self.expect_token(&Token::RParen)?;
4321        Ok(in_op)
4322    }
4323
4324    /// Parses `BETWEEN <low> AND <high>`, assuming the `BETWEEN` keyword was already consumed.
4325    pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4326        // Stop parsing subexpressions for <low> and <high> on tokens with
4327        // precedence lower than that of `BETWEEN`, such as `AND`, `IS`, etc.
4328        let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4329        self.expect_keyword_is(Keyword::AND)?;
4330        let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4331        Ok(Expr::Between {
4332            expr: Box::new(expr),
4333            negated,
4334            low: Box::new(low),
4335            high: Box::new(high),
4336        })
4337    }
4338
4339    /// Parse a PostgreSQL casting style which is in the form of `expr::datatype`.
4340    pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4341        Ok(Expr::Cast {
4342            kind: CastKind::DoubleColon,
4343            expr: Box::new(expr),
4344            data_type: self.parse_data_type()?,
4345            array: false,
4346            format: None,
4347        })
4348    }
4349
4350    /// Get the precedence of the next token
4351    pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
4352        self.dialect.get_next_precedence_default(self)
4353    }
4354
4355    /// Return the token at the given location, or EOF if the index is beyond
4356    /// the length of the current set of tokens.
4357    pub fn token_at(&self, index: usize) -> &TokenWithSpan {
4358        self.tokens.get(index).unwrap_or(&EOF_TOKEN)
4359    }
4360
4361    /// Return the first non-whitespace token that has not yet been processed
4362    /// or Token::EOF
4363    ///
4364    /// See [`Self::peek_token_ref`] to avoid the copy.
4365    pub fn peek_token(&self) -> TokenWithSpan {
4366        self.peek_nth_token(0)
4367    }
4368
4369    /// Return a reference to the first non-whitespace token that has not yet
4370    /// been processed or Token::EOF
4371    pub fn peek_token_ref(&self) -> &TokenWithSpan {
4372        self.peek_nth_token_ref(0)
4373    }
4374
4375    /// Returns the `N` next non-whitespace tokens that have not yet been
4376    /// processed.
4377    ///
4378    /// Example:
4379    /// ```rust
4380    /// # use sqlparser::dialect::GenericDialect;
4381    /// # use sqlparser::parser::Parser;
4382    /// # use sqlparser::keywords::Keyword;
4383    /// # use sqlparser::tokenizer::{Token, Word};
4384    /// let dialect = GenericDialect {};
4385    /// let mut parser = Parser::new(&dialect).try_with_sql("ORDER BY foo, bar").unwrap();
4386    ///
4387    /// // Note that Rust infers the number of tokens to peek based on the
4388    /// // length of the slice pattern!
4389    /// assert!(matches!(
4390    ///     parser.peek_tokens(),
4391    ///     [
4392    ///         Token::Word(Word { keyword: Keyword::ORDER, .. }),
4393    ///         Token::Word(Word { keyword: Keyword::BY, .. }),
4394    ///     ]
4395    /// ));
4396    /// ```
4397    pub fn peek_tokens<const N: usize>(&self) -> [Token; N] {
4398        self.peek_tokens_with_location()
4399            .map(|with_loc| with_loc.token)
4400    }
4401
4402    /// Returns the `N` next non-whitespace tokens with locations that have not
4403    /// yet been processed.
4404    ///
4405    /// See [`Self::peek_token`] for an example.
4406    pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
4407        let mut index = self.index;
4408        core::array::from_fn(|_| loop {
4409            let token = self.tokens.get(index);
4410            index += 1;
4411            if let Some(TokenWithSpan {
4412                token: Token::Whitespace(_),
4413                span: _,
4414            }) = token
4415            {
4416                continue;
4417            }
4418            break token.cloned().unwrap_or(TokenWithSpan {
4419                token: Token::EOF,
4420                span: Span::empty(),
4421            });
4422        })
4423    }
4424
4425    /// Returns references to the `N` next non-whitespace tokens
4426    /// that have not yet been processed.
4427    ///
4428    /// See [`Self::peek_tokens`] for an example.
4429    pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
4430        let mut index = self.index;
4431        core::array::from_fn(|_| loop {
4432            let token = self.tokens.get(index);
4433            index += 1;
4434            if let Some(TokenWithSpan {
4435                token: Token::Whitespace(_),
4436                span: _,
4437            }) = token
4438            {
4439                continue;
4440            }
4441            break token.unwrap_or(&EOF_TOKEN);
4442        })
4443    }
4444
4445    /// Return nth non-whitespace token that has not yet been processed
4446    pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
4447        self.peek_nth_token_ref(n).clone()
4448    }
4449
4450    /// Return nth non-whitespace token that has not yet been processed
4451    pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
4452        let mut index = self.index;
4453        loop {
4454            index += 1;
4455            match self.tokens.get(index - 1) {
4456                Some(TokenWithSpan {
4457                    token: Token::Whitespace(_),
4458                    span: _,
4459                }) => continue,
4460                non_whitespace => {
4461                    if n == 0 {
4462                        return non_whitespace.unwrap_or(&EOF_TOKEN);
4463                    }
4464                    n -= 1;
4465                }
4466            }
4467        }
4468    }
4469
4470    /// Return the first token, possibly whitespace, that has not yet been processed
4471    /// (or None if reached end-of-file).
4472    pub fn peek_token_no_skip(&self) -> TokenWithSpan {
4473        self.peek_nth_token_no_skip(0)
4474    }
4475
4476    /// Return nth token, possibly whitespace, that has not yet been processed.
4477    pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
4478        self.tokens
4479            .get(self.index + n)
4480            .cloned()
4481            .unwrap_or(TokenWithSpan {
4482                token: Token::EOF,
4483                span: Span::empty(),
4484            })
4485    }
4486
4487    /// Return nth token, possibly whitespace, that has not yet been processed.
4488    fn peek_nth_token_no_skip_ref(&self, n: usize) -> &TokenWithSpan {
4489        self.tokens.get(self.index + n).unwrap_or(&EOF_TOKEN)
4490    }
4491
4492    /// Return true if the next tokens exactly `expected`
4493    ///
4494    /// Does not advance the current token.
4495    fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
4496        let index = self.index;
4497        let matched = self.parse_keywords(expected);
4498        self.index = index;
4499        matched
4500    }
4501
4502    /// Advances to the next non-whitespace token and returns a copy.
4503    ///
4504    /// Please use [`Self::advance_token`] and [`Self::get_current_token`] to
4505    /// avoid the copy.
4506    pub fn next_token(&mut self) -> TokenWithSpan {
4507        self.advance_token();
4508        self.get_current_token().clone()
4509    }
4510
4511    /// Returns the index of the current token
4512    ///
4513    /// This can be used with APIs that expect an index, such as
4514    /// [`Self::token_at`]
4515    pub fn get_current_index(&self) -> usize {
4516        self.index.saturating_sub(1)
4517    }
4518
4519    /// Return the next unprocessed token, possibly whitespace.
4520    pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
4521        self.index += 1;
4522        self.tokens.get(self.index - 1)
4523    }
4524
4525    /// Advances the current token to the next non-whitespace token
4526    ///
4527    /// See [`Self::get_current_token`] to get the current token after advancing
4528    pub fn advance_token(&mut self) {
4529        loop {
4530            self.index += 1;
4531            match self.tokens.get(self.index - 1) {
4532                Some(TokenWithSpan {
4533                    token: Token::Whitespace(_),
4534                    span: _,
4535                }) => continue,
4536                _ => break,
4537            }
4538        }
4539    }
4540
4541    /// Returns a reference to the current token
4542    ///
4543    /// Does not advance the current token.
4544    pub fn get_current_token(&self) -> &TokenWithSpan {
4545        self.token_at(self.index.saturating_sub(1))
4546    }
4547
4548    /// Returns a reference to the previous token
4549    ///
4550    /// Does not advance the current token.
4551    pub fn get_previous_token(&self) -> &TokenWithSpan {
4552        self.token_at(self.index.saturating_sub(2))
4553    }
4554
4555    /// Returns a reference to the next token
4556    ///
4557    /// Does not advance the current token.
4558    pub fn get_next_token(&self) -> &TokenWithSpan {
4559        self.token_at(self.index)
4560    }
4561
4562    /// Seek back the last one non-whitespace token.
4563    ///
4564    /// Must be called after `next_token()`, otherwise might panic. OK to call
4565    /// after `next_token()` indicates an EOF.
4566    ///
4567    // TODO rename to backup_token and deprecate prev_token?
4568    pub fn prev_token(&mut self) {
4569        loop {
4570            assert!(self.index > 0);
4571            self.index -= 1;
4572            if let Some(TokenWithSpan {
4573                token: Token::Whitespace(_),
4574                span: _,
4575            }) = self.tokens.get(self.index)
4576            {
4577                continue;
4578            }
4579            return;
4580        }
4581    }
4582
4583    /// Report `found` was encountered instead of `expected`
4584    pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
4585        parser_err!(
4586            format!("Expected: {expected}, found: {found}"),
4587            found.span.start
4588        )
4589    }
4590
4591    /// report `found` was encountered instead of `expected`
4592    pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
4593        parser_err!(
4594            format!("Expected: {expected}, found: {found}"),
4595            found.span.start
4596        )
4597    }
4598
4599    /// Report that the token at `index` was found instead of `expected`.
4600    pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
4601        let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
4602        parser_err!(
4603            format!("Expected: {expected}, found: {found}"),
4604            found.span.start
4605        )
4606    }
4607
4608    /// If the current token is the `expected` keyword, consume it and returns
4609    /// true. Otherwise, no tokens are consumed and returns false.
4610    #[must_use]
4611    pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
4612        if self.peek_keyword(expected) {
4613            self.advance_token();
4614            true
4615        } else {
4616            false
4617        }
4618    }
4619
4620    #[must_use]
4621    /// Check if the current token is the expected keyword without consuming it.
4622    ///
4623    /// Returns true if the current token matches the expected keyword.
4624    pub fn peek_keyword(&self, expected: Keyword) -> bool {
4625        matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
4626    }
4627
4628    /// If the current token is the `expected` keyword followed by
4629    /// specified tokens, consume them and returns true.
4630    /// Otherwise, no tokens are consumed and returns false.
4631    ///
4632    /// Note that if the length of `tokens` is too long, this function will
4633    /// not be efficient as it does a loop on the tokens with `peek_nth_token`
4634    /// each time.
4635    pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4636        self.keyword_with_tokens(expected, tokens, true)
4637    }
4638
4639    /// Peeks to see if the current token is the `expected` keyword followed by specified tokens
4640    /// without consuming them.
4641    ///
4642    /// See [Self::parse_keyword_with_tokens] for details.
4643    pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4644        self.keyword_with_tokens(expected, tokens, false)
4645    }
4646
4647    fn keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token], consume: bool) -> bool {
4648        match &self.peek_token_ref().token {
4649            Token::Word(w) if expected == w.keyword => {
4650                for (idx, token) in tokens.iter().enumerate() {
4651                    if self.peek_nth_token_ref(idx + 1).token != *token {
4652                        return false;
4653                    }
4654                }
4655
4656                if consume {
4657                    for _ in 0..(tokens.len() + 1) {
4658                        self.advance_token();
4659                    }
4660                }
4661
4662                true
4663            }
4664            _ => false,
4665        }
4666    }
4667
4668    /// If the current and subsequent tokens exactly match the `keywords`
4669    /// sequence, consume them and returns true. Otherwise, no tokens are
4670    /// consumed and returns false
4671    #[must_use]
4672    pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
4673        self.parse_keywords_indexed(keywords).is_some()
4674    }
4675
4676    /// Just like [Self::parse_keywords], but - upon success - returns the
4677    /// token index of the first keyword.
4678    #[must_use]
4679    fn parse_keywords_indexed(&mut self, keywords: &[Keyword]) -> Option<usize> {
4680        let start_index = self.index;
4681        let mut first_keyword_index = None;
4682        for &keyword in keywords {
4683            if !self.parse_keyword(keyword) {
4684                self.index = start_index;
4685                return None;
4686            }
4687            if first_keyword_index.is_none() {
4688                first_keyword_index = Some(self.index.saturating_sub(1));
4689            }
4690        }
4691        first_keyword_index
4692    }
4693
4694    /// If the current token is one of the given `keywords`, returns the keyword
4695    /// that matches, without consuming the token. Otherwise, returns [`None`].
4696    #[must_use]
4697    pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
4698        for keyword in keywords {
4699            if self.peek_keyword(*keyword) {
4700                return Some(*keyword);
4701            }
4702        }
4703        None
4704    }
4705
4706    /// If the current token is one of the given `keywords`, consume the token
4707    /// and return the keyword that matches. Otherwise, no tokens are consumed
4708    /// and returns [`None`].
4709    #[must_use]
4710    pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
4711        match &self.peek_token_ref().token {
4712            Token::Word(w) => {
4713                keywords
4714                    .iter()
4715                    .find(|keyword| **keyword == w.keyword)
4716                    .map(|keyword| {
4717                        self.advance_token();
4718                        *keyword
4719                    })
4720            }
4721            _ => None,
4722        }
4723    }
4724
4725    /// If the current token is one of the expected keywords, consume the token
4726    /// and return the keyword that matches. Otherwise, return an error.
4727    pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
4728        if let Some(keyword) = self.parse_one_of_keywords(keywords) {
4729            Ok(keyword)
4730        } else {
4731            let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
4732            self.expected_ref(
4733                &format!("one of {}", keywords.join(" or ")),
4734                self.peek_token_ref(),
4735            )
4736        }
4737    }
4738
4739    /// If the current token is the `expected` keyword, consume the token.
4740    /// Otherwise, return an error.
4741    ///
4742    // todo deprecate in favor of expected_keyword_is
4743    pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
4744        if self.parse_keyword(expected) {
4745            Ok(self.get_current_token().clone())
4746        } else {
4747            self.expected_ref(format!("{:?}", expected).as_str(), self.peek_token_ref())
4748        }
4749    }
4750
4751    /// If the current token is the `expected` keyword, consume the token.
4752    /// Otherwise, return an error.
4753    ///
4754    /// This differs from expect_keyword only in that the matched keyword
4755    /// token is not returned.
4756    pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
4757        if self.parse_keyword(expected) {
4758            Ok(())
4759        } else {
4760            self.expected_ref(format!("{:?}", expected).as_str(), self.peek_token_ref())
4761        }
4762    }
4763
4764    /// If the current and subsequent tokens exactly match the `keywords`
4765    /// sequence, consume them and returns Ok. Otherwise, return an Error.
4766    pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
4767        for &kw in expected {
4768            self.expect_keyword_is(kw)?;
4769        }
4770        Ok(())
4771    }
4772
4773    /// Consume the next token if it matches the expected token, otherwise return false
4774    ///
4775    /// See [Self::advance_token] to consume the token unconditionally
4776    #[must_use]
4777    pub fn consume_token(&mut self, expected: &Token) -> bool {
4778        if self.peek_token_ref() == expected {
4779            self.advance_token();
4780            true
4781        } else {
4782            false
4783        }
4784    }
4785
4786    /// If the current and subsequent tokens exactly match the `tokens`
4787    /// sequence, consume them and returns true. Otherwise, no tokens are
4788    /// consumed and returns false
4789    #[must_use]
4790    pub fn consume_tokens(&mut self, tokens: &[Token]) -> bool {
4791        let index = self.index;
4792        for token in tokens {
4793            if !self.consume_token(token) {
4794                self.index = index;
4795                return false;
4796            }
4797        }
4798        true
4799    }
4800
4801    /// Bail out if the current token is not an expected keyword, or consume it if it is
4802    pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
4803        if self.peek_token_ref() == expected {
4804            Ok(self.next_token())
4805        } else {
4806            self.expected_ref(&expected.to_string(), self.peek_token_ref())
4807        }
4808    }
4809
4810    fn parse<T: FromStr>(s: String, loc: Location) -> Result<T, ParserError>
4811    where
4812        <T as FromStr>::Err: Display,
4813    {
4814        s.parse::<T>().map_err(|e| {
4815            ParserError::ParserError(format!(
4816                "Could not parse '{s}' as {}: {e}{loc}",
4817                core::any::type_name::<T>()
4818            ))
4819        })
4820    }
4821
4822    /// Parse a comma-separated list of 1+ SelectItem
4823    pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
4824        // BigQuery and Snowflake allow trailing commas, but only in project lists
4825        // e.g. `SELECT 1, 2, FROM t`
4826        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#trailing_commas
4827        // https://docs.snowflake.com/en/release-notes/2024/8_11#select-supports-trailing-commas
4828
4829        let trailing_commas =
4830            self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
4831
4832        self.parse_comma_separated_with_trailing_commas(
4833            |p| p.parse_select_item(),
4834            trailing_commas,
4835            Self::is_reserved_for_column_alias,
4836        )
4837    }
4838
4839    /// Parse a list of actions for `GRANT` statements.
4840    pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
4841        let mut values = vec![];
4842        loop {
4843            values.push(self.parse_grant_permission()?);
4844            if !self.consume_token(&Token::Comma) {
4845                break;
4846            } else if self.options.trailing_commas {
4847                match &self.peek_token_ref().token {
4848                    Token::Word(kw) if kw.keyword == Keyword::ON => {
4849                        break;
4850                    }
4851                    Token::RParen
4852                    | Token::SemiColon
4853                    | Token::EOF
4854                    | Token::RBracket
4855                    | Token::RBrace => break,
4856                    _ => continue,
4857                }
4858            }
4859        }
4860        Ok(values)
4861    }
4862
4863    /// Parse a list of [TableWithJoins]
4864    fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
4865        let trailing_commas = self.dialect.supports_from_trailing_commas();
4866
4867        self.parse_comma_separated_with_trailing_commas(
4868            Parser::parse_table_and_joins,
4869            trailing_commas,
4870            |kw, parser| !self.dialect.is_table_factor(kw, parser),
4871        )
4872    }
4873
4874    /// Parse the comma of a comma-separated syntax element.
4875    /// `R` is a predicate that should return true if the next
4876    /// keyword is a reserved keyword.
4877    /// Allows for control over trailing commas
4878    ///
4879    /// Returns true if there is a next element
4880    fn is_parse_comma_separated_end_with_trailing_commas<R>(
4881        &mut self,
4882        trailing_commas: bool,
4883        is_reserved_keyword: &R,
4884    ) -> bool
4885    where
4886        R: Fn(&Keyword, &mut Parser) -> bool,
4887    {
4888        if !self.consume_token(&Token::Comma) {
4889            true
4890        } else if trailing_commas {
4891            let token = self.next_token().token;
4892            let is_end = match token {
4893                Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
4894                Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
4895                    true
4896                }
4897                _ => false,
4898            };
4899            self.prev_token();
4900
4901            is_end
4902        } else {
4903            false
4904        }
4905    }
4906
4907    /// Parse the comma of a comma-separated syntax element.
4908    /// Returns true if there is a next element
4909    fn is_parse_comma_separated_end(&mut self) -> bool {
4910        self.is_parse_comma_separated_end_with_trailing_commas(
4911            self.options.trailing_commas,
4912            &Self::is_reserved_for_column_alias,
4913        )
4914    }
4915
4916    /// Parse a comma-separated list of 1+ items accepted by `F`
4917    pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
4918    where
4919        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4920    {
4921        self.parse_comma_separated_with_trailing_commas(
4922            f,
4923            self.options.trailing_commas,
4924            Self::is_reserved_for_column_alias,
4925        )
4926    }
4927
4928    /// Parse a comma-separated list of 1+ items accepted by `F`.
4929    /// `R` is a predicate that should return true if the next
4930    /// keyword is a reserved keyword.
4931    /// Allows for control over trailing commas.
4932    fn parse_comma_separated_with_trailing_commas<T, F, R>(
4933        &mut self,
4934        mut f: F,
4935        trailing_commas: bool,
4936        is_reserved_keyword: R,
4937    ) -> Result<Vec<T>, ParserError>
4938    where
4939        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4940        R: Fn(&Keyword, &mut Parser) -> bool,
4941    {
4942        let mut values = vec![];
4943        loop {
4944            values.push(f(self)?);
4945            if self.is_parse_comma_separated_end_with_trailing_commas(
4946                trailing_commas,
4947                &is_reserved_keyword,
4948            ) {
4949                break;
4950            }
4951        }
4952        Ok(values)
4953    }
4954
4955    /// Parse a period-separated list of 1+ items accepted by `F`
4956    fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
4957    where
4958        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4959    {
4960        let mut values = vec![];
4961        loop {
4962            values.push(f(self)?);
4963            if !self.consume_token(&Token::Period) {
4964                break;
4965            }
4966        }
4967        Ok(values)
4968    }
4969
4970    /// Parse a keyword-separated list of 1+ items accepted by `F`
4971    pub fn parse_keyword_separated<T, F>(
4972        &mut self,
4973        keyword: Keyword,
4974        mut f: F,
4975    ) -> Result<Vec<T>, ParserError>
4976    where
4977        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4978    {
4979        let mut values = vec![];
4980        loop {
4981            values.push(f(self)?);
4982            if !self.parse_keyword(keyword) {
4983                break;
4984            }
4985        }
4986        Ok(values)
4987    }
4988
4989    /// Parse an expression enclosed in parentheses.
4990    pub fn parse_parenthesized<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
4991    where
4992        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4993    {
4994        self.expect_token(&Token::LParen)?;
4995        let res = f(self)?;
4996        self.expect_token(&Token::RParen)?;
4997        Ok(res)
4998    }
4999
5000    /// Parse a comma-separated list of 0+ items accepted by `F`
5001    /// * `end_token` - expected end token for the closure (e.g. [Token::RParen], [Token::RBrace] ...)
5002    pub fn parse_comma_separated0<T, F>(
5003        &mut self,
5004        f: F,
5005        end_token: Token,
5006    ) -> Result<Vec<T>, ParserError>
5007    where
5008        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5009    {
5010        if self.peek_token_ref().token == end_token {
5011            return Ok(vec![]);
5012        }
5013
5014        if self.options.trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
5015            let _ = self.consume_token(&Token::Comma);
5016            return Ok(vec![]);
5017        }
5018
5019        self.parse_comma_separated(f)
5020    }
5021
5022    /// Parses 0 or more statements, each followed by a semicolon.
5023    /// If the next token is any of `terminal_keywords` then no more
5024    /// statements will be parsed.
5025    pub(crate) fn parse_statement_list(
5026        &mut self,
5027        terminal_keywords: &[Keyword],
5028    ) -> Result<Vec<Statement>, ParserError> {
5029        let mut values = vec![];
5030        loop {
5031            match &self.peek_nth_token_ref(0).token {
5032                Token::EOF => break,
5033                Token::Word(w)
5034                    if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) =>
5035                {
5036                    break;
5037                }
5038                _ => {}
5039            }
5040
5041            values.push(self.parse_statement()?);
5042            self.expect_token(&Token::SemiColon)?;
5043        }
5044        Ok(values)
5045    }
5046
5047    /// Default implementation of a predicate that returns true if
5048    /// the specified keyword is reserved for column alias.
5049    /// See [Dialect::is_column_alias]
5050    fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
5051        !parser.dialect.is_column_alias(kw, parser)
5052    }
5053
5054    /// Run a parser method `f`, reverting back to the current position if unsuccessful.
5055    /// Returns `ParserError::RecursionLimitExceeded` if `f` returns a `RecursionLimitExceeded`.
5056    /// Returns `Ok(None)` if `f` returns any other error.
5057    pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
5058    where
5059        F: FnMut(&mut Parser) -> Result<T, ParserError>,
5060    {
5061        match self.try_parse(f) {
5062            Ok(t) => Ok(Some(t)),
5063            Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
5064            _ => Ok(None),
5065        }
5066    }
5067
5068    /// Run a parser method `f`, reverting back to the current position if unsuccessful.
5069    pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5070    where
5071        F: FnMut(&mut Parser) -> Result<T, ParserError>,
5072    {
5073        let index = self.index;
5074        match f(self) {
5075            Ok(t) => Ok(t),
5076            Err(e) => {
5077                // Unwind stack if limit exceeded
5078                self.index = index;
5079                Err(e)
5080            }
5081        }
5082    }
5083
5084    /// Parse either `ALL`, `DISTINCT` or `DISTINCT ON (...)`. Returns [`None`] if `ALL` is parsed
5085    /// and results in a [`ParserError`] if both `ALL` and `DISTINCT` are found.
5086    pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
5087        let loc = self.peek_token_ref().span.start;
5088        let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, Keyword::DISTINCT]) {
5089            Some(Keyword::ALL) => {
5090                if self.peek_keyword(Keyword::DISTINCT) {
5091                    return parser_err!("Cannot specify ALL then DISTINCT".to_string(), loc);
5092                }
5093                Some(Distinct::All)
5094            }
5095            Some(Keyword::DISTINCT) => {
5096                if self.peek_keyword(Keyword::ALL) {
5097                    return parser_err!("Cannot specify DISTINCT then ALL".to_string(), loc);
5098                }
5099                Some(Distinct::Distinct)
5100            }
5101            None => return Ok(None),
5102            _ => return parser_err!("ALL or DISTINCT", loc),
5103        };
5104
5105        let Some(Distinct::Distinct) = distinct else {
5106            return Ok(distinct);
5107        };
5108        if !self.parse_keyword(Keyword::ON) {
5109            return Ok(Some(Distinct::Distinct));
5110        }
5111
5112        self.expect_token(&Token::LParen)?;
5113        let col_names = if self.consume_token(&Token::RParen) {
5114            self.prev_token();
5115            Vec::new()
5116        } else {
5117            self.parse_comma_separated(Parser::parse_expr)?
5118        };
5119        self.expect_token(&Token::RParen)?;
5120        Ok(Some(Distinct::On(col_names)))
5121    }
5122
5123    /// Parse a SQL CREATE statement
5124    pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
5125        let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
5126        let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
5127        let multiset = self.maybe_parse_multiset();
5128        let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5129        let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5130        let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5131        let global: Option<bool> = if global {
5132            Some(true)
5133        } else if local {
5134            Some(false)
5135        } else {
5136            None
5137        };
5138        let temporary = self
5139            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5140            .is_some();
5141        let volatile = self.parse_keyword(Keyword::VOLATILE);
5142        let persistent = dialect_of!(self is DuckDbDialect)
5143            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5144        let create_view_params = self.parse_create_view_params()?;
5145        if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5146            self.parse_create_snapshot_table().map(Into::into)
5147        } else if self.parse_keyword(Keyword::TABLE) {
5148            self.parse_create_table(or_replace, temporary, global, transient, volatile, multiset)
5149                .map(Into::into)
5150        } else if self.peek_keyword(Keyword::MATERIALIZED)
5151            || self.peek_keyword(Keyword::VIEW)
5152            || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5153            || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5154        {
5155            self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5156                .map(Into::into)
5157        } else if self.parse_keyword(Keyword::POLICY) {
5158            self.parse_create_policy().map(Into::into)
5159        } else if self.parse_keyword(Keyword::EXTERNAL) {
5160            self.parse_create_external_table(or_replace).map(Into::into)
5161        } else if self.parse_keyword(Keyword::FUNCTION) {
5162            self.parse_create_function(or_alter, or_replace, temporary)
5163        } else if self.parse_keyword(Keyword::DOMAIN) {
5164            self.parse_create_domain().map(Into::into)
5165        } else if self.parse_keyword(Keyword::TRIGGER) {
5166            self.parse_create_trigger(temporary, or_alter, or_replace, false)
5167                .map(Into::into)
5168        } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5169            self.parse_create_trigger(temporary, or_alter, or_replace, true)
5170                .map(Into::into)
5171        } else if self.parse_keyword(Keyword::MACRO) {
5172            self.parse_create_macro(or_replace, temporary)
5173        } else if self.parse_keyword(Keyword::SECRET) {
5174            self.parse_create_secret(or_replace, temporary, persistent)
5175        } else if self.parse_keyword(Keyword::USER) {
5176            self.parse_create_user(or_replace).map(Into::into)
5177        } else if or_replace {
5178            self.expected_ref(
5179                "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
5180                self.peek_token_ref(),
5181            )
5182        } else if self.parse_keyword(Keyword::EXTENSION) {
5183            self.parse_create_extension().map(Into::into)
5184        } else if self.parse_keyword(Keyword::INDEX) {
5185            self.parse_create_index(false).map(Into::into)
5186        } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5187            self.parse_create_index(true).map(Into::into)
5188        } else if self.parse_keyword(Keyword::VIRTUAL) {
5189            self.parse_create_virtual_table()
5190        } else if self.parse_keyword(Keyword::SCHEMA) {
5191            self.parse_create_schema()
5192        } else if self.parse_keyword(Keyword::DATABASE) {
5193            self.parse_create_database()
5194        } else if self.parse_keyword(Keyword::ROLE) {
5195            self.parse_create_role().map(Into::into)
5196        } else if self.parse_keyword(Keyword::SEQUENCE) {
5197            self.parse_create_sequence(temporary)
5198        } else if self.parse_keyword(Keyword::COLLATION) {
5199            self.parse_create_collation().map(Into::into)
5200        } else if self.parse_keyword(Keyword::TYPE) {
5201            self.parse_create_type()
5202        } else if self.parse_keyword(Keyword::PROCEDURE) {
5203            self.parse_create_procedure(or_alter)
5204        } else if self.parse_keyword(Keyword::CONNECTOR) {
5205            self.parse_create_connector().map(Into::into)
5206        } else if self.parse_keyword(Keyword::OPERATOR) {
5207            // Check if this is CREATE OPERATOR FAMILY or CREATE OPERATOR CLASS
5208            if self.parse_keyword(Keyword::FAMILY) {
5209                self.parse_create_operator_family().map(Into::into)
5210            } else if self.parse_keyword(Keyword::CLASS) {
5211                self.parse_create_operator_class().map(Into::into)
5212            } else {
5213                self.parse_create_operator().map(Into::into)
5214            }
5215        } else if self.parse_keyword(Keyword::SERVER) {
5216            self.parse_pg_create_server()
5217        } else {
5218            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5219        }
5220    }
5221
5222    fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5223        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5224        let name = self.parse_identifier()?;
5225        let options = self
5226            .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5227            .options;
5228        let with_tags = self.parse_keyword(Keyword::WITH);
5229        let tags = if self.parse_keyword(Keyword::TAG) {
5230            self.parse_key_value_options(true, &[])?.options
5231        } else {
5232            vec![]
5233        };
5234        Ok(CreateUser {
5235            or_replace,
5236            if_not_exists,
5237            name,
5238            options: KeyValueOptions {
5239                options,
5240                delimiter: KeyValueOptionsDelimiter::Space,
5241            },
5242            with_tags,
5243            tags: KeyValueOptions {
5244                options: tags,
5245                delimiter: KeyValueOptionsDelimiter::Comma,
5246            },
5247        })
5248    }
5249
5250    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
5251    pub fn parse_create_secret(
5252        &mut self,
5253        or_replace: bool,
5254        temporary: bool,
5255        persistent: bool,
5256    ) -> Result<Statement, ParserError> {
5257        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5258
5259        let mut storage_specifier = None;
5260        let mut name = None;
5261        if self.peek_token_ref().token != Token::LParen {
5262            if self.parse_keyword(Keyword::IN) {
5263                storage_specifier = self.parse_identifier().ok()
5264            } else {
5265                name = self.parse_identifier().ok();
5266            }
5267
5268            // Storage specifier may follow the name
5269            if storage_specifier.is_none()
5270                && self.peek_token_ref().token != Token::LParen
5271                && self.parse_keyword(Keyword::IN)
5272            {
5273                storage_specifier = self.parse_identifier().ok();
5274            }
5275        }
5276
5277        self.expect_token(&Token::LParen)?;
5278        self.expect_keyword_is(Keyword::TYPE)?;
5279        let secret_type = self.parse_identifier()?;
5280
5281        let mut options = Vec::new();
5282        if self.consume_token(&Token::Comma) {
5283            options.append(&mut self.parse_comma_separated(|p| {
5284                let key = p.parse_identifier()?;
5285                let value = p.parse_identifier()?;
5286                Ok(SecretOption { key, value })
5287            })?);
5288        }
5289        self.expect_token(&Token::RParen)?;
5290
5291        let temp = match (temporary, persistent) {
5292            (true, false) => Some(true),
5293            (false, true) => Some(false),
5294            (false, false) => None,
5295            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5296        };
5297
5298        Ok(Statement::CreateSecret {
5299            or_replace,
5300            temporary: temp,
5301            if_not_exists,
5302            name,
5303            storage_specifier,
5304            secret_type,
5305            options,
5306        })
5307    }
5308
5309    /// Parse a CACHE TABLE statement
5310    pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5311        let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5312        if self.parse_keyword(Keyword::TABLE) {
5313            let table_name = self.parse_object_name(false)?;
5314            if self.peek_token_ref().token != Token::EOF {
5315                if let Token::Word(word) = &self.peek_token_ref().token {
5316                    if word.keyword == Keyword::OPTIONS {
5317                        options = self.parse_options(Keyword::OPTIONS)?
5318                    }
5319                };
5320
5321                if self.peek_token_ref().token != Token::EOF {
5322                    let (a, q) = self.parse_as_query()?;
5323                    has_as = a;
5324                    query = Some(q);
5325                }
5326
5327                Ok(Statement::Cache {
5328                    table_flag,
5329                    table_name,
5330                    has_as,
5331                    options,
5332                    query,
5333                })
5334            } else {
5335                Ok(Statement::Cache {
5336                    table_flag,
5337                    table_name,
5338                    has_as,
5339                    options,
5340                    query,
5341                })
5342            }
5343        } else {
5344            table_flag = Some(self.parse_object_name(false)?);
5345            if self.parse_keyword(Keyword::TABLE) {
5346                let table_name = self.parse_object_name(false)?;
5347                if self.peek_token_ref().token != Token::EOF {
5348                    if let Token::Word(word) = &self.peek_token_ref().token {
5349                        if word.keyword == Keyword::OPTIONS {
5350                            options = self.parse_options(Keyword::OPTIONS)?
5351                        }
5352                    };
5353
5354                    if self.peek_token_ref().token != Token::EOF {
5355                        let (a, q) = self.parse_as_query()?;
5356                        has_as = a;
5357                        query = Some(q);
5358                    }
5359
5360                    Ok(Statement::Cache {
5361                        table_flag,
5362                        table_name,
5363                        has_as,
5364                        options,
5365                        query,
5366                    })
5367                } else {
5368                    Ok(Statement::Cache {
5369                        table_flag,
5370                        table_name,
5371                        has_as,
5372                        options,
5373                        query,
5374                    })
5375                }
5376            } else {
5377                if self.peek_token_ref().token == Token::EOF {
5378                    self.prev_token();
5379                }
5380                self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5381            }
5382        }
5383    }
5384
5385    /// Parse 'AS' before as query,such as `WITH XXX AS SELECT XXX` oer `CACHE TABLE AS SELECT XXX`
5386    pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5387        match &self.peek_token_ref().token {
5388            Token::Word(word) => match word.keyword {
5389                Keyword::AS => {
5390                    self.next_token();
5391                    Ok((true, self.parse_query()?))
5392                }
5393                _ => Ok((false, self.parse_query()?)),
5394            },
5395            _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5396        }
5397    }
5398
5399    /// Parse a UNCACHE TABLE statement
5400    pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5401        self.expect_keyword_is(Keyword::TABLE)?;
5402        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5403        let table_name = self.parse_object_name(false)?;
5404        Ok(Statement::UNCache {
5405            table_name,
5406            if_exists,
5407        })
5408    }
5409
5410    /// SQLite-specific `CREATE VIRTUAL TABLE`
5411    pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5412        self.expect_keyword_is(Keyword::TABLE)?;
5413        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5414        let table_name = self.parse_object_name(false)?;
5415        self.expect_keyword_is(Keyword::USING)?;
5416        let module_name = self.parse_identifier()?;
5417        // SQLite docs note that module "arguments syntax is sufficiently
5418        // general that the arguments can be made to appear as column
5419        // definitions in a traditional CREATE TABLE statement", but
5420        // we don't implement that.
5421        let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5422        Ok(Statement::CreateVirtualTable {
5423            name: table_name,
5424            if_not_exists,
5425            module_name,
5426            module_args,
5427        })
5428    }
5429
5430    /// Parse a `CREATE SCHEMA` statement.
5431    pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
5432        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5433
5434        let schema_name = self.parse_schema_name()?;
5435
5436        let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5437            Some(self.parse_expr()?)
5438        } else {
5439            None
5440        };
5441
5442        let with = if self.peek_keyword(Keyword::WITH) {
5443            Some(self.parse_options(Keyword::WITH)?)
5444        } else {
5445            None
5446        };
5447
5448        let options = if self.peek_keyword(Keyword::OPTIONS) {
5449            Some(self.parse_options(Keyword::OPTIONS)?)
5450        } else {
5451            None
5452        };
5453
5454        let clone = if self.parse_keyword(Keyword::CLONE) {
5455            Some(self.parse_object_name(false)?)
5456        } else {
5457            None
5458        };
5459
5460        Ok(Statement::CreateSchema {
5461            schema_name,
5462            if_not_exists,
5463            with,
5464            options,
5465            default_collate_spec,
5466            clone,
5467        })
5468    }
5469
5470    fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5471        if self.parse_keyword(Keyword::AUTHORIZATION) {
5472            Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5473        } else {
5474            let name = self.parse_object_name(false)?;
5475
5476            if self.parse_keyword(Keyword::AUTHORIZATION) {
5477                Ok(SchemaName::NamedAuthorization(
5478                    name,
5479                    self.parse_identifier()?,
5480                ))
5481            } else {
5482                Ok(SchemaName::Simple(name))
5483            }
5484        }
5485    }
5486
5487    /// Parse a `CREATE DATABASE` statement.
5488    pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5489        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5490        let db_name = self.parse_object_name(false)?;
5491        let mut location = None;
5492        let mut managed_location = None;
5493        loop {
5494            match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5495                Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5496                Some(Keyword::MANAGEDLOCATION) => {
5497                    managed_location = Some(self.parse_literal_string()?)
5498                }
5499                _ => break,
5500            }
5501        }
5502        let clone = if self.parse_keyword(Keyword::CLONE) {
5503            Some(self.parse_object_name(false)?)
5504        } else {
5505            None
5506        };
5507
5508        // Parse MySQL-style [DEFAULT] CHARACTER SET and [DEFAULT] COLLATE options
5509        //
5510        // Note: The docs only mention `CHARACTER SET`, but `CHARSET` is also supported.
5511        // Furthermore, MySQL will only accept one character set, raising an error if there is more
5512        // than one, but will accept multiple collations and use the last one.
5513        //
5514        // <https://dev.mysql.com/doc/refman/8.4/en/create-database.html>
5515        let mut default_charset = None;
5516        let mut default_collation = None;
5517        loop {
5518            let has_default = self.parse_keyword(Keyword::DEFAULT);
5519            if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5520                || self.parse_keyword(Keyword::CHARSET)
5521            {
5522                let _ = self.consume_token(&Token::Eq);
5523                default_charset = Some(self.parse_identifier()?.value);
5524            } else if self.parse_keyword(Keyword::COLLATE) {
5525                let _ = self.consume_token(&Token::Eq);
5526                default_collation = Some(self.parse_identifier()?.value);
5527            } else if has_default {
5528                // DEFAULT keyword not followed by CHARACTER SET, CHARSET, or COLLATE
5529                self.prev_token();
5530                break;
5531            } else {
5532                break;
5533            }
5534        }
5535
5536        Ok(Statement::CreateDatabase {
5537            db_name,
5538            if_not_exists: ine,
5539            location,
5540            managed_location,
5541            or_replace: false,
5542            transient: false,
5543            clone,
5544            data_retention_time_in_days: None,
5545            max_data_extension_time_in_days: None,
5546            external_volume: None,
5547            catalog: None,
5548            replace_invalid_characters: None,
5549            default_ddl_collation: None,
5550            storage_serialization_policy: None,
5551            comment: None,
5552            default_charset,
5553            default_collation,
5554            catalog_sync: None,
5555            catalog_sync_namespace_mode: None,
5556            catalog_sync_namespace_flatten_delimiter: None,
5557            with_tags: None,
5558            with_contacts: None,
5559        })
5560    }
5561
5562    /// Parse an optional `USING` clause for `CREATE FUNCTION`.
5563    pub fn parse_optional_create_function_using(
5564        &mut self,
5565    ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5566        if !self.parse_keyword(Keyword::USING) {
5567            return Ok(None);
5568        };
5569        let keyword =
5570            self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5571
5572        let uri = self.parse_literal_string()?;
5573
5574        match keyword {
5575            Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5576            Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5577            Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5578            _ => self.expected(
5579                "JAR, FILE or ARCHIVE, got {:?}",
5580                TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5581            ),
5582        }
5583    }
5584
5585    /// Parse a `CREATE FUNCTION` statement.
5586    pub fn parse_create_function(
5587        &mut self,
5588        or_alter: bool,
5589        or_replace: bool,
5590        temporary: bool,
5591    ) -> Result<Statement, ParserError> {
5592        if dialect_of!(self is HiveDialect) {
5593            self.parse_hive_create_function(or_replace, temporary)
5594                .map(Into::into)
5595        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5596            self.parse_postgres_create_function(or_replace, temporary)
5597                .map(Into::into)
5598        } else if dialect_of!(self is DuckDbDialect) {
5599            self.parse_create_macro(or_replace, temporary)
5600        } else if dialect_of!(self is BigQueryDialect) {
5601            self.parse_bigquery_create_function(or_replace, temporary)
5602                .map(Into::into)
5603        } else if dialect_of!(self is MsSqlDialect) {
5604            self.parse_mssql_create_function(or_alter, or_replace, temporary)
5605                .map(Into::into)
5606        } else {
5607            self.prev_token();
5608            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5609        }
5610    }
5611
5612    /// Parse `CREATE FUNCTION` for [PostgreSQL]
5613    ///
5614    /// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
5615    fn parse_postgres_create_function(
5616        &mut self,
5617        or_replace: bool,
5618        temporary: bool,
5619    ) -> Result<CreateFunction, ParserError> {
5620        let name = self.parse_object_name(false)?;
5621
5622        self.expect_token(&Token::LParen)?;
5623        let args = if Token::RParen != self.peek_token_ref().token {
5624            self.parse_comma_separated(Parser::parse_function_arg)?
5625        } else {
5626            vec![]
5627        };
5628        self.expect_token(&Token::RParen)?;
5629
5630        let return_type = if self.parse_keyword(Keyword::RETURNS) {
5631            Some(self.parse_function_return_type()?)
5632        } else {
5633            None
5634        };
5635
5636        #[derive(Default)]
5637        struct Body {
5638            language: Option<Ident>,
5639            behavior: Option<FunctionBehavior>,
5640            function_body: Option<CreateFunctionBody>,
5641            called_on_null: Option<FunctionCalledOnNull>,
5642            parallel: Option<FunctionParallel>,
5643            security: Option<FunctionSecurity>,
5644        }
5645        let mut body = Body::default();
5646        let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5647        loop {
5648            fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5649                if field.is_some() {
5650                    return Err(ParserError::ParserError(format!(
5651                        "{name} specified more than once",
5652                    )));
5653                }
5654                Ok(())
5655            }
5656            if self.parse_keyword(Keyword::AS) {
5657                ensure_not_set(&body.function_body, "AS")?;
5658                body.function_body = Some(self.parse_create_function_body_string()?);
5659            } else if self.parse_keyword(Keyword::LANGUAGE) {
5660                ensure_not_set(&body.language, "LANGUAGE")?;
5661                body.language = Some(self.parse_identifier()?);
5662            } else if self.parse_keyword(Keyword::IMMUTABLE) {
5663                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5664                body.behavior = Some(FunctionBehavior::Immutable);
5665            } else if self.parse_keyword(Keyword::STABLE) {
5666                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5667                body.behavior = Some(FunctionBehavior::Stable);
5668            } else if self.parse_keyword(Keyword::VOLATILE) {
5669                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5670                body.behavior = Some(FunctionBehavior::Volatile);
5671            } else if self.parse_keywords(&[
5672                Keyword::CALLED,
5673                Keyword::ON,
5674                Keyword::NULL,
5675                Keyword::INPUT,
5676            ]) {
5677                ensure_not_set(
5678                    &body.called_on_null,
5679                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5680                )?;
5681                body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5682            } else if self.parse_keywords(&[
5683                Keyword::RETURNS,
5684                Keyword::NULL,
5685                Keyword::ON,
5686                Keyword::NULL,
5687                Keyword::INPUT,
5688            ]) {
5689                ensure_not_set(
5690                    &body.called_on_null,
5691                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5692                )?;
5693                body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5694            } else if self.parse_keyword(Keyword::STRICT) {
5695                ensure_not_set(
5696                    &body.called_on_null,
5697                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5698                )?;
5699                body.called_on_null = Some(FunctionCalledOnNull::Strict);
5700            } else if self.parse_keyword(Keyword::PARALLEL) {
5701                ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5702                if self.parse_keyword(Keyword::UNSAFE) {
5703                    body.parallel = Some(FunctionParallel::Unsafe);
5704                } else if self.parse_keyword(Keyword::RESTRICTED) {
5705                    body.parallel = Some(FunctionParallel::Restricted);
5706                } else if self.parse_keyword(Keyword::SAFE) {
5707                    body.parallel = Some(FunctionParallel::Safe);
5708                } else {
5709                    return self
5710                        .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5711                }
5712            } else if self.parse_keyword(Keyword::SECURITY) {
5713                ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5714                if self.parse_keyword(Keyword::DEFINER) {
5715                    body.security = Some(FunctionSecurity::Definer);
5716                } else if self.parse_keyword(Keyword::INVOKER) {
5717                    body.security = Some(FunctionSecurity::Invoker);
5718                } else {
5719                    return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5720                }
5721            } else if self.parse_keyword(Keyword::SET) {
5722                let name = self.parse_object_name(false)?;
5723                let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5724                    FunctionSetValue::FromCurrent
5725                } else {
5726                    if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5727                        return self.expected_ref("= or TO", self.peek_token_ref());
5728                    }
5729                    if self.parse_keyword(Keyword::DEFAULT) {
5730                        FunctionSetValue::Default
5731                    } else {
5732                        let values = self.parse_comma_separated(Parser::parse_expr)?;
5733                        FunctionSetValue::Values(values)
5734                    }
5735                };
5736                set_params.push(FunctionDefinitionSetParam { name, value });
5737            } else if self.parse_keyword(Keyword::RETURN) {
5738                ensure_not_set(&body.function_body, "RETURN")?;
5739                body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5740            } else {
5741                break;
5742            }
5743        }
5744
5745        Ok(CreateFunction {
5746            or_alter: false,
5747            or_replace,
5748            temporary,
5749            name,
5750            args: Some(args),
5751            return_type,
5752            behavior: body.behavior,
5753            called_on_null: body.called_on_null,
5754            parallel: body.parallel,
5755            security: body.security,
5756            set_params,
5757            language: body.language,
5758            function_body: body.function_body,
5759            if_not_exists: false,
5760            using: None,
5761            determinism_specifier: None,
5762            options: None,
5763            remote_connection: None,
5764        })
5765    }
5766
5767    /// Parse `CREATE FUNCTION` for [Hive]
5768    ///
5769    /// [Hive]: https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#LanguageManualDDL-Create/Drop/ReloadFunction
5770    fn parse_hive_create_function(
5771        &mut self,
5772        or_replace: bool,
5773        temporary: bool,
5774    ) -> Result<CreateFunction, ParserError> {
5775        let name = self.parse_object_name(false)?;
5776        self.expect_keyword_is(Keyword::AS)?;
5777
5778        let body = self.parse_create_function_body_string()?;
5779        let using = self.parse_optional_create_function_using()?;
5780
5781        Ok(CreateFunction {
5782            or_alter: false,
5783            or_replace,
5784            temporary,
5785            name,
5786            function_body: Some(body),
5787            using,
5788            if_not_exists: false,
5789            args: None,
5790            return_type: None,
5791            behavior: None,
5792            called_on_null: None,
5793            parallel: None,
5794            security: None,
5795            set_params: vec![],
5796            language: None,
5797            determinism_specifier: None,
5798            options: None,
5799            remote_connection: None,
5800        })
5801    }
5802
5803    /// Parse `CREATE FUNCTION` for [BigQuery]
5804    ///
5805    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement
5806    fn parse_bigquery_create_function(
5807        &mut self,
5808        or_replace: bool,
5809        temporary: bool,
5810    ) -> Result<CreateFunction, ParserError> {
5811        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5812        let (name, args) = self.parse_create_function_name_and_params()?;
5813
5814        let return_type = if self.parse_keyword(Keyword::RETURNS) {
5815            Some(self.parse_function_return_type()?)
5816        } else {
5817            None
5818        };
5819
5820        let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
5821            Some(FunctionDeterminismSpecifier::Deterministic)
5822        } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
5823            Some(FunctionDeterminismSpecifier::NotDeterministic)
5824        } else {
5825            None
5826        };
5827
5828        let language = if self.parse_keyword(Keyword::LANGUAGE) {
5829            Some(self.parse_identifier()?)
5830        } else {
5831            None
5832        };
5833
5834        let remote_connection =
5835            if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
5836                Some(self.parse_object_name(false)?)
5837            } else {
5838                None
5839            };
5840
5841        // `OPTIONS` may come before of after the function body but
5842        // may be specified at most once.
5843        let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
5844
5845        let function_body = if remote_connection.is_none() {
5846            self.expect_keyword_is(Keyword::AS)?;
5847            let expr = self.parse_expr()?;
5848            if options.is_none() {
5849                options = self.maybe_parse_options(Keyword::OPTIONS)?;
5850                Some(CreateFunctionBody::AsBeforeOptions {
5851                    body: expr,
5852                    link_symbol: None,
5853                })
5854            } else {
5855                Some(CreateFunctionBody::AsAfterOptions(expr))
5856            }
5857        } else {
5858            None
5859        };
5860
5861        Ok(CreateFunction {
5862            or_alter: false,
5863            or_replace,
5864            temporary,
5865            if_not_exists,
5866            name,
5867            args: Some(args),
5868            return_type,
5869            function_body,
5870            language,
5871            determinism_specifier,
5872            options,
5873            remote_connection,
5874            using: None,
5875            behavior: None,
5876            called_on_null: None,
5877            parallel: None,
5878            security: None,
5879            set_params: vec![],
5880        })
5881    }
5882
5883    /// Parse `CREATE FUNCTION` for [MsSql]
5884    ///
5885    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
5886    fn parse_mssql_create_function(
5887        &mut self,
5888        or_alter: bool,
5889        or_replace: bool,
5890        temporary: bool,
5891    ) -> Result<CreateFunction, ParserError> {
5892        let (name, args) = self.parse_create_function_name_and_params()?;
5893
5894        self.expect_keyword(Keyword::RETURNS)?;
5895
5896        let return_table = self.maybe_parse(|p| {
5897            let return_table_name = p.parse_identifier()?;
5898
5899            p.expect_keyword_is(Keyword::TABLE)?;
5900            p.prev_token();
5901
5902            let table_column_defs = match p.parse_data_type()? {
5903                DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
5904                    table_column_defs
5905                }
5906                _ => parser_err!(
5907                    "Expected table column definitions after TABLE keyword",
5908                    p.peek_token_ref().span.start
5909                )?,
5910            };
5911
5912            Ok(DataType::NamedTable {
5913                name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5914                columns: table_column_defs,
5915            })
5916        })?;
5917
5918        let data_type = match return_table {
5919            Some(table_type) => table_type,
5920            None => self.parse_data_type()?,
5921        };
5922        let return_type = Some(FunctionReturnType::DataType(data_type));
5923
5924        let _ = self.parse_keyword(Keyword::AS);
5925
5926        let function_body = if self.peek_keyword(Keyword::BEGIN) {
5927            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5928            let statements = self.parse_statement_list(&[Keyword::END])?;
5929            let end_token = self.expect_keyword(Keyword::END)?;
5930
5931            Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
5932                begin_token: AttachedToken(begin_token),
5933                statements,
5934                end_token: AttachedToken(end_token),
5935            }))
5936        } else if self.parse_keyword(Keyword::RETURN) {
5937            if self.peek_token_ref().token == Token::LParen {
5938                Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
5939            } else if self.peek_keyword(Keyword::SELECT) {
5940                let select = self.parse_select()?;
5941                Some(CreateFunctionBody::AsReturnSelect(select))
5942            } else {
5943                parser_err!(
5944                    "Expected a subquery (or bare SELECT statement) after RETURN",
5945                    self.peek_token_ref().span.start
5946                )?
5947            }
5948        } else {
5949            parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
5950        };
5951
5952        Ok(CreateFunction {
5953            or_alter,
5954            or_replace,
5955            temporary,
5956            if_not_exists: false,
5957            name,
5958            args: Some(args),
5959            return_type,
5960            function_body,
5961            language: None,
5962            determinism_specifier: None,
5963            options: None,
5964            remote_connection: None,
5965            using: None,
5966            behavior: None,
5967            called_on_null: None,
5968            parallel: None,
5969            security: None,
5970            set_params: vec![],
5971        })
5972    }
5973
5974    fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
5975        if self.parse_keyword(Keyword::SETOF) {
5976            Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
5977        } else {
5978            Ok(FunctionReturnType::DataType(self.parse_data_type()?))
5979        }
5980    }
5981
5982    fn parse_create_function_name_and_params(
5983        &mut self,
5984    ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
5985        let name = self.parse_object_name(false)?;
5986        let parse_function_param =
5987            |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
5988                let name = parser.parse_identifier()?;
5989                let data_type = parser.parse_data_type()?;
5990                let default_expr = if parser.consume_token(&Token::Eq) {
5991                    Some(parser.parse_expr()?)
5992                } else {
5993                    None
5994                };
5995
5996                Ok(OperateFunctionArg {
5997                    mode: None,
5998                    name: Some(name),
5999                    data_type,
6000                    default_expr,
6001                })
6002            };
6003        self.expect_token(&Token::LParen)?;
6004        let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6005        self.expect_token(&Token::RParen)?;
6006        Ok((name, args))
6007    }
6008
6009    fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6010        let mode = if self.parse_keyword(Keyword::IN) {
6011            Some(ArgMode::In)
6012        } else if self.parse_keyword(Keyword::OUT) {
6013            Some(ArgMode::Out)
6014        } else if self.parse_keyword(Keyword::INOUT) {
6015            Some(ArgMode::InOut)
6016        } else if self.parse_keyword(Keyword::VARIADIC) {
6017            Some(ArgMode::Variadic)
6018        } else {
6019            None
6020        };
6021
6022        // parse: [ argname ] argtype
6023        let mut name = None;
6024        let mut data_type = self.parse_data_type()?;
6025
6026        // To check whether the first token is a name or a type, we need to
6027        // peek the next token, which if it is another type keyword, then the
6028        // first token is a name and not a type in itself.
6029        let data_type_idx = self.get_current_index();
6030
6031        // DEFAULT will be parsed as `DataType::Custom`, which is undesirable in this context
6032        fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6033            if parser.peek_keyword(Keyword::DEFAULT) {
6034                // This dummy error is ignored in `maybe_parse`
6035                parser_err!(
6036                    "The DEFAULT keyword is not a type",
6037                    parser.peek_token_ref().span.start
6038                )
6039            } else {
6040                parser.parse_data_type()
6041            }
6042        }
6043
6044        if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6045            let token = self.token_at(data_type_idx);
6046
6047            // We ensure that the token is a `Word` token, and not other special tokens.
6048            if !matches!(token.token, Token::Word(_)) {
6049                return self.expected("a name or type", token.clone());
6050            }
6051
6052            name = Some(Ident::new(token.to_string()));
6053            data_type = next_data_type;
6054        }
6055
6056        let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6057        {
6058            Some(self.parse_expr()?)
6059        } else {
6060            None
6061        };
6062        Ok(OperateFunctionArg {
6063            mode,
6064            name,
6065            data_type,
6066            default_expr,
6067        })
6068    }
6069
6070    fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6071        let mode = if self.parse_keyword(Keyword::IN) {
6072            Some(ArgMode::In)
6073        } else {
6074            if self
6075                .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6076                .is_some()
6077            {
6078                return self.expected_ref(
6079                    "IN or argument type in aggregate signature",
6080                    self.peek_token_ref(),
6081                );
6082            }
6083            None
6084        };
6085
6086        // Parse: [ argname ] argtype, but do not consume ORDER from
6087        // `... argtype ORDER BY ...` as a type-name disambiguator.
6088        let mut name = None;
6089        let mut data_type = self.parse_data_type()?;
6090        let data_type_idx = self.get_current_index();
6091
6092        fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6093            if parser.peek_keyword(Keyword::DEFAULT)
6094                || parser.peek_keyword(Keyword::ORDER)
6095                || parser.peek_token_ref().token == Token::Comma
6096                || parser.peek_token_ref().token == Token::RParen
6097            {
6098                // Dummy error ignored by maybe_parse
6099                parser_err!(
6100                    "The current token cannot start an aggregate argument type",
6101                    parser.peek_token_ref().span.start
6102                )
6103            } else {
6104                parser.parse_data_type()
6105            }
6106        }
6107
6108        if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6109            let token = self.token_at(data_type_idx);
6110            if !matches!(token.token, Token::Word(_)) {
6111                return self.expected("a name or type", token.clone());
6112            }
6113
6114            name = Some(Ident::new(token.to_string()));
6115            data_type = next_data_type;
6116        }
6117
6118        if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6119            return self.expected_ref(
6120                "',' or ')' or ORDER BY after aggregate argument type",
6121                self.peek_token_ref(),
6122            );
6123        }
6124
6125        Ok(OperateFunctionArg {
6126            mode,
6127            name,
6128            data_type,
6129            default_expr: None,
6130        })
6131    }
6132
6133    /// Parse statements of the DropTrigger type such as:
6134    ///
6135    /// ```sql
6136    /// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
6137    /// ```
6138    pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6139        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6140        {
6141            self.prev_token();
6142            return self.expected_ref("an object type after DROP", self.peek_token_ref());
6143        }
6144        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6145        let trigger_name = self.parse_object_name(false)?;
6146        let table_name = if self.parse_keyword(Keyword::ON) {
6147            Some(self.parse_object_name(false)?)
6148        } else {
6149            None
6150        };
6151        let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6152            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6153            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6154            Some(unexpected_keyword) => return Err(ParserError::ParserError(
6155                format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6156            )),
6157            None => None,
6158        };
6159        Ok(DropTrigger {
6160            if_exists,
6161            trigger_name,
6162            table_name,
6163            option,
6164        })
6165    }
6166
6167    /// Parse a `CREATE TRIGGER` statement.
6168    pub fn parse_create_trigger(
6169        &mut self,
6170        temporary: bool,
6171        or_alter: bool,
6172        or_replace: bool,
6173        is_constraint: bool,
6174    ) -> Result<CreateTrigger, ParserError> {
6175        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6176        {
6177            self.prev_token();
6178            return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6179        }
6180
6181        let name = self.parse_object_name(false)?;
6182        let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6183
6184        let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6185        self.expect_keyword_is(Keyword::ON)?;
6186        let table_name = self.parse_object_name(false)?;
6187
6188        let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6189            self.parse_object_name(true).ok()
6190        } else {
6191            None
6192        };
6193
6194        let characteristics = self.parse_constraint_characteristics()?;
6195
6196        let mut referencing = vec![];
6197        if self.parse_keyword(Keyword::REFERENCING) {
6198            while let Some(refer) = self.parse_trigger_referencing()? {
6199                referencing.push(refer);
6200            }
6201        }
6202
6203        let trigger_object = if self.parse_keyword(Keyword::FOR) {
6204            let include_each = self.parse_keyword(Keyword::EACH);
6205            let trigger_object =
6206                match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6207                    Keyword::ROW => TriggerObject::Row,
6208                    Keyword::STATEMENT => TriggerObject::Statement,
6209                    unexpected_keyword => return Err(ParserError::ParserError(
6210                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6211                    )),
6212                };
6213
6214            Some(if include_each {
6215                TriggerObjectKind::ForEach(trigger_object)
6216            } else {
6217                TriggerObjectKind::For(trigger_object)
6218            })
6219        } else {
6220            let _ = self.parse_keyword(Keyword::FOR);
6221
6222            None
6223        };
6224
6225        let condition = self
6226            .parse_keyword(Keyword::WHEN)
6227            .then(|| self.parse_expr())
6228            .transpose()?;
6229
6230        let mut exec_body = None;
6231        let mut statements = None;
6232        if self.parse_keyword(Keyword::EXECUTE) {
6233            exec_body = Some(self.parse_trigger_exec_body()?);
6234        } else {
6235            statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6236        }
6237
6238        Ok(CreateTrigger {
6239            or_alter,
6240            temporary,
6241            or_replace,
6242            is_constraint,
6243            name,
6244            period,
6245            period_before_table: true,
6246            events,
6247            table_name,
6248            referenced_table_name,
6249            referencing,
6250            trigger_object,
6251            condition,
6252            exec_body,
6253            statements_as: false,
6254            statements,
6255            characteristics,
6256        })
6257    }
6258
6259    /// Parse the period part of a trigger (`BEFORE`, `AFTER`, etc.).
6260    pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6261        Ok(
6262            match self.expect_one_of_keywords(&[
6263                Keyword::FOR,
6264                Keyword::BEFORE,
6265                Keyword::AFTER,
6266                Keyword::INSTEAD,
6267            ])? {
6268                Keyword::FOR => TriggerPeriod::For,
6269                Keyword::BEFORE => TriggerPeriod::Before,
6270                Keyword::AFTER => TriggerPeriod::After,
6271                Keyword::INSTEAD => self
6272                    .expect_keyword_is(Keyword::OF)
6273                    .map(|_| TriggerPeriod::InsteadOf)?,
6274                unexpected_keyword => return Err(ParserError::ParserError(
6275                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6276                )),
6277            },
6278        )
6279    }
6280
6281    /// Parse the event part of a trigger (`INSERT`, `UPDATE`, etc.).
6282    pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6283        Ok(
6284            match self.expect_one_of_keywords(&[
6285                Keyword::INSERT,
6286                Keyword::UPDATE,
6287                Keyword::DELETE,
6288                Keyword::TRUNCATE,
6289            ])? {
6290                Keyword::INSERT => TriggerEvent::Insert,
6291                Keyword::UPDATE => {
6292                    if self.parse_keyword(Keyword::OF) {
6293                        let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6294                        TriggerEvent::Update(cols)
6295                    } else {
6296                        TriggerEvent::Update(vec![])
6297                    }
6298                }
6299                Keyword::DELETE => TriggerEvent::Delete,
6300                Keyword::TRUNCATE => TriggerEvent::Truncate,
6301                unexpected_keyword => return Err(ParserError::ParserError(
6302                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6303                )),
6304            },
6305        )
6306    }
6307
6308    /// Parse the `REFERENCING` clause of a trigger.
6309    pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6310        let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6311            Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6312                TriggerReferencingType::OldTable
6313            }
6314            Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6315                TriggerReferencingType::NewTable
6316            }
6317            _ => {
6318                return Ok(None);
6319            }
6320        };
6321
6322        let is_as = self.parse_keyword(Keyword::AS);
6323        let transition_relation_name = self.parse_object_name(false)?;
6324        Ok(Some(TriggerReferencing {
6325            refer_type,
6326            is_as,
6327            transition_relation_name,
6328        }))
6329    }
6330
6331    /// Parse the execution body of a trigger (`FUNCTION` or `PROCEDURE`).
6332    pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6333        Ok(TriggerExecBody {
6334            exec_type: match self
6335                .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6336            {
6337                Keyword::FUNCTION => TriggerExecBodyType::Function,
6338                Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6339                unexpected_keyword => return Err(ParserError::ParserError(
6340                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"),
6341                )),
6342            },
6343            func_desc: self.parse_function_desc()?,
6344        })
6345    }
6346
6347    /// Parse a `CREATE MACRO` statement.
6348    pub fn parse_create_macro(
6349        &mut self,
6350        or_replace: bool,
6351        temporary: bool,
6352    ) -> Result<Statement, ParserError> {
6353        if dialect_of!(self is DuckDbDialect |  GenericDialect) {
6354            let name = self.parse_object_name(false)?;
6355            self.expect_token(&Token::LParen)?;
6356            let args = if self.consume_token(&Token::RParen) {
6357                self.prev_token();
6358                None
6359            } else {
6360                Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6361            };
6362
6363            self.expect_token(&Token::RParen)?;
6364            self.expect_keyword_is(Keyword::AS)?;
6365
6366            Ok(Statement::CreateMacro {
6367                or_replace,
6368                temporary,
6369                name,
6370                args,
6371                definition: if self.parse_keyword(Keyword::TABLE) {
6372                    MacroDefinition::Table(self.parse_query()?)
6373                } else {
6374                    MacroDefinition::Expr(self.parse_expr()?)
6375                },
6376            })
6377        } else {
6378            self.prev_token();
6379            self.expected_ref("an object type after CREATE", self.peek_token_ref())
6380        }
6381    }
6382
6383    fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6384        let name = self.parse_identifier()?;
6385
6386        let default_expr =
6387            if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6388                Some(self.parse_expr()?)
6389            } else {
6390                None
6391            };
6392        Ok(MacroArg { name, default_expr })
6393    }
6394
6395    /// Parse a `CREATE EXTERNAL TABLE` statement.
6396    pub fn parse_create_external_table(
6397        &mut self,
6398        or_replace: bool,
6399    ) -> Result<CreateTable, ParserError> {
6400        self.expect_keyword_is(Keyword::TABLE)?;
6401        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6402        let table_name = self.parse_object_name(false)?;
6403        let (columns, constraints) = self.parse_columns()?;
6404
6405        let hive_distribution = self.parse_hive_distribution()?;
6406        let hive_formats = self.parse_hive_formats()?;
6407
6408        let file_format = if let Some(ref hf) = hive_formats {
6409            if let Some(ref ff) = hf.storage {
6410                match ff {
6411                    HiveIOFormat::FileFormat { format } => Some(*format),
6412                    _ => None,
6413                }
6414            } else {
6415                None
6416            }
6417        } else {
6418            None
6419        };
6420        let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6421
6422        let with_connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
6423            Some(self.parse_object_name(false)?)
6424        } else {
6425            None
6426        };
6427        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6428        let table_options = if !table_properties.is_empty() {
6429            CreateTableOptions::TableProperties(table_properties)
6430        } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6431            CreateTableOptions::Options(options)
6432        } else {
6433            CreateTableOptions::None
6434        };
6435        Ok(CreateTableBuilder::new(table_name)
6436            .columns(columns)
6437            .constraints(constraints)
6438            .hive_distribution(hive_distribution)
6439            .hive_formats(hive_formats)
6440            .table_options(table_options)
6441            .with_connection(with_connection)
6442            .or_replace(or_replace)
6443            .if_not_exists(if_not_exists)
6444            .external(true)
6445            .file_format(file_format)
6446            .location(location)
6447            .build())
6448    }
6449
6450    /// Parse `CREATE SNAPSHOT TABLE` statement.
6451    ///
6452    /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_snapshot_table_statement>
6453    pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6454        self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6455        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6456        let table_name = self.parse_object_name(true)?;
6457
6458        self.expect_keyword_is(Keyword::CLONE)?;
6459        let clone = Some(self.parse_object_name(true)?);
6460
6461        let version =
6462            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6463            {
6464                Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6465            } else {
6466                None
6467            };
6468
6469        let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6470            CreateTableOptions::Options(options)
6471        } else {
6472            CreateTableOptions::None
6473        };
6474
6475        Ok(CreateTableBuilder::new(table_name)
6476            .snapshot(true)
6477            .if_not_exists(if_not_exists)
6478            .clone_clause(clone)
6479            .version(version)
6480            .table_options(table_options)
6481            .build())
6482    }
6483
6484    /// Parse a file format for external tables.
6485    pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6486        let next_token = self.next_token();
6487        match &next_token.token {
6488            Token::Word(w) => match w.keyword {
6489                Keyword::AVRO => Ok(FileFormat::AVRO),
6490                Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6491                Keyword::ORC => Ok(FileFormat::ORC),
6492                Keyword::PARQUET => Ok(FileFormat::PARQUET),
6493                Keyword::RCFILE => Ok(FileFormat::RCFILE),
6494                Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6495                Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6496                _ => self.expected("fileformat", next_token),
6497            },
6498            _ => self.expected("fileformat", next_token),
6499        }
6500    }
6501
6502    fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6503        if self.consume_token(&Token::Eq) {
6504            Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6505        } else {
6506            Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6507        }
6508    }
6509
6510    /// Parse an `ANALYZE FORMAT`.
6511    pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6512        let next_token = self.next_token();
6513        match &next_token.token {
6514            Token::Word(w) => match w.keyword {
6515                Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6516                Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6517                Keyword::JSON => Ok(AnalyzeFormat::JSON),
6518                Keyword::TREE => Ok(AnalyzeFormat::TREE),
6519                _ => self.expected("fileformat", next_token),
6520            },
6521            _ => self.expected("fileformat", next_token),
6522        }
6523    }
6524
6525    /// Parse a `CREATE VIEW` statement.
6526    pub fn parse_create_view(
6527        &mut self,
6528        or_alter: bool,
6529        or_replace: bool,
6530        temporary: bool,
6531        create_view_params: Option<CreateViewParams>,
6532    ) -> Result<CreateView, ParserError> {
6533        let secure = self.parse_keyword(Keyword::SECURE);
6534        let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6535        self.expect_keyword_is(Keyword::VIEW)?;
6536        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6537        // Tries to parse IF NOT EXISTS either before name or after name
6538        // Name before IF NOT EXISTS is supported by snowflake but undocumented
6539        let if_not_exists_first =
6540            self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6541        let name = self.parse_object_name(allow_unquoted_hyphen)?;
6542        let name_before_not_exists = !if_not_exists_first
6543            && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6544        let if_not_exists = if_not_exists_first || name_before_not_exists;
6545        let mut copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6546        // Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
6547        // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
6548        let columns = self.parse_view_columns()?;
6549        // Snowflake also documents `COPY GRANTS` *after* the column list; accept
6550        // either position, but not both.
6551        // <https://docs.snowflake.com/en/sql-reference/sql/create-view#syntax>
6552        if !copy_grants {
6553            copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6554        }
6555        let mut options = CreateTableOptions::None;
6556        let with_options = self.parse_options(Keyword::WITH)?;
6557        if !with_options.is_empty() {
6558            options = CreateTableOptions::With(with_options);
6559        }
6560
6561        let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6562            self.expect_keyword_is(Keyword::BY)?;
6563            self.parse_parenthesized_column_list(Optional, false)?
6564        } else {
6565            vec![]
6566        };
6567
6568        if dialect_of!(self is BigQueryDialect | GenericDialect) {
6569            if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6570                if !opts.is_empty() {
6571                    options = CreateTableOptions::Options(opts);
6572                }
6573            };
6574        }
6575
6576        let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6577            && self.parse_keyword(Keyword::TO)
6578        {
6579            Some(self.parse_object_name(false)?)
6580        } else {
6581            None
6582        };
6583
6584        let comment = if self.dialect.supports_create_view_comment_syntax()
6585            && self.parse_keyword(Keyword::COMMENT)
6586        {
6587            self.expect_token(&Token::Eq)?;
6588            Some(self.parse_comment_value()?)
6589        } else {
6590            None
6591        };
6592
6593        self.expect_keyword_is(Keyword::AS)?;
6594        let query = self.parse_query()?;
6595        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
6596
6597        let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6598            && self.parse_keywords(&[
6599                Keyword::WITH,
6600                Keyword::NO,
6601                Keyword::SCHEMA,
6602                Keyword::BINDING,
6603            ]);
6604
6605        Ok(CreateView {
6606            or_alter,
6607            name,
6608            columns,
6609            query,
6610            materialized,
6611            secure,
6612            or_replace,
6613            options,
6614            cluster_by,
6615            comment,
6616            with_no_schema_binding,
6617            if_not_exists,
6618            temporary,
6619            copy_grants,
6620            to,
6621            params: create_view_params,
6622            name_before_not_exists,
6623        })
6624    }
6625
6626    /// Parse optional parameters for the `CREATE VIEW` statement supported by [MySQL].
6627    ///
6628    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/create-view.html
6629    fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6630        let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6631            self.expect_token(&Token::Eq)?;
6632            Some(
6633                match self.expect_one_of_keywords(&[
6634                    Keyword::UNDEFINED,
6635                    Keyword::MERGE,
6636                    Keyword::TEMPTABLE,
6637                ])? {
6638                    Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6639                    Keyword::MERGE => CreateViewAlgorithm::Merge,
6640                    Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6641                    _ => {
6642                        self.prev_token();
6643                        let found = self.next_token();
6644                        return self
6645                            .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6646                    }
6647                },
6648            )
6649        } else {
6650            None
6651        };
6652        let definer = if self.parse_keyword(Keyword::DEFINER) {
6653            self.expect_token(&Token::Eq)?;
6654            Some(self.parse_grantee_name()?)
6655        } else {
6656            None
6657        };
6658        let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6659            Some(
6660                match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6661                    Keyword::DEFINER => CreateViewSecurity::Definer,
6662                    Keyword::INVOKER => CreateViewSecurity::Invoker,
6663                    _ => {
6664                        self.prev_token();
6665                        let found = self.next_token();
6666                        return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6667                    }
6668                },
6669            )
6670        } else {
6671            None
6672        };
6673        if algorithm.is_some() || definer.is_some() || security.is_some() {
6674            Ok(Some(CreateViewParams {
6675                algorithm,
6676                definer,
6677                security,
6678            }))
6679        } else {
6680            Ok(None)
6681        }
6682    }
6683
6684    /// Parse a `CREATE ROLE` statement.
6685    pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6686        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6687        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6688
6689        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
6690
6691        let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6692            vec![Keyword::AUTHORIZATION]
6693        } else if dialect_of!(self is PostgreSqlDialect) {
6694            vec![
6695                Keyword::LOGIN,
6696                Keyword::NOLOGIN,
6697                Keyword::INHERIT,
6698                Keyword::NOINHERIT,
6699                Keyword::BYPASSRLS,
6700                Keyword::NOBYPASSRLS,
6701                Keyword::PASSWORD,
6702                Keyword::CREATEDB,
6703                Keyword::NOCREATEDB,
6704                Keyword::CREATEROLE,
6705                Keyword::NOCREATEROLE,
6706                Keyword::SUPERUSER,
6707                Keyword::NOSUPERUSER,
6708                Keyword::REPLICATION,
6709                Keyword::NOREPLICATION,
6710                Keyword::CONNECTION,
6711                Keyword::VALID,
6712                Keyword::IN,
6713                Keyword::ROLE,
6714                Keyword::ADMIN,
6715                Keyword::USER,
6716            ]
6717        } else {
6718            vec![]
6719        };
6720
6721        // MSSQL
6722        let mut authorization_owner = None;
6723        // Postgres
6724        let mut login = None;
6725        let mut inherit = None;
6726        let mut bypassrls = None;
6727        let mut password = None;
6728        let mut create_db = None;
6729        let mut create_role = None;
6730        let mut superuser = None;
6731        let mut replication = None;
6732        let mut connection_limit = None;
6733        let mut valid_until = None;
6734        let mut in_role = vec![];
6735        let mut in_group = vec![];
6736        let mut role = vec![];
6737        let mut user = vec![];
6738        let mut admin = vec![];
6739
6740        while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6741            let loc = self
6742                .tokens
6743                .get(self.index - 1)
6744                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6745            match keyword {
6746                Keyword::AUTHORIZATION => {
6747                    if authorization_owner.is_some() {
6748                        parser_err!("Found multiple AUTHORIZATION", loc)
6749                    } else {
6750                        authorization_owner = Some(self.parse_object_name(false)?);
6751                        Ok(())
6752                    }
6753                }
6754                Keyword::LOGIN | Keyword::NOLOGIN => {
6755                    if login.is_some() {
6756                        parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6757                    } else {
6758                        login = Some(keyword == Keyword::LOGIN);
6759                        Ok(())
6760                    }
6761                }
6762                Keyword::INHERIT | Keyword::NOINHERIT => {
6763                    if inherit.is_some() {
6764                        parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6765                    } else {
6766                        inherit = Some(keyword == Keyword::INHERIT);
6767                        Ok(())
6768                    }
6769                }
6770                Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6771                    if bypassrls.is_some() {
6772                        parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6773                    } else {
6774                        bypassrls = Some(keyword == Keyword::BYPASSRLS);
6775                        Ok(())
6776                    }
6777                }
6778                Keyword::CREATEDB | Keyword::NOCREATEDB => {
6779                    if create_db.is_some() {
6780                        parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6781                    } else {
6782                        create_db = Some(keyword == Keyword::CREATEDB);
6783                        Ok(())
6784                    }
6785                }
6786                Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
6787                    if create_role.is_some() {
6788                        parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
6789                    } else {
6790                        create_role = Some(keyword == Keyword::CREATEROLE);
6791                        Ok(())
6792                    }
6793                }
6794                Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
6795                    if superuser.is_some() {
6796                        parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
6797                    } else {
6798                        superuser = Some(keyword == Keyword::SUPERUSER);
6799                        Ok(())
6800                    }
6801                }
6802                Keyword::REPLICATION | Keyword::NOREPLICATION => {
6803                    if replication.is_some() {
6804                        parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
6805                    } else {
6806                        replication = Some(keyword == Keyword::REPLICATION);
6807                        Ok(())
6808                    }
6809                }
6810                Keyword::PASSWORD => {
6811                    if password.is_some() {
6812                        parser_err!("Found multiple PASSWORD", loc)
6813                    } else {
6814                        password = if self.parse_keyword(Keyword::NULL) {
6815                            Some(Password::NullPassword)
6816                        } else {
6817                            Some(Password::Password(Expr::Value(self.parse_value()?)))
6818                        };
6819                        Ok(())
6820                    }
6821                }
6822                Keyword::CONNECTION => {
6823                    self.expect_keyword_is(Keyword::LIMIT)?;
6824                    if connection_limit.is_some() {
6825                        parser_err!("Found multiple CONNECTION LIMIT", loc)
6826                    } else {
6827                        connection_limit = Some(Expr::Value(self.parse_number_value()?));
6828                        Ok(())
6829                    }
6830                }
6831                Keyword::VALID => {
6832                    self.expect_keyword_is(Keyword::UNTIL)?;
6833                    if valid_until.is_some() {
6834                        parser_err!("Found multiple VALID UNTIL", loc)
6835                    } else {
6836                        valid_until = Some(Expr::Value(self.parse_value()?));
6837                        Ok(())
6838                    }
6839                }
6840                Keyword::IN => {
6841                    if self.parse_keyword(Keyword::ROLE) {
6842                        if !in_role.is_empty() {
6843                            parser_err!("Found multiple IN ROLE", loc)
6844                        } else {
6845                            in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
6846                            Ok(())
6847                        }
6848                    } else if self.parse_keyword(Keyword::GROUP) {
6849                        if !in_group.is_empty() {
6850                            parser_err!("Found multiple IN GROUP", loc)
6851                        } else {
6852                            in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
6853                            Ok(())
6854                        }
6855                    } else {
6856                        self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
6857                    }
6858                }
6859                Keyword::ROLE => {
6860                    if !role.is_empty() {
6861                        parser_err!("Found multiple ROLE", loc)
6862                    } else {
6863                        role = self.parse_comma_separated(|p| p.parse_identifier())?;
6864                        Ok(())
6865                    }
6866                }
6867                Keyword::USER => {
6868                    if !user.is_empty() {
6869                        parser_err!("Found multiple USER", loc)
6870                    } else {
6871                        user = self.parse_comma_separated(|p| p.parse_identifier())?;
6872                        Ok(())
6873                    }
6874                }
6875                Keyword::ADMIN => {
6876                    if !admin.is_empty() {
6877                        parser_err!("Found multiple ADMIN", loc)
6878                    } else {
6879                        admin = self.parse_comma_separated(|p| p.parse_identifier())?;
6880                        Ok(())
6881                    }
6882                }
6883                _ => break,
6884            }?
6885        }
6886
6887        Ok(CreateRole {
6888            names,
6889            if_not_exists,
6890            login,
6891            inherit,
6892            bypassrls,
6893            password,
6894            create_db,
6895            create_role,
6896            replication,
6897            superuser,
6898            connection_limit,
6899            valid_until,
6900            in_role,
6901            in_group,
6902            role,
6903            user,
6904            admin,
6905            authorization_owner,
6906        })
6907    }
6908
6909    /// Parse an `OWNER` clause.
6910    pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
6911        let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
6912            Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
6913            Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
6914            Some(Keyword::SESSION_USER) => Owner::SessionUser,
6915            Some(unexpected_keyword) => return Err(ParserError::ParserError(
6916                format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
6917            )),
6918            None => {
6919                match self.parse_identifier() {
6920                    Ok(ident) => Owner::Ident(ident),
6921                    Err(e) => {
6922                        return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
6923                    }
6924                }
6925            }
6926        };
6927        Ok(owner)
6928    }
6929
6930    /// Parses a [Statement::CreateDomain] statement.
6931    fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
6932        let name = self.parse_object_name(false)?;
6933        self.expect_keyword_is(Keyword::AS)?;
6934        let data_type = self.parse_data_type()?;
6935        let collation = if self.parse_keyword(Keyword::COLLATE) {
6936            Some(self.parse_identifier()?)
6937        } else {
6938            None
6939        };
6940        let default = if self.parse_keyword(Keyword::DEFAULT) {
6941            Some(self.parse_expr()?)
6942        } else {
6943            None
6944        };
6945        let mut constraints = Vec::new();
6946        while let Some(constraint) = self.parse_optional_table_constraint()? {
6947            constraints.push(constraint);
6948        }
6949
6950        Ok(CreateDomain {
6951            name,
6952            data_type,
6953            collation,
6954            default,
6955            constraints,
6956        })
6957    }
6958
6959    /// ```sql
6960    ///     CREATE POLICY name ON table_name [ AS { PERMISSIVE | RESTRICTIVE } ]
6961    ///     [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
6962    ///     [ TO { role_name | PUBLIC | CURRENT_USER | CURRENT_ROLE | SESSION_USER } [, ...] ]
6963    ///     [ USING ( using_expression ) ]
6964    ///     [ WITH CHECK ( with_check_expression ) ]
6965    /// ```
6966    ///
6967    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createpolicy.html)
6968    pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
6969        let name = self.parse_identifier()?;
6970        self.expect_keyword_is(Keyword::ON)?;
6971        let table_name = self.parse_object_name(false)?;
6972
6973        let policy_type = if self.parse_keyword(Keyword::AS) {
6974            let keyword =
6975                self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
6976            Some(match keyword {
6977                Keyword::PERMISSIVE => CreatePolicyType::Permissive,
6978                Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
6979                unexpected_keyword => return Err(ParserError::ParserError(
6980                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
6981                )),
6982            })
6983        } else {
6984            None
6985        };
6986
6987        let command = if self.parse_keyword(Keyword::FOR) {
6988            let keyword = self.expect_one_of_keywords(&[
6989                Keyword::ALL,
6990                Keyword::SELECT,
6991                Keyword::INSERT,
6992                Keyword::UPDATE,
6993                Keyword::DELETE,
6994            ])?;
6995            Some(match keyword {
6996                Keyword::ALL => CreatePolicyCommand::All,
6997                Keyword::SELECT => CreatePolicyCommand::Select,
6998                Keyword::INSERT => CreatePolicyCommand::Insert,
6999                Keyword::UPDATE => CreatePolicyCommand::Update,
7000                Keyword::DELETE => CreatePolicyCommand::Delete,
7001                unexpected_keyword => return Err(ParserError::ParserError(
7002                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
7003                )),
7004            })
7005        } else {
7006            None
7007        };
7008
7009        let to = if self.parse_keyword(Keyword::TO) {
7010            Some(self.parse_comma_separated(|p| p.parse_owner())?)
7011        } else {
7012            None
7013        };
7014
7015        let using = if self.parse_keyword(Keyword::USING) {
7016            self.expect_token(&Token::LParen)?;
7017            let expr = self.parse_expr()?;
7018            self.expect_token(&Token::RParen)?;
7019            Some(expr)
7020        } else {
7021            None
7022        };
7023
7024        let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7025            self.expect_token(&Token::LParen)?;
7026            let expr = self.parse_expr()?;
7027            self.expect_token(&Token::RParen)?;
7028            Some(expr)
7029        } else {
7030            None
7031        };
7032
7033        Ok(CreatePolicy {
7034            name,
7035            table_name,
7036            policy_type,
7037            command,
7038            to,
7039            using,
7040            with_check,
7041        })
7042    }
7043
7044    /// ```sql
7045    /// CREATE CONNECTOR [IF NOT EXISTS] connector_name
7046    /// [TYPE datasource_type]
7047    /// [URL datasource_url]
7048    /// [COMMENT connector_comment]
7049    /// [WITH DCPROPERTIES(property_name=property_value, ...)]
7050    /// ```
7051    ///
7052    /// [Hive Documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-CreateDataConnectorCreateConnector)
7053    pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7054        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7055        let name = self.parse_identifier()?;
7056
7057        let connector_type = if self.parse_keyword(Keyword::TYPE) {
7058            Some(self.parse_literal_string()?)
7059        } else {
7060            None
7061        };
7062
7063        let url = if self.parse_keyword(Keyword::URL) {
7064            Some(self.parse_literal_string()?)
7065        } else {
7066            None
7067        };
7068
7069        let comment = self.parse_optional_inline_comment()?;
7070
7071        let with_dcproperties =
7072            match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7073                properties if !properties.is_empty() => Some(properties),
7074                _ => None,
7075            };
7076
7077        Ok(CreateConnector {
7078            name,
7079            if_not_exists,
7080            connector_type,
7081            url,
7082            comment,
7083            with_dcproperties,
7084        })
7085    }
7086
7087    /// Parse an operator name, which can contain special characters like +, -, <, >, =
7088    /// that are tokenized as operator tokens rather than identifiers.
7089    /// This is used for PostgreSQL CREATE OPERATOR statements.
7090    ///
7091    /// Examples: `+`, `myschema.+`, `pg_catalog.<=`
7092    fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7093        let mut parts = vec![];
7094        loop {
7095            parts.push(ObjectNamePart::Identifier(Ident::new(
7096                self.next_token().to_string(),
7097            )));
7098            if !self.consume_token(&Token::Period) {
7099                break;
7100            }
7101        }
7102        Ok(ObjectName(parts))
7103    }
7104
7105    /// Parse a [Statement::CreateOperator]
7106    ///
7107    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createoperator.html)
7108    pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7109        let name = self.parse_operator_name()?;
7110        self.expect_token(&Token::LParen)?;
7111
7112        let mut function: Option<ObjectName> = None;
7113        let mut is_procedure = false;
7114        let mut left_arg: Option<DataType> = None;
7115        let mut right_arg: Option<DataType> = None;
7116        let mut options: Vec<OperatorOption> = Vec::new();
7117
7118        loop {
7119            let keyword = self.expect_one_of_keywords(&[
7120                Keyword::FUNCTION,
7121                Keyword::PROCEDURE,
7122                Keyword::LEFTARG,
7123                Keyword::RIGHTARG,
7124                Keyword::COMMUTATOR,
7125                Keyword::NEGATOR,
7126                Keyword::RESTRICT,
7127                Keyword::JOIN,
7128                Keyword::HASHES,
7129                Keyword::MERGES,
7130            ])?;
7131
7132            match keyword {
7133                Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7134                    options.push(OperatorOption::Hashes);
7135                }
7136                Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7137                    options.push(OperatorOption::Merges);
7138                }
7139                Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7140                    self.expect_token(&Token::Eq)?;
7141                    function = Some(self.parse_object_name(false)?);
7142                    is_procedure = keyword == Keyword::PROCEDURE;
7143                }
7144                Keyword::LEFTARG if left_arg.is_none() => {
7145                    self.expect_token(&Token::Eq)?;
7146                    left_arg = Some(self.parse_data_type()?);
7147                }
7148                Keyword::RIGHTARG if right_arg.is_none() => {
7149                    self.expect_token(&Token::Eq)?;
7150                    right_arg = Some(self.parse_data_type()?);
7151                }
7152                Keyword::COMMUTATOR
7153                    if !options
7154                        .iter()
7155                        .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7156                {
7157                    self.expect_token(&Token::Eq)?;
7158                    if self.parse_keyword(Keyword::OPERATOR) {
7159                        self.expect_token(&Token::LParen)?;
7160                        let op = self.parse_operator_name()?;
7161                        self.expect_token(&Token::RParen)?;
7162                        options.push(OperatorOption::Commutator(op));
7163                    } else {
7164                        options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7165                    }
7166                }
7167                Keyword::NEGATOR
7168                    if !options
7169                        .iter()
7170                        .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7171                {
7172                    self.expect_token(&Token::Eq)?;
7173                    if self.parse_keyword(Keyword::OPERATOR) {
7174                        self.expect_token(&Token::LParen)?;
7175                        let op = self.parse_operator_name()?;
7176                        self.expect_token(&Token::RParen)?;
7177                        options.push(OperatorOption::Negator(op));
7178                    } else {
7179                        options.push(OperatorOption::Negator(self.parse_operator_name()?));
7180                    }
7181                }
7182                Keyword::RESTRICT
7183                    if !options
7184                        .iter()
7185                        .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7186                {
7187                    self.expect_token(&Token::Eq)?;
7188                    options.push(OperatorOption::Restrict(Some(
7189                        self.parse_object_name(false)?,
7190                    )));
7191                }
7192                Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7193                    self.expect_token(&Token::Eq)?;
7194                    options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7195                }
7196                _ => {
7197                    return Err(ParserError::ParserError(format!(
7198                        "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7199                        keyword
7200                    )))
7201                }
7202            }
7203
7204            if !self.consume_token(&Token::Comma) {
7205                break;
7206            }
7207        }
7208
7209        // Expect closing parenthesis
7210        self.expect_token(&Token::RParen)?;
7211
7212        // FUNCTION is required
7213        let function = function.ok_or_else(|| {
7214            ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7215        })?;
7216
7217        Ok(CreateOperator {
7218            name,
7219            function,
7220            is_procedure,
7221            left_arg,
7222            right_arg,
7223            options,
7224        })
7225    }
7226
7227    /// Parse a [Statement::CreateOperatorFamily]
7228    ///
7229    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopfamily.html)
7230    pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7231        let name = self.parse_object_name(false)?;
7232        self.expect_keyword(Keyword::USING)?;
7233        let using = self.parse_identifier()?;
7234
7235        Ok(CreateOperatorFamily { name, using })
7236    }
7237
7238    /// Parse a [Statement::CreateOperatorClass]
7239    ///
7240    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopclass.html)
7241    pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7242        let name = self.parse_object_name(false)?;
7243        let default = self.parse_keyword(Keyword::DEFAULT);
7244        self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7245        let for_type = self.parse_data_type()?;
7246        self.expect_keyword(Keyword::USING)?;
7247        let using = self.parse_identifier()?;
7248
7249        let family = if self.parse_keyword(Keyword::FAMILY) {
7250            Some(self.parse_object_name(false)?)
7251        } else {
7252            None
7253        };
7254
7255        self.expect_keyword(Keyword::AS)?;
7256
7257        let mut items = vec![];
7258        loop {
7259            if self.parse_keyword(Keyword::OPERATOR) {
7260                let strategy_number = self.parse_literal_uint()?;
7261                let operator_name = self.parse_operator_name()?;
7262
7263                // Optional operator argument types
7264                let op_types = if self.consume_token(&Token::LParen) {
7265                    let left = self.parse_data_type()?;
7266                    self.expect_token(&Token::Comma)?;
7267                    let right = self.parse_data_type()?;
7268                    self.expect_token(&Token::RParen)?;
7269                    Some(OperatorArgTypes { left, right })
7270                } else {
7271                    None
7272                };
7273
7274                // Optional purpose
7275                let purpose = if self.parse_keyword(Keyword::FOR) {
7276                    if self.parse_keyword(Keyword::SEARCH) {
7277                        Some(OperatorPurpose::ForSearch)
7278                    } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7279                        let sort_family = self.parse_object_name(false)?;
7280                        Some(OperatorPurpose::ForOrderBy { sort_family })
7281                    } else {
7282                        return self
7283                            .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7284                    }
7285                } else {
7286                    None
7287                };
7288
7289                items.push(OperatorClassItem::Operator {
7290                    strategy_number,
7291                    operator_name,
7292                    op_types,
7293                    purpose,
7294                });
7295            } else if self.parse_keyword(Keyword::FUNCTION) {
7296                let support_number = self.parse_literal_uint()?;
7297
7298                // Optional operator types
7299                let op_types = if self.consume_token(&Token::LParen)
7300                    && self.peek_token_ref().token != Token::RParen
7301                {
7302                    let mut types = vec![];
7303                    loop {
7304                        types.push(self.parse_data_type()?);
7305                        if !self.consume_token(&Token::Comma) {
7306                            break;
7307                        }
7308                    }
7309                    self.expect_token(&Token::RParen)?;
7310                    Some(types)
7311                } else if self.consume_token(&Token::LParen) {
7312                    self.expect_token(&Token::RParen)?;
7313                    Some(vec![])
7314                } else {
7315                    None
7316                };
7317
7318                let function_name = self.parse_object_name(false)?;
7319
7320                // Function argument types
7321                let argument_types = if self.consume_token(&Token::LParen) {
7322                    let mut types = vec![];
7323                    loop {
7324                        if self.peek_token_ref().token == Token::RParen {
7325                            break;
7326                        }
7327                        types.push(self.parse_data_type()?);
7328                        if !self.consume_token(&Token::Comma) {
7329                            break;
7330                        }
7331                    }
7332                    self.expect_token(&Token::RParen)?;
7333                    types
7334                } else {
7335                    vec![]
7336                };
7337
7338                items.push(OperatorClassItem::Function {
7339                    support_number,
7340                    op_types,
7341                    function_name,
7342                    argument_types,
7343                });
7344            } else if self.parse_keyword(Keyword::STORAGE) {
7345                let storage_type = self.parse_data_type()?;
7346                items.push(OperatorClassItem::Storage { storage_type });
7347            } else {
7348                break;
7349            }
7350
7351            // Check for comma separator
7352            if !self.consume_token(&Token::Comma) {
7353                break;
7354            }
7355        }
7356
7357        Ok(CreateOperatorClass {
7358            name,
7359            default,
7360            for_type,
7361            using,
7362            family,
7363            items,
7364        })
7365    }
7366
7367    /// Parse a `DROP` statement.
7368    pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7369        // MySQL dialect supports `TEMPORARY`
7370        let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7371            && self.parse_keyword(Keyword::TEMPORARY);
7372        let persistent = dialect_of!(self is DuckDbDialect)
7373            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7374
7375        let object_type = if self.parse_keyword(Keyword::TABLE) {
7376            ObjectType::Table
7377        } else if self.parse_keyword(Keyword::COLLATION) {
7378            ObjectType::Collation
7379        } else if self.parse_keyword(Keyword::VIEW) {
7380            ObjectType::View
7381        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7382            ObjectType::MaterializedView
7383        } else if self.parse_keyword(Keyword::INDEX) {
7384            ObjectType::Index
7385        } else if self.parse_keyword(Keyword::ROLE) {
7386            ObjectType::Role
7387        } else if self.parse_keyword(Keyword::SCHEMA) {
7388            ObjectType::Schema
7389        } else if self.parse_keyword(Keyword::DATABASE) {
7390            ObjectType::Database
7391        } else if self.parse_keyword(Keyword::SEQUENCE) {
7392            ObjectType::Sequence
7393        } else if self.parse_keyword(Keyword::STAGE) {
7394            ObjectType::Stage
7395        } else if self.parse_keyword(Keyword::TYPE) {
7396            ObjectType::Type
7397        } else if self.parse_keyword(Keyword::USER) {
7398            ObjectType::User
7399        } else if self.parse_keyword(Keyword::STREAM) {
7400            ObjectType::Stream
7401        } else if self.parse_keyword(Keyword::FUNCTION) {
7402            return self.parse_drop_function().map(Into::into);
7403        } else if self.parse_keyword(Keyword::POLICY) {
7404            return self.parse_drop_policy().map(Into::into);
7405        } else if self.parse_keyword(Keyword::CONNECTOR) {
7406            return self.parse_drop_connector();
7407        } else if self.parse_keyword(Keyword::DOMAIN) {
7408            return self.parse_drop_domain().map(Into::into);
7409        } else if self.parse_keyword(Keyword::PROCEDURE) {
7410            return self.parse_drop_procedure();
7411        } else if self.parse_keyword(Keyword::SECRET) {
7412            return self.parse_drop_secret(temporary, persistent);
7413        } else if self.parse_keyword(Keyword::TRIGGER) {
7414            return self.parse_drop_trigger().map(Into::into);
7415        } else if self.parse_keyword(Keyword::EXTENSION) {
7416            return self.parse_drop_extension();
7417        } else if self.parse_keyword(Keyword::OPERATOR) {
7418            // Check if this is DROP OPERATOR FAMILY or DROP OPERATOR CLASS
7419            return if self.parse_keyword(Keyword::FAMILY) {
7420                self.parse_drop_operator_family()
7421            } else if self.parse_keyword(Keyword::CLASS) {
7422                self.parse_drop_operator_class()
7423            } else {
7424                self.parse_drop_operator()
7425            };
7426        } else {
7427            return self.expected_ref(
7428                "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
7429                self.peek_token_ref(),
7430            );
7431        };
7432        // Many dialects support the non-standard `IF EXISTS` clause and allow
7433        // specifying multiple objects to delete in a single statement
7434        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7435        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7436
7437        let loc = self.peek_token_ref().span.start;
7438        let cascade = self.parse_keyword(Keyword::CASCADE);
7439        let restrict = self.parse_keyword(Keyword::RESTRICT);
7440        let purge = self.parse_keyword(Keyword::PURGE);
7441        if cascade && restrict {
7442            return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7443        }
7444        if object_type == ObjectType::Role && (cascade || restrict || purge) {
7445            return parser_err!(
7446                "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7447                loc
7448            );
7449        }
7450        let table = if self.parse_keyword(Keyword::ON) {
7451            Some(self.parse_object_name(false)?)
7452        } else {
7453            None
7454        };
7455        Ok(Statement::Drop {
7456            object_type,
7457            if_exists,
7458            names,
7459            cascade,
7460            restrict,
7461            purge,
7462            temporary,
7463            table,
7464        })
7465    }
7466
7467    fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7468        match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7469            Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7470            Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7471            _ => None,
7472        }
7473    }
7474
7475    /// ```sql
7476    /// DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7477    /// [ CASCADE | RESTRICT ]
7478    /// ```
7479    fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7480        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7481        let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7482        let drop_behavior = self.parse_optional_drop_behavior();
7483        Ok(DropFunction {
7484            if_exists,
7485            func_desc,
7486            drop_behavior,
7487        })
7488    }
7489
7490    /// ```sql
7491    /// DROP POLICY [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
7492    /// ```
7493    ///
7494    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-droppolicy.html)
7495    fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7496        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7497        let name = self.parse_identifier()?;
7498        self.expect_keyword_is(Keyword::ON)?;
7499        let table_name = self.parse_object_name(false)?;
7500        let drop_behavior = self.parse_optional_drop_behavior();
7501        Ok(DropPolicy {
7502            if_exists,
7503            name,
7504            table_name,
7505            drop_behavior,
7506        })
7507    }
7508    /// ```sql
7509    /// DROP CONNECTOR [IF EXISTS] name
7510    /// ```
7511    ///
7512    /// See [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-DropConnector)
7513    fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7514        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7515        let name = self.parse_identifier()?;
7516        Ok(Statement::DropConnector { if_exists, name })
7517    }
7518
7519    /// ```sql
7520    /// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
7521    /// ```
7522    fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7523        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7524        let name = self.parse_object_name(false)?;
7525        let drop_behavior = self.parse_optional_drop_behavior();
7526        Ok(DropDomain {
7527            if_exists,
7528            name,
7529            drop_behavior,
7530        })
7531    }
7532
7533    /// ```sql
7534    /// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7535    /// [ CASCADE | RESTRICT ]
7536    /// ```
7537    fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7538        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7539        let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7540        let drop_behavior = self.parse_optional_drop_behavior();
7541        Ok(Statement::DropProcedure {
7542            if_exists,
7543            proc_desc,
7544            drop_behavior,
7545        })
7546    }
7547
7548    fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7549        let name = self.parse_object_name(false)?;
7550
7551        let args = if self.consume_token(&Token::LParen) {
7552            if self.consume_token(&Token::RParen) {
7553                Some(vec![])
7554            } else {
7555                let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7556                self.expect_token(&Token::RParen)?;
7557                Some(args)
7558            }
7559        } else {
7560            None
7561        };
7562
7563        Ok(FunctionDesc { name, args })
7564    }
7565
7566    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
7567    fn parse_drop_secret(
7568        &mut self,
7569        temporary: bool,
7570        persistent: bool,
7571    ) -> Result<Statement, ParserError> {
7572        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7573        let name = self.parse_identifier()?;
7574        let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7575            self.parse_identifier().ok()
7576        } else {
7577            None
7578        };
7579        let temp = match (temporary, persistent) {
7580            (true, false) => Some(true),
7581            (false, true) => Some(false),
7582            (false, false) => None,
7583            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7584        };
7585
7586        Ok(Statement::DropSecret {
7587            if_exists,
7588            temporary: temp,
7589            name,
7590            storage_specifier,
7591        })
7592    }
7593
7594    /// Parse a `DECLARE` statement.
7595    ///
7596    /// ```sql
7597    /// DECLARE name [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]
7598    ///     CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
7599    /// ```
7600    ///
7601    /// The syntax can vary significantly between warehouses. See the grammar
7602    /// on the warehouse specific function in such cases.
7603    pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7604        if dialect_of!(self is BigQueryDialect) {
7605            return self.parse_big_query_declare();
7606        }
7607        if dialect_of!(self is SnowflakeDialect) {
7608            return self.parse_snowflake_declare();
7609        }
7610        if dialect_of!(self is MsSqlDialect) {
7611            return self.parse_mssql_declare();
7612        }
7613
7614        let name = self.parse_identifier()?;
7615
7616        let binary = Some(self.parse_keyword(Keyword::BINARY));
7617        let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7618            Some(true)
7619        } else if self.parse_keyword(Keyword::ASENSITIVE) {
7620            Some(false)
7621        } else {
7622            None
7623        };
7624        let scroll = if self.parse_keyword(Keyword::SCROLL) {
7625            Some(true)
7626        } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7627            Some(false)
7628        } else {
7629            None
7630        };
7631
7632        self.expect_keyword_is(Keyword::CURSOR)?;
7633        let declare_type = Some(DeclareType::Cursor);
7634
7635        let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7636            Some(keyword) => {
7637                self.expect_keyword_is(Keyword::HOLD)?;
7638
7639                match keyword {
7640                    Keyword::WITH => Some(true),
7641                    Keyword::WITHOUT => Some(false),
7642                    unexpected_keyword => return Err(ParserError::ParserError(
7643                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7644                    )),
7645                }
7646            }
7647            None => None,
7648        };
7649
7650        self.expect_keyword_is(Keyword::FOR)?;
7651
7652        let query = Some(self.parse_query()?);
7653
7654        Ok(Statement::Declare {
7655            stmts: vec![Declare {
7656                names: vec![name],
7657                data_type: None,
7658                assignment: None,
7659                declare_type,
7660                binary,
7661                sensitive,
7662                scroll,
7663                hold,
7664                for_query: query,
7665            }],
7666        })
7667    }
7668
7669    /// Parse a [BigQuery] `DECLARE` statement.
7670    ///
7671    /// Syntax:
7672    /// ```text
7673    /// DECLARE variable_name[, ...] [{ <variable_type> | <DEFAULT expression> }];
7674    /// ```
7675    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#declare
7676    pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7677        let names = self.parse_comma_separated(Parser::parse_identifier)?;
7678
7679        let data_type = match &self.peek_token_ref().token {
7680            Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7681            _ => Some(self.parse_data_type()?),
7682        };
7683
7684        let expr = if data_type.is_some() {
7685            if self.parse_keyword(Keyword::DEFAULT) {
7686                Some(self.parse_expr()?)
7687            } else {
7688                None
7689            }
7690        } else {
7691            // If no variable type - default expression must be specified, per BQ docs.
7692            // i.e `DECLARE foo;` is invalid.
7693            self.expect_keyword_is(Keyword::DEFAULT)?;
7694            Some(self.parse_expr()?)
7695        };
7696
7697        Ok(Statement::Declare {
7698            stmts: vec![Declare {
7699                names,
7700                data_type,
7701                assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7702                declare_type: None,
7703                binary: None,
7704                sensitive: None,
7705                scroll: None,
7706                hold: None,
7707                for_query: None,
7708            }],
7709        })
7710    }
7711
7712    /// Parse a [Snowflake] `DECLARE` statement.
7713    ///
7714    /// Syntax:
7715    /// ```text
7716    /// DECLARE
7717    ///   [{ <variable_declaration>
7718    ///      | <cursor_declaration>
7719    ///      | <resultset_declaration>
7720    ///      | <exception_declaration> }; ... ]
7721    ///
7722    /// <variable_declaration>
7723    /// <variable_name> [<type>] [ { DEFAULT | := } <expression>]
7724    ///
7725    /// <cursor_declaration>
7726    /// <cursor_name> CURSOR FOR <query>
7727    ///
7728    /// <resultset_declaration>
7729    /// <resultset_name> RESULTSET [ { DEFAULT | := } ( <query> ) ] ;
7730    ///
7731    /// <exception_declaration>
7732    /// <exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
7733    /// ```
7734    ///
7735    /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare
7736    pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
7737        let mut stmts = vec![];
7738        loop {
7739            let name = self.parse_identifier()?;
7740            let (declare_type, for_query, assigned_expr, data_type) =
7741                if self.parse_keyword(Keyword::CURSOR) {
7742                    self.expect_keyword_is(Keyword::FOR)?;
7743                    match &self.peek_token_ref().token {
7744                        Token::Word(w) if w.keyword == Keyword::SELECT => (
7745                            Some(DeclareType::Cursor),
7746                            Some(self.parse_query()?),
7747                            None,
7748                            None,
7749                        ),
7750                        _ => (
7751                            Some(DeclareType::Cursor),
7752                            None,
7753                            Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
7754                            None,
7755                        ),
7756                    }
7757                } else if self.parse_keyword(Keyword::RESULTSET) {
7758                    let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
7759                        self.parse_snowflake_variable_declaration_expression()?
7760                    } else {
7761                        // Nothing more to do. The statement has no further parameters.
7762                        None
7763                    };
7764
7765                    (Some(DeclareType::ResultSet), None, assigned_expr, None)
7766                } else if self.parse_keyword(Keyword::EXCEPTION) {
7767                    let assigned_expr = if self.peek_token_ref().token == Token::LParen {
7768                        Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
7769                    } else {
7770                        // Nothing more to do. The statement has no further parameters.
7771                        None
7772                    };
7773
7774                    (Some(DeclareType::Exception), None, assigned_expr, None)
7775                } else {
7776                    // Without an explicit keyword, the only valid option is variable declaration.
7777                    let (assigned_expr, data_type) = if let Some(assigned_expr) =
7778                        self.parse_snowflake_variable_declaration_expression()?
7779                    {
7780                        (Some(assigned_expr), None)
7781                    } else if let Token::Word(_) = &self.peek_token_ref().token {
7782                        let data_type = self.parse_data_type()?;
7783                        (
7784                            self.parse_snowflake_variable_declaration_expression()?,
7785                            Some(data_type),
7786                        )
7787                    } else {
7788                        (None, None)
7789                    };
7790                    (None, None, assigned_expr, data_type)
7791                };
7792            let stmt = Declare {
7793                names: vec![name],
7794                data_type,
7795                assignment: assigned_expr,
7796                declare_type,
7797                binary: None,
7798                sensitive: None,
7799                scroll: None,
7800                hold: None,
7801                for_query,
7802            };
7803
7804            stmts.push(stmt);
7805            if self.consume_token(&Token::SemiColon) {
7806                match &self.peek_token_ref().token {
7807                    Token::Word(w)
7808                        if ALL_KEYWORDS
7809                            .binary_search(&w.value.to_uppercase().as_str())
7810                            .is_err() =>
7811                    {
7812                        // Not a keyword - start of a new declaration.
7813                        continue;
7814                    }
7815                    _ => {
7816                        // Put back the semicolon, this is the end of the DECLARE statement.
7817                        self.prev_token();
7818                    }
7819                }
7820            }
7821
7822            break;
7823        }
7824
7825        Ok(Statement::Declare { stmts })
7826    }
7827
7828    /// Parse a [MsSql] `DECLARE` statement.
7829    ///
7830    /// Syntax:
7831    /// ```text
7832    /// DECLARE
7833    // {
7834    //   { @local_variable [AS] data_type [ = value ] }
7835    //   | { @cursor_variable_name CURSOR [ FOR ] }
7836    // } [ ,...n ]
7837    /// ```
7838    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
7839    pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
7840        let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
7841
7842        Ok(Statement::Declare { stmts })
7843    }
7844
7845    /// Parse the body of a [MsSql] `DECLARE`statement.
7846    ///
7847    /// Syntax:
7848    /// ```text
7849    // {
7850    //   { @local_variable [AS] data_type [ = value ] }
7851    //   | { @cursor_variable_name CURSOR [ FOR ]}
7852    // } [ ,...n ]
7853    /// ```
7854    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
7855    pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
7856        let name = {
7857            let ident = self.parse_identifier()?;
7858            if !ident.value.starts_with('@')
7859                && !matches!(
7860                    &self.peek_token_ref().token,
7861                    Token::Word(w) if w.keyword == Keyword::CURSOR
7862                )
7863            {
7864                Err(ParserError::TokenizerError(
7865                    "Invalid MsSql variable declaration.".to_string(),
7866                ))
7867            } else {
7868                Ok(ident)
7869            }
7870        }?;
7871
7872        let (declare_type, data_type) = match &self.peek_token_ref().token {
7873            Token::Word(w) => match w.keyword {
7874                Keyword::CURSOR => {
7875                    self.next_token();
7876                    (Some(DeclareType::Cursor), None)
7877                }
7878                Keyword::AS => {
7879                    self.next_token();
7880                    (None, Some(self.parse_data_type()?))
7881                }
7882                _ => (None, Some(self.parse_data_type()?)),
7883            },
7884            _ => (None, Some(self.parse_data_type()?)),
7885        };
7886
7887        let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
7888            self.next_token();
7889            let query = Some(self.parse_query()?);
7890            (query, None)
7891        } else {
7892            let assignment = self.parse_mssql_variable_declaration_expression()?;
7893            (None, assignment)
7894        };
7895
7896        Ok(Declare {
7897            names: vec![name],
7898            data_type,
7899            assignment,
7900            declare_type,
7901            binary: None,
7902            sensitive: None,
7903            scroll: None,
7904            hold: None,
7905            for_query,
7906        })
7907    }
7908
7909    /// Parses the assigned expression in a variable declaration.
7910    ///
7911    /// Syntax:
7912    /// ```text
7913    /// [ { DEFAULT | := } <expression>]
7914    /// ```
7915    /// <https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare#variable-declaration-syntax>
7916    pub fn parse_snowflake_variable_declaration_expression(
7917        &mut self,
7918    ) -> Result<Option<DeclareAssignment>, ParserError> {
7919        Ok(match &self.peek_token_ref().token {
7920            Token::Word(w) if w.keyword == Keyword::DEFAULT => {
7921                self.next_token(); // Skip `DEFAULT`
7922                Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
7923            }
7924            Token::Assignment => {
7925                self.next_token(); // Skip `:=`
7926                Some(DeclareAssignment::DuckAssignment(Box::new(
7927                    self.parse_expr()?,
7928                )))
7929            }
7930            _ => None,
7931        })
7932    }
7933
7934    /// Parses the assigned expression in a variable declaration.
7935    ///
7936    /// Syntax:
7937    /// ```text
7938    /// [ = <expression>]
7939    /// ```
7940    pub fn parse_mssql_variable_declaration_expression(
7941        &mut self,
7942    ) -> Result<Option<DeclareAssignment>, ParserError> {
7943        Ok(match &self.peek_token_ref().token {
7944            Token::Eq => {
7945                self.next_token(); // Skip `=`
7946                Some(DeclareAssignment::MsSqlAssignment(Box::new(
7947                    self.parse_expr()?,
7948                )))
7949            }
7950            _ => None,
7951        })
7952    }
7953
7954    /// Parse `FETCH [direction] { FROM | IN } cursor INTO target;` statement.
7955    pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
7956        let direction = if self.parse_keyword(Keyword::NEXT) {
7957            FetchDirection::Next
7958        } else if self.parse_keyword(Keyword::PRIOR) {
7959            FetchDirection::Prior
7960        } else if self.parse_keyword(Keyword::FIRST) {
7961            FetchDirection::First
7962        } else if self.parse_keyword(Keyword::LAST) {
7963            FetchDirection::Last
7964        } else if self.parse_keyword(Keyword::ABSOLUTE) {
7965            FetchDirection::Absolute {
7966                limit: self.parse_number_value()?,
7967            }
7968        } else if self.parse_keyword(Keyword::RELATIVE) {
7969            FetchDirection::Relative {
7970                limit: self.parse_number_value()?,
7971            }
7972        } else if self.parse_keyword(Keyword::FORWARD) {
7973            if self.parse_keyword(Keyword::ALL) {
7974                FetchDirection::ForwardAll
7975            } else {
7976                FetchDirection::Forward {
7977                    // TODO: Support optional
7978                    limit: Some(self.parse_number_value()?),
7979                }
7980            }
7981        } else if self.parse_keyword(Keyword::BACKWARD) {
7982            if self.parse_keyword(Keyword::ALL) {
7983                FetchDirection::BackwardAll
7984            } else {
7985                FetchDirection::Backward {
7986                    // TODO: Support optional
7987                    limit: Some(self.parse_number_value()?),
7988                }
7989            }
7990        } else if self.parse_keyword(Keyword::ALL) {
7991            FetchDirection::All
7992        } else {
7993            FetchDirection::Count {
7994                limit: self.parse_number_value()?,
7995            }
7996        };
7997
7998        let position = if self.peek_keyword(Keyword::FROM) {
7999            self.expect_keyword(Keyword::FROM)?;
8000            FetchPosition::From
8001        } else if self.peek_keyword(Keyword::IN) {
8002            self.expect_keyword(Keyword::IN)?;
8003            FetchPosition::In
8004        } else {
8005            return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
8006        };
8007
8008        let name = self.parse_identifier()?;
8009
8010        let into = if self.parse_keyword(Keyword::INTO) {
8011            Some(self.parse_object_name(false)?)
8012        } else {
8013            None
8014        };
8015
8016        Ok(Statement::Fetch {
8017            name,
8018            direction,
8019            position,
8020            into,
8021        })
8022    }
8023
8024    /// Parse a `DISCARD` statement.
8025    pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8026        let object_type = if self.parse_keyword(Keyword::ALL) {
8027            DiscardObject::ALL
8028        } else if self.parse_keyword(Keyword::PLANS) {
8029            DiscardObject::PLANS
8030        } else if self.parse_keyword(Keyword::SEQUENCES) {
8031            DiscardObject::SEQUENCES
8032        } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8033            DiscardObject::TEMP
8034        } else {
8035            return self.expected_ref(
8036                "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8037                self.peek_token_ref(),
8038            );
8039        };
8040        Ok(Statement::Discard { object_type })
8041    }
8042
8043    /// Parse a `CREATE INDEX` statement.
8044    pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8045        let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8046        let r#async = self.parse_keyword(Keyword::ASYNC);
8047        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8048
8049        let mut using = None;
8050
8051        let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8052            let index_name = self.parse_object_name(false)?;
8053            // MySQL allows `USING index_type` either before or after `ON table_name`
8054            using = self.parse_optional_using_then_index_type()?;
8055            self.expect_keyword_is(Keyword::ON)?;
8056            Some(index_name)
8057        } else {
8058            None
8059        };
8060
8061        let table_name = self.parse_object_name(false)?;
8062
8063        // MySQL allows having two `USING` clauses.
8064        // In that case, the second clause overwrites the first.
8065        using = self.parse_optional_using_then_index_type()?.or(using);
8066
8067        let columns = self.parse_parenthesized_index_column_list()?;
8068
8069        let include = if self.parse_keyword(Keyword::INCLUDE) {
8070            self.expect_token(&Token::LParen)?;
8071            let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8072            self.expect_token(&Token::RParen)?;
8073            columns
8074        } else {
8075            vec![]
8076        };
8077
8078        let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8079            let not = self.parse_keyword(Keyword::NOT);
8080            self.expect_keyword_is(Keyword::DISTINCT)?;
8081            Some(!not)
8082        } else {
8083            None
8084        };
8085
8086        let with = if self.dialect.supports_create_index_with_clause()
8087            && self.parse_keyword(Keyword::WITH)
8088        {
8089            self.expect_token(&Token::LParen)?;
8090            let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8091            self.expect_token(&Token::RParen)?;
8092            with_params
8093        } else {
8094            Vec::new()
8095        };
8096
8097        let predicate = if self.parse_keyword(Keyword::WHERE) {
8098            Some(self.parse_expr()?)
8099        } else {
8100            None
8101        };
8102
8103        // MySQL options (including the modern style of `USING` after the column list instead of
8104        // before, which is deprecated) shouldn't conflict with other preceding options (e.g. `WITH
8105        // PARSER` won't be caught by the above `WITH` clause parsing because MySQL doesn't set that
8106        // support flag). This is probably invalid syntax for other dialects, but it is simpler to
8107        // parse it anyway (as we do inside `ALTER TABLE` and `CREATE TABLE` parsing).
8108        let index_options = self.parse_index_options()?;
8109
8110        // MySQL allows `ALGORITHM` and `LOCK` options. Unlike in `ALTER TABLE`, they need not be comma separated.
8111        let mut alter_options = Vec::new();
8112        while self
8113            .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8114            .is_some()
8115        {
8116            alter_options.push(self.parse_alter_table_operation()?)
8117        }
8118
8119        Ok(CreateIndex {
8120            name: index_name,
8121            table_name,
8122            using,
8123            columns,
8124            unique,
8125            concurrently,
8126            r#async,
8127            if_not_exists,
8128            include,
8129            nulls_distinct,
8130            with,
8131            predicate,
8132            index_options,
8133            alter_options,
8134        })
8135    }
8136
8137    /// Parse a `CREATE EXTENSION` statement.
8138    pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8139        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8140        let name = self.parse_identifier()?;
8141
8142        let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8143            let schema = if self.parse_keyword(Keyword::SCHEMA) {
8144                Some(self.parse_identifier()?)
8145            } else {
8146                None
8147            };
8148
8149            let version = if self.parse_keyword(Keyword::VERSION) {
8150                Some(self.parse_identifier()?)
8151            } else {
8152                None
8153            };
8154
8155            let cascade = self.parse_keyword(Keyword::CASCADE);
8156
8157            (schema, version, cascade)
8158        } else {
8159            (None, None, false)
8160        };
8161
8162        Ok(CreateExtension {
8163            name,
8164            if_not_exists,
8165            schema,
8166            version,
8167            cascade,
8168        })
8169    }
8170
8171    /// Parse a PostgreSQL-specific [Statement::CreateCollation] statement.
8172    pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8173        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8174        let name = self.parse_object_name(false)?;
8175
8176        let definition = if self.parse_keyword(Keyword::FROM) {
8177            CreateCollationDefinition::From(self.parse_object_name(false)?)
8178        } else if self.consume_token(&Token::LParen) {
8179            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8180            self.expect_token(&Token::RParen)?;
8181            CreateCollationDefinition::Options(options)
8182        } else {
8183            return self.expected_ref(
8184                "FROM or parenthesized option list after CREATE COLLATION name",
8185                self.peek_token_ref(),
8186            );
8187        };
8188
8189        Ok(CreateCollation {
8190            if_not_exists,
8191            name,
8192            definition,
8193        })
8194    }
8195
8196    /// Parse a PostgreSQL-specific [Statement::DropExtension] statement.
8197    pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8198        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8199        let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8200        let cascade_or_restrict =
8201            self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8202        Ok(Statement::DropExtension(DropExtension {
8203            names,
8204            if_exists,
8205            cascade_or_restrict: cascade_or_restrict
8206                .map(|k| match k {
8207                    Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8208                    Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8209                    _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8210                })
8211                .transpose()?,
8212        }))
8213    }
8214
8215    /// Parse a[Statement::DropOperator] statement.
8216    ///
8217    pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8218        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8219        let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8220        let drop_behavior = self.parse_optional_drop_behavior();
8221        Ok(Statement::DropOperator(DropOperator {
8222            if_exists,
8223            operators,
8224            drop_behavior,
8225        }))
8226    }
8227
8228    /// Parse an operator signature for a [Statement::DropOperator]
8229    /// Format: `name ( { left_type | NONE } , right_type )`
8230    fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8231        let name = self.parse_operator_name()?;
8232        self.expect_token(&Token::LParen)?;
8233
8234        // Parse left operand type (or NONE for prefix operators)
8235        let left_type = if self.parse_keyword(Keyword::NONE) {
8236            None
8237        } else {
8238            Some(self.parse_data_type()?)
8239        };
8240
8241        self.expect_token(&Token::Comma)?;
8242
8243        // Parse right operand type (always required)
8244        let right_type = self.parse_data_type()?;
8245
8246        self.expect_token(&Token::RParen)?;
8247
8248        Ok(DropOperatorSignature {
8249            name,
8250            left_type,
8251            right_type,
8252        })
8253    }
8254
8255    /// Parse a [Statement::DropOperatorFamily]
8256    ///
8257    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopfamily.html)
8258    pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8259        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8260        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8261        self.expect_keyword(Keyword::USING)?;
8262        let using = self.parse_identifier()?;
8263        let drop_behavior = self.parse_optional_drop_behavior();
8264        Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8265            if_exists,
8266            names,
8267            using,
8268            drop_behavior,
8269        }))
8270    }
8271
8272    /// Parse a [Statement::DropOperatorClass]
8273    ///
8274    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopclass.html)
8275    pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8276        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8277        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8278        self.expect_keyword(Keyword::USING)?;
8279        let using = self.parse_identifier()?;
8280        let drop_behavior = self.parse_optional_drop_behavior();
8281        Ok(Statement::DropOperatorClass(DropOperatorClass {
8282            if_exists,
8283            names,
8284            using,
8285            drop_behavior,
8286        }))
8287    }
8288
8289    /// Parse Hive distribution style.
8290    ///
8291    /// TODO: Support parsing for `SKEWED` distribution style.
8292    pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8293        if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8294            self.expect_token(&Token::LParen)?;
8295            let columns =
8296                self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8297            self.expect_token(&Token::RParen)?;
8298            Ok(HiveDistributionStyle::PARTITIONED { columns })
8299        } else {
8300            Ok(HiveDistributionStyle::NONE)
8301        }
8302    }
8303
8304    /// Parse Redshift `DISTSTYLE { AUTO | EVEN | KEY | ALL }`.
8305    ///
8306    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
8307    fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8308        let token = self.next_token();
8309        match &token.token {
8310            Token::Word(w) => match w.keyword {
8311                Keyword::AUTO => Ok(DistStyle::Auto),
8312                Keyword::EVEN => Ok(DistStyle::Even),
8313                Keyword::KEY => Ok(DistStyle::Key),
8314                Keyword::ALL => Ok(DistStyle::All),
8315                _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8316            },
8317            _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8318        }
8319    }
8320
8321    /// Parse Hive formats.
8322    pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8323        let mut hive_format: Option<HiveFormat> = None;
8324        loop {
8325            match self.parse_one_of_keywords(&[
8326                Keyword::ROW,
8327                Keyword::STORED,
8328                Keyword::LOCATION,
8329                Keyword::WITH,
8330                Keyword::USING,
8331            ]) {
8332                Some(Keyword::ROW) => {
8333                    hive_format
8334                        .get_or_insert_with(HiveFormat::default)
8335                        .row_format = Some(self.parse_row_format()?);
8336                }
8337                Some(Keyword::STORED) => {
8338                    self.expect_keyword_is(Keyword::AS)?;
8339                    if self.parse_keyword(Keyword::INPUTFORMAT) {
8340                        let input_format = self.parse_expr()?;
8341                        self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8342                        let output_format = self.parse_expr()?;
8343                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8344                            Some(HiveIOFormat::IOF {
8345                                input_format,
8346                                output_format,
8347                            });
8348                    } else {
8349                        let format = self.parse_file_format()?;
8350                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8351                            Some(HiveIOFormat::FileFormat { format });
8352                    }
8353                }
8354                Some(Keyword::LOCATION) => {
8355                    hive_format.get_or_insert_with(HiveFormat::default).location =
8356                        Some(self.parse_literal_string()?);
8357                }
8358                Some(Keyword::WITH) => {
8359                    self.prev_token();
8360                    let properties = self
8361                        .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8362                    if !properties.is_empty() {
8363                        hive_format
8364                            .get_or_insert_with(HiveFormat::default)
8365                            .serde_properties = Some(properties);
8366                    } else {
8367                        break;
8368                    }
8369                }
8370                Some(Keyword::USING) if self.dialect.supports_create_table_using() => {
8371                    let format = self.parse_identifier()?;
8372                    hive_format.get_or_insert_with(HiveFormat::default).storage =
8373                        Some(HiveIOFormat::Using { format });
8374                }
8375                Some(Keyword::USING) => {
8376                    // USING is not a table format keyword in this dialect; put it back
8377                    self.prev_token();
8378                    break;
8379                }
8380                None => break,
8381                _ => break,
8382            }
8383        }
8384
8385        Ok(hive_format)
8386    }
8387
8388    /// Parse Hive row format.
8389    pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8390        self.expect_keyword_is(Keyword::FORMAT)?;
8391        match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8392            Some(Keyword::SERDE) => {
8393                let class = self.parse_literal_string()?;
8394                Ok(HiveRowFormat::SERDE { class })
8395            }
8396            _ => {
8397                let mut row_delimiters = vec![];
8398
8399                loop {
8400                    match self.parse_one_of_keywords(&[
8401                        Keyword::FIELDS,
8402                        Keyword::COLLECTION,
8403                        Keyword::MAP,
8404                        Keyword::LINES,
8405                        Keyword::NULL,
8406                    ]) {
8407                        Some(Keyword::FIELDS)
8408                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8409                        {
8410                            row_delimiters.push(HiveRowDelimiter {
8411                                delimiter: HiveDelimiter::FieldsTerminatedBy,
8412                                char: self.parse_identifier()?,
8413                            });
8414
8415                            if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8416                                row_delimiters.push(HiveRowDelimiter {
8417                                    delimiter: HiveDelimiter::FieldsEscapedBy,
8418                                    char: self.parse_identifier()?,
8419                                });
8420                            }
8421                        }
8422                        Some(Keyword::COLLECTION)
8423                            if self.parse_keywords(&[
8424                                Keyword::ITEMS,
8425                                Keyword::TERMINATED,
8426                                Keyword::BY,
8427                            ]) =>
8428                        {
8429                            row_delimiters.push(HiveRowDelimiter {
8430                                delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8431                                char: self.parse_identifier()?,
8432                            });
8433                        }
8434                        Some(Keyword::MAP)
8435                            if self.parse_keywords(&[
8436                                Keyword::KEYS,
8437                                Keyword::TERMINATED,
8438                                Keyword::BY,
8439                            ]) =>
8440                        {
8441                            row_delimiters.push(HiveRowDelimiter {
8442                                delimiter: HiveDelimiter::MapKeysTerminatedBy,
8443                                char: self.parse_identifier()?,
8444                            });
8445                        }
8446                        Some(Keyword::LINES)
8447                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8448                        {
8449                            row_delimiters.push(HiveRowDelimiter {
8450                                delimiter: HiveDelimiter::LinesTerminatedBy,
8451                                char: self.parse_identifier()?,
8452                            });
8453                        }
8454                        Some(Keyword::NULL)
8455                            if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8456                        {
8457                            row_delimiters.push(HiveRowDelimiter {
8458                                delimiter: HiveDelimiter::NullDefinedAs,
8459                                char: self.parse_identifier()?,
8460                            });
8461                        }
8462                        _ => {
8463                            break;
8464                        }
8465                    }
8466                }
8467
8468                Ok(HiveRowFormat::DELIMITED {
8469                    delimiters: row_delimiters,
8470                })
8471            }
8472        }
8473    }
8474
8475    fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8476        if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8477            Ok(Some(self.parse_identifier()?))
8478        } else {
8479            Ok(None)
8480        }
8481    }
8482
8483    /// Parse `CREATE TABLE` statement.
8484    pub fn parse_create_table(
8485        &mut self,
8486        or_replace: bool,
8487        temporary: bool,
8488        global: Option<bool>,
8489        transient: bool,
8490        volatile: bool,
8491        multiset: Option<bool>,
8492    ) -> Result<CreateTable, ParserError> {
8493        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8494        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8495        let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8496
8497        let fallback = if self.dialect.supports_leading_comma_before_table_options()
8498            && self.consume_token(&Token::Comma)
8499        {
8500            let fallback = self.maybe_parse_fallback()?;
8501            if fallback.is_none() {
8502                self.prev_token(); // Put back comma.
8503            }
8504            fallback
8505        } else {
8506            None
8507        };
8508
8509        // PostgreSQL PARTITION OF for child partition tables
8510        // Note: This is a PostgreSQL-specific feature, but the dialect check was intentionally
8511        // removed to allow GenericDialect and other dialects to parse this syntax. This enables
8512        // multi-dialect SQL tools to work with PostgreSQL-specific DDL statements.
8513        //
8514        // PARTITION OF can be combined with other table definition clauses in the AST,
8515        // though PostgreSQL itself prohibits PARTITION OF with AS SELECT or LIKE clauses.
8516        // The parser accepts these combinations for flexibility; semantic validation
8517        // is left to downstream tools.
8518        // Child partitions can have their own constraints and indexes.
8519        let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8520            Some(self.parse_object_name(allow_unquoted_hyphen)?)
8521        } else {
8522            None
8523        };
8524
8525        // Clickhouse has `ON CLUSTER 'cluster'` syntax for DDLs
8526        let on_cluster = self.parse_optional_on_cluster()?;
8527
8528        let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8529
8530        let clone = if self.parse_keyword(Keyword::CLONE) {
8531            self.parse_object_name(allow_unquoted_hyphen).ok()
8532        } else {
8533            None
8534        };
8535
8536        // parse optional column list (schema)
8537        let (columns, constraints) = self.parse_columns()?;
8538        let comment_after_column_def =
8539            if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8540                let next_token = self.next_token();
8541                match next_token.token {
8542                    Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8543                    _ => self.expected("comment", next_token)?,
8544                }
8545            } else {
8546                None
8547            };
8548
8549        // PostgreSQL PARTITION OF: partition bound specification
8550        let for_values = if partition_of.is_some() {
8551            if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8552                Some(self.parse_partition_for_values()?)
8553            } else {
8554                return self.expected_ref(
8555                    "FOR VALUES or DEFAULT after PARTITION OF",
8556                    self.peek_token_ref(),
8557                );
8558            }
8559        } else {
8560            None
8561        };
8562
8563        // SQLite supports `WITHOUT ROWID` at the end of `CREATE TABLE`
8564        let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8565
8566        let hive_distribution = self.parse_hive_distribution()?;
8567        let clustered_by = self.parse_optional_clustered_by()?;
8568        let hive_formats = self.parse_hive_formats()?;
8569
8570        let create_table_config = self.parse_optional_create_table_config()?;
8571
8572        // ClickHouse supports `PRIMARY KEY`, before `ORDER BY`
8573        // https://clickhouse.com/docs/en/sql-reference/statements/create/table#primary-key
8574        let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8575            && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8576        {
8577            Some(Box::new(self.parse_expr()?))
8578        } else {
8579            None
8580        };
8581
8582        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8583            if self.consume_token(&Token::LParen) {
8584                let columns = if self.peek_token_ref().token != Token::RParen {
8585                    self.parse_comma_separated(|p| p.parse_expr())?
8586                } else {
8587                    vec![]
8588                };
8589                self.expect_token(&Token::RParen)?;
8590                Some(OneOrManyWithParens::Many(columns))
8591            } else {
8592                Some(OneOrManyWithParens::One(self.parse_expr()?))
8593            }
8594        } else {
8595            None
8596        };
8597
8598        // ClickHouse allows PARTITION BY after ORDER BY
8599        // https://clickhouse.com/docs/en/sql-reference/statements/create/table#partition-by
8600        let partition_by = if create_table_config.partition_by.is_none()
8601            && self.dialect.supports_partition_by_after_order_by()
8602            && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8603        {
8604            Some(Box::new(self.parse_expr()?))
8605        } else {
8606            create_table_config.partition_by
8607        };
8608
8609        let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8610            Some(self.parse_create_table_on_commit()?)
8611        } else {
8612            None
8613        };
8614
8615        let strict = self.parse_keyword(Keyword::STRICT);
8616
8617        // Redshift: BACKUP YES|NO
8618        let backup = if self.parse_keyword(Keyword::BACKUP) {
8619            let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8620            Some(keyword == Keyword::YES)
8621        } else {
8622            None
8623        };
8624
8625        // Redshift: DISTSTYLE, DISTKEY, SORTKEY
8626        let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8627            Some(self.parse_dist_style()?)
8628        } else {
8629            None
8630        };
8631        let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8632            self.expect_token(&Token::LParen)?;
8633            let expr = self.parse_expr()?;
8634            self.expect_token(&Token::RParen)?;
8635            Some(expr)
8636        } else {
8637            None
8638        };
8639        let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8640            self.expect_token(&Token::LParen)?;
8641            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8642            self.expect_token(&Token::RParen)?;
8643            Some(columns)
8644        } else {
8645            None
8646        };
8647
8648        // Parse optional `AS ( query )`
8649        let query = if self.parse_keyword(Keyword::AS) {
8650            Some(self.parse_query()?)
8651        } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8652        {
8653            // rewind the SELECT keyword
8654            self.prev_token();
8655            Some(self.parse_query()?)
8656        } else {
8657            None
8658        };
8659
8660        // `WITH DATA` clause only applies if there is a query body.
8661        let with_data = if query.is_some() {
8662            self.maybe_parse_with_data()?
8663        } else {
8664            None
8665        };
8666
8667        Ok(CreateTableBuilder::new(table_name)
8668            .temporary(temporary)
8669            .columns(columns)
8670            .constraints(constraints)
8671            .or_replace(or_replace)
8672            .if_not_exists(if_not_exists)
8673            .transient(transient)
8674            .volatile(volatile)
8675            .multiset(multiset)
8676            .fallback(fallback)
8677            .hive_distribution(hive_distribution)
8678            .hive_formats(hive_formats)
8679            .global(global)
8680            .query(query)
8681            .without_rowid(without_rowid)
8682            .like(like)
8683            .clone_clause(clone)
8684            .comment_after_column_def(comment_after_column_def)
8685            .order_by(order_by)
8686            .on_commit(on_commit)
8687            .on_cluster(on_cluster)
8688            .clustered_by(clustered_by)
8689            .partition_by(partition_by)
8690            .cluster_by(create_table_config.cluster_by)
8691            .inherits(create_table_config.inherits)
8692            .partition_of(partition_of)
8693            .for_values(for_values)
8694            .table_options(create_table_config.table_options)
8695            .primary_key(primary_key)
8696            .with_data(with_data)
8697            .strict(strict)
8698            .backup(backup)
8699            .diststyle(diststyle)
8700            .distkey(distkey)
8701            .sortkey(sortkey)
8702            .build())
8703    }
8704
8705    /// Parse `MULTISET` table-kind prefix on `CREATE TABLE`.
8706    fn maybe_parse_multiset(&mut self) -> Option<bool> {
8707        match self.parse_one_of_keywords(&[Keyword::SET, Keyword::MULTISET]) {
8708            Some(Keyword::MULTISET) => Some(true),
8709            Some(Keyword::SET) => Some(false),
8710            _ => None,
8711        }
8712    }
8713
8714    /// Parse `FALLBACK` option on a `CREATE TABLE` statement,
8715    fn maybe_parse_fallback(&mut self) -> Result<Option<bool>, ParserError> {
8716        if self.parse_keywords(&[Keyword::NO, Keyword::FALLBACK]) {
8717            Ok(Some(false))
8718        } else if self.parse_keyword(Keyword::FALLBACK) {
8719            Ok(Some(true))
8720        } else {
8721            Ok(None)
8722        }
8723    }
8724
8725    /// Parse [`WithData`] clause on `CREATE TABLE ... AS` statement.
8726    fn maybe_parse_with_data(&mut self) -> Result<Option<WithData>, ParserError> {
8727        let data = if self.parse_keywords(&[Keyword::WITH, Keyword::DATA]) {
8728            true
8729        } else if self.parse_keywords(&[Keyword::WITH, Keyword::NO, Keyword::DATA]) {
8730            false
8731        } else {
8732            return Ok(None);
8733        };
8734
8735        let statistics = if self.parse_keywords(&[Keyword::AND, Keyword::STATISTICS]) {
8736            Some(true)
8737        } else if self.parse_keywords(&[Keyword::AND, Keyword::NO, Keyword::STATISTICS]) {
8738            Some(false)
8739        } else {
8740            None
8741        };
8742
8743        Ok(Some(WithData { data, statistics }))
8744    }
8745
8746    fn maybe_parse_create_table_like(
8747        &mut self,
8748        allow_unquoted_hyphen: bool,
8749    ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8750        let like = if self.dialect.supports_create_table_like_parenthesized()
8751            && self.consume_token(&Token::LParen)
8752        {
8753            if self.parse_keyword(Keyword::LIKE) {
8754                let name = self.parse_object_name(allow_unquoted_hyphen)?;
8755                let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
8756                    Some(CreateTableLikeDefaults::Including)
8757                } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
8758                    Some(CreateTableLikeDefaults::Excluding)
8759                } else {
8760                    None
8761                };
8762                self.expect_token(&Token::RParen)?;
8763                Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
8764                    name,
8765                    defaults,
8766                }))
8767            } else {
8768                // Rollback the '(' it's probably the columns list
8769                self.prev_token();
8770                None
8771            }
8772        } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
8773            let name = self.parse_object_name(allow_unquoted_hyphen)?;
8774            Some(CreateTableLikeKind::Plain(CreateTableLike {
8775                name,
8776                defaults: None,
8777            }))
8778        } else {
8779            None
8780        };
8781        Ok(like)
8782    }
8783
8784    pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
8785        if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
8786            Ok(OnCommit::DeleteRows)
8787        } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
8788            Ok(OnCommit::PreserveRows)
8789        } else if self.parse_keywords(&[Keyword::DROP]) {
8790            Ok(OnCommit::Drop)
8791        } else {
8792            parser_err!(
8793                "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
8794                self.peek_token_ref()
8795            )
8796        }
8797    }
8798
8799    /// Parse [ForValues] of a `PARTITION OF` clause.
8800    ///
8801    /// Parses: `FOR VALUES partition_bound_spec | DEFAULT`
8802    ///
8803    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtable.html)
8804    fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
8805        if self.parse_keyword(Keyword::DEFAULT) {
8806            return Ok(ForValues::Default);
8807        }
8808
8809        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
8810
8811        if self.parse_keyword(Keyword::IN) {
8812            // FOR VALUES IN (expr, ...)
8813            self.expect_token(&Token::LParen)?;
8814            if self.peek_token_ref().token == Token::RParen {
8815                return self.expected_ref("at least one value", self.peek_token_ref());
8816            }
8817            let values = self.parse_comma_separated(Parser::parse_expr)?;
8818            self.expect_token(&Token::RParen)?;
8819            Ok(ForValues::In(values))
8820        } else if self.parse_keyword(Keyword::FROM) {
8821            // FOR VALUES FROM (...) TO (...)
8822            self.expect_token(&Token::LParen)?;
8823            if self.peek_token_ref().token == Token::RParen {
8824                return self.expected_ref("at least one value", self.peek_token_ref());
8825            }
8826            let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8827            self.expect_token(&Token::RParen)?;
8828            self.expect_keyword(Keyword::TO)?;
8829            self.expect_token(&Token::LParen)?;
8830            if self.peek_token_ref().token == Token::RParen {
8831                return self.expected_ref("at least one value", self.peek_token_ref());
8832            }
8833            let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8834            self.expect_token(&Token::RParen)?;
8835            Ok(ForValues::From { from, to })
8836        } else if self.parse_keyword(Keyword::WITH) {
8837            // FOR VALUES WITH (MODULUS n, REMAINDER r)
8838            self.expect_token(&Token::LParen)?;
8839            self.expect_keyword(Keyword::MODULUS)?;
8840            let modulus = self.parse_literal_uint()?;
8841            self.expect_token(&Token::Comma)?;
8842            self.expect_keyword(Keyword::REMAINDER)?;
8843            let remainder = self.parse_literal_uint()?;
8844            self.expect_token(&Token::RParen)?;
8845            Ok(ForValues::With { modulus, remainder })
8846        } else {
8847            self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
8848        }
8849    }
8850
8851    /// Parse a single partition bound value (MINVALUE, MAXVALUE, or expression).
8852    fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
8853        if self.parse_keyword(Keyword::MINVALUE) {
8854            Ok(PartitionBoundValue::MinValue)
8855        } else if self.parse_keyword(Keyword::MAXVALUE) {
8856            Ok(PartitionBoundValue::MaxValue)
8857        } else {
8858            Ok(PartitionBoundValue::Expr(self.parse_expr()?))
8859        }
8860    }
8861
8862    /// Parse configuration like inheritance, partitioning, clustering information during the table creation.
8863    ///
8864    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_2)
8865    /// [PostgreSQL](https://www.postgresql.org/docs/current/ddl-partitioning.html)
8866    /// [MySql](https://dev.mysql.com/doc/refman/8.4/en/create-table.html)
8867    fn parse_optional_create_table_config(
8868        &mut self,
8869    ) -> Result<CreateTableConfiguration, ParserError> {
8870        let mut table_options = CreateTableOptions::None;
8871
8872        let inherits = if self.parse_keyword(Keyword::INHERITS) {
8873            Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
8874        } else {
8875            None
8876        };
8877
8878        // PostgreSQL supports `WITH ( options )`, before `AS`
8879        let with_options = self.parse_options(Keyword::WITH)?;
8880        if !with_options.is_empty() {
8881            table_options = CreateTableOptions::With(with_options)
8882        }
8883
8884        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
8885        if !table_properties.is_empty() {
8886            table_options = CreateTableOptions::TableProperties(table_properties);
8887        }
8888        let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
8889            && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8890        {
8891            Some(Box::new(self.parse_expr()?))
8892        } else {
8893            None
8894        };
8895
8896        let mut cluster_by = None;
8897        if dialect_of!(self is BigQueryDialect | GenericDialect) {
8898            if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
8899                cluster_by = Some(WrappedCollection::NoWrapping(
8900                    self.parse_comma_separated(|p| p.parse_expr())?,
8901                ));
8902            };
8903
8904            if let Token::Word(word) = &self.peek_token_ref().token {
8905                if word.keyword == Keyword::OPTIONS {
8906                    table_options =
8907                        CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
8908                }
8909            };
8910        }
8911
8912        if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
8913            let plain_options = self.parse_plain_options()?;
8914            if !plain_options.is_empty() {
8915                table_options = CreateTableOptions::Plain(plain_options)
8916            }
8917        };
8918
8919        Ok(CreateTableConfiguration {
8920            partition_by,
8921            cluster_by,
8922            inherits,
8923            table_options,
8924        })
8925    }
8926
8927    fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
8928        // Single parameter option
8929        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8930        if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
8931            return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
8932        }
8933
8934        // Custom option
8935        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8936        if self.parse_keywords(&[Keyword::COMMENT]) {
8937            let has_eq = self.consume_token(&Token::Eq);
8938            let value = self.next_token();
8939
8940            let comment = match (has_eq, value.token) {
8941                (true, Token::SingleQuotedString(s)) => {
8942                    Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
8943                }
8944                (false, Token::SingleQuotedString(s)) => {
8945                    Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
8946                }
8947                (_, token) => {
8948                    self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
8949                }
8950            };
8951            return comment;
8952        }
8953
8954        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8955        // <https://clickhouse.com/docs/sql-reference/statements/create/table>
8956        if self.parse_keywords(&[Keyword::ENGINE]) {
8957            let _ = self.consume_token(&Token::Eq);
8958            let value = self.next_token();
8959
8960            let engine = match value.token {
8961                Token::Word(w) => {
8962                    let parameters = if self.peek_token_ref().token == Token::LParen {
8963                        self.parse_parenthesized_identifiers()?
8964                    } else {
8965                        vec![]
8966                    };
8967
8968                    Ok(Some(SqlOption::NamedParenthesizedList(
8969                        NamedParenthesizedList {
8970                            key: Ident::new("ENGINE"),
8971                            name: Some(Ident::new(w.value)),
8972                            values: parameters,
8973                        },
8974                    )))
8975                }
8976                _ => {
8977                    return self.expected("Token::Word", value)?;
8978                }
8979            };
8980
8981            return engine;
8982        }
8983
8984        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8985        if self.parse_keywords(&[Keyword::TABLESPACE]) {
8986            let _ = self.consume_token(&Token::Eq);
8987            let value = self.next_token();
8988
8989            let tablespace = match value.token {
8990                Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
8991                    let storage = match self.parse_keyword(Keyword::STORAGE) {
8992                        true => {
8993                            let _ = self.consume_token(&Token::Eq);
8994                            let storage_token = self.next_token();
8995                            match &storage_token.token {
8996                                Token::Word(w) => match w.value.to_uppercase().as_str() {
8997                                    "DISK" => Some(StorageType::Disk),
8998                                    "MEMORY" => Some(StorageType::Memory),
8999                                    _ => self
9000                                        .expected("Storage type (DISK or MEMORY)", storage_token)?,
9001                                },
9002                                _ => self.expected("Token::Word", storage_token)?,
9003                            }
9004                        }
9005                        false => None,
9006                    };
9007
9008                    Ok(Some(SqlOption::TableSpace(TablespaceOption {
9009                        name,
9010                        storage,
9011                    })))
9012                }
9013                _ => {
9014                    return self.expected("Token::Word", value)?;
9015                }
9016            };
9017
9018            return tablespace;
9019        }
9020
9021        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9022        if self.parse_keyword(Keyword::UNION) {
9023            let _ = self.consume_token(&Token::Eq);
9024            let value = self.next_token();
9025
9026            match value.token {
9027                Token::LParen => {
9028                    let tables: Vec<Ident> =
9029                        self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
9030                    self.expect_token(&Token::RParen)?;
9031
9032                    return Ok(Some(SqlOption::NamedParenthesizedList(
9033                        NamedParenthesizedList {
9034                            key: Ident::new("UNION"),
9035                            name: None,
9036                            values: tables,
9037                        },
9038                    )));
9039                }
9040                _ => {
9041                    return self.expected("Token::LParen", value)?;
9042                }
9043            }
9044        }
9045
9046        // Key/Value parameter option
9047        let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
9048            Ident::new("DEFAULT CHARSET")
9049        } else if self.parse_keyword(Keyword::CHARSET) {
9050            Ident::new("CHARSET")
9051        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
9052            Ident::new("DEFAULT CHARACTER SET")
9053        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9054            Ident::new("CHARACTER SET")
9055        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
9056            Ident::new("DEFAULT COLLATE")
9057        } else if self.parse_keyword(Keyword::COLLATE) {
9058            Ident::new("COLLATE")
9059        } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
9060            Ident::new("DATA DIRECTORY")
9061        } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
9062            Ident::new("INDEX DIRECTORY")
9063        } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
9064            Ident::new("KEY_BLOCK_SIZE")
9065        } else if self.parse_keyword(Keyword::ROW_FORMAT) {
9066            Ident::new("ROW_FORMAT")
9067        } else if self.parse_keyword(Keyword::PACK_KEYS) {
9068            Ident::new("PACK_KEYS")
9069        } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
9070            Ident::new("STATS_AUTO_RECALC")
9071        } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
9072            Ident::new("STATS_PERSISTENT")
9073        } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
9074            Ident::new("STATS_SAMPLE_PAGES")
9075        } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
9076            Ident::new("DELAY_KEY_WRITE")
9077        } else if self.parse_keyword(Keyword::COMPRESSION) {
9078            Ident::new("COMPRESSION")
9079        } else if self.parse_keyword(Keyword::ENCRYPTION) {
9080            Ident::new("ENCRYPTION")
9081        } else if self.parse_keyword(Keyword::MAX_ROWS) {
9082            Ident::new("MAX_ROWS")
9083        } else if self.parse_keyword(Keyword::MIN_ROWS) {
9084            Ident::new("MIN_ROWS")
9085        } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9086            Ident::new("AUTOEXTEND_SIZE")
9087        } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9088            Ident::new("AVG_ROW_LENGTH")
9089        } else if self.parse_keyword(Keyword::CHECKSUM) {
9090            Ident::new("CHECKSUM")
9091        } else if self.parse_keyword(Keyword::CONNECTION) {
9092            Ident::new("CONNECTION")
9093        } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9094            Ident::new("ENGINE_ATTRIBUTE")
9095        } else if self.parse_keyword(Keyword::PASSWORD) {
9096            Ident::new("PASSWORD")
9097        } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9098            Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9099        } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9100            Ident::new("INSERT_METHOD")
9101        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9102            Ident::new("AUTO_INCREMENT")
9103        } else {
9104            return Ok(None);
9105        };
9106
9107        let _ = self.consume_token(&Token::Eq);
9108
9109        let value = match self
9110            .maybe_parse(|parser| parser.parse_value())?
9111            .map(Expr::Value)
9112        {
9113            Some(expr) => expr,
9114            None => Expr::Identifier(self.parse_identifier()?),
9115        };
9116
9117        Ok(Some(SqlOption::KeyValue { key, value }))
9118    }
9119
9120    /// Parse plain options.
9121    pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9122        let mut options = Vec::new();
9123
9124        while let Some(option) = self.parse_plain_option()? {
9125            options.push(option);
9126            // Some dialects support comma-separated options; it shouldn't introduce ambiguity to
9127            // consume it for all dialects.
9128            let _ = self.consume_token(&Token::Comma);
9129        }
9130
9131        Ok(options)
9132    }
9133
9134    /// Parse optional inline comment.
9135    pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9136        let comment = if self.parse_keyword(Keyword::COMMENT) {
9137            let has_eq = self.consume_token(&Token::Eq);
9138            let comment = self.parse_comment_value()?;
9139            Some(if has_eq {
9140                CommentDef::WithEq(comment)
9141            } else {
9142                CommentDef::WithoutEq(comment)
9143            })
9144        } else {
9145            None
9146        };
9147        Ok(comment)
9148    }
9149
9150    /// Parse comment value.
9151    pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9152        let next_token = self.next_token();
9153        let value = match next_token.token {
9154            Token::SingleQuotedString(str) => str,
9155            Token::DollarQuotedString(str) => str.value,
9156            _ => self.expected("string literal", next_token)?,
9157        };
9158        Ok(value)
9159    }
9160
9161    /// Parse optional procedure parameters.
9162    pub fn parse_optional_procedure_parameters(
9163        &mut self,
9164    ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9165        let mut params = vec![];
9166        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9167            return Ok(Some(params));
9168        }
9169        loop {
9170            if let Token::Word(_) = &self.peek_token_ref().token {
9171                params.push(self.parse_procedure_param()?)
9172            }
9173            let comma = self.consume_token(&Token::Comma);
9174            if self.consume_token(&Token::RParen) {
9175                // allow a trailing comma, even though it's not in standard
9176                break;
9177            } else if !comma {
9178                return self.expected_ref(
9179                    "',' or ')' after parameter definition",
9180                    self.peek_token_ref(),
9181                );
9182            }
9183        }
9184        Ok(Some(params))
9185    }
9186
9187    /// Parse columns and constraints.
9188    pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9189        let mut columns = vec![];
9190        let mut constraints = vec![];
9191        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9192            return Ok((columns, constraints));
9193        }
9194
9195        loop {
9196            if let Some(constraint) = self.parse_optional_table_constraint()? {
9197                constraints.push(constraint);
9198            } else if let Token::Word(_) = &self.peek_token_ref().token {
9199                columns.push(self.parse_column_def()?);
9200            } else {
9201                return self.expected_ref(
9202                    "column name or constraint definition",
9203                    self.peek_token_ref(),
9204                );
9205            }
9206
9207            let comma = self.consume_token(&Token::Comma);
9208            let rparen = self.peek_token_ref().token == Token::RParen;
9209
9210            if !comma && !rparen {
9211                return self
9212                    .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9213            };
9214
9215            if rparen
9216                && (!comma
9217                    || self.dialect.supports_column_definition_trailing_commas()
9218                    || self.options.trailing_commas)
9219            {
9220                let _ = self.consume_token(&Token::RParen);
9221                break;
9222            }
9223        }
9224
9225        Ok((columns, constraints))
9226    }
9227
9228    /// Parse procedure parameter.
9229    pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9230        let mode = if self.parse_keyword(Keyword::IN) {
9231            Some(ArgMode::In)
9232        } else if self.parse_keyword(Keyword::OUT) {
9233            Some(ArgMode::Out)
9234        } else if self.parse_keyword(Keyword::INOUT) {
9235            Some(ArgMode::InOut)
9236        } else {
9237            None
9238        };
9239        let name = self.parse_identifier()?;
9240        let data_type = self.parse_data_type()?;
9241        let default = if self.consume_token(&Token::Eq) {
9242            Some(self.parse_expr()?)
9243        } else {
9244            None
9245        };
9246
9247        Ok(ProcedureParam {
9248            name,
9249            data_type,
9250            mode,
9251            default,
9252        })
9253    }
9254
9255    /// Parse column definition.
9256    pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9257        self.parse_column_def_inner(false)
9258    }
9259
9260    fn parse_column_def_inner(
9261        &mut self,
9262        optional_data_type: bool,
9263    ) -> Result<ColumnDef, ParserError> {
9264        let col_name = self.parse_identifier()?;
9265        let data_type = if self.is_column_type_sqlite_unspecified() {
9266            DataType::Unspecified
9267        } else if optional_data_type {
9268            self.maybe_parse(|parser| parser.parse_data_type())?
9269                .unwrap_or(DataType::Unspecified)
9270        } else {
9271            self.parse_data_type()?
9272        };
9273        let mut options = vec![];
9274        loop {
9275            if self.parse_keyword(Keyword::CONSTRAINT) {
9276                let name = Some(self.parse_identifier()?);
9277                if let Some(option) = self.parse_optional_column_option()? {
9278                    options.push(ColumnOptionDef { name, option });
9279                } else {
9280                    return self.expected_ref(
9281                        "constraint details after CONSTRAINT <name>",
9282                        self.peek_token_ref(),
9283                    );
9284                }
9285            } else if let Some(option) = self.parse_optional_column_option()? {
9286                options.push(ColumnOptionDef { name: None, option });
9287            } else {
9288                break;
9289            };
9290        }
9291        Ok(ColumnDef {
9292            name: col_name,
9293            data_type,
9294            options,
9295        })
9296    }
9297
9298    fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9299        if dialect_of!(self is SQLiteDialect) {
9300            match &self.peek_token_ref().token {
9301                Token::Word(word) => matches!(
9302                    word.keyword,
9303                    Keyword::CONSTRAINT
9304                        | Keyword::PRIMARY
9305                        | Keyword::NOT
9306                        | Keyword::UNIQUE
9307                        | Keyword::CHECK
9308                        | Keyword::DEFAULT
9309                        | Keyword::COLLATE
9310                        | Keyword::REFERENCES
9311                        | Keyword::GENERATED
9312                        | Keyword::AS
9313                ),
9314                _ => true, // e.g. comma immediately after column name
9315            }
9316        } else {
9317            false
9318        }
9319    }
9320
9321    /// Parse optional column option.
9322    pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9323        if let Some(option) = self.dialect.parse_column_option(self)? {
9324            return option;
9325        }
9326
9327        self.with_state(
9328            ColumnDefinition,
9329            |parser| -> Result<Option<ColumnOption>, ParserError> {
9330                parser.parse_optional_column_option_inner()
9331            },
9332        )
9333    }
9334
9335    fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9336        if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9337            Ok(Some(ColumnOption::CharacterSet(
9338                self.parse_object_name(false)?,
9339            )))
9340        } else if self.parse_keywords(&[Keyword::COLLATE]) {
9341            Ok(Some(ColumnOption::Collation(
9342                self.parse_object_name(false)?,
9343            )))
9344        } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9345            Ok(Some(ColumnOption::NotNull))
9346        } else if self.parse_keywords(&[Keyword::COMMENT]) {
9347            Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9348        } else if self.parse_keyword(Keyword::NULL) {
9349            Ok(Some(ColumnOption::Null))
9350        } else if self.parse_keyword(Keyword::DEFAULT) {
9351            Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9352        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
9353            && self.parse_keyword(Keyword::STORAGE)
9354        {
9355            Ok(Some(ColumnOption::Storage(self.parse_column_storage()?)))
9356        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9357            && self.parse_keyword(Keyword::MATERIALIZED)
9358        {
9359            Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9360        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9361            && self.parse_keyword(Keyword::ALIAS)
9362        {
9363            Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9364        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9365            && self.parse_keyword(Keyword::EPHEMERAL)
9366        {
9367            // The expression is optional for the EPHEMERAL syntax, so we need to check
9368            // if the column definition has remaining tokens before parsing the expression.
9369            if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9370                Ok(Some(ColumnOption::Ephemeral(None)))
9371            } else {
9372                Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9373            }
9374        } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9375            let characteristics = self.parse_constraint_characteristics()?;
9376            Ok(Some(
9377                PrimaryKeyConstraint {
9378                    name: None,
9379                    index_name: None,
9380                    index_type: None,
9381                    columns: vec![],
9382                    include: vec![],
9383                    index_options: vec![],
9384                    characteristics,
9385                }
9386                .into(),
9387            ))
9388        } else if self.parse_keyword(Keyword::UNIQUE) {
9389            let index_type_display =
9390                if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9391                    KeyOrIndexDisplay::Key
9392                } else {
9393                    KeyOrIndexDisplay::None
9394                };
9395            let characteristics = self.parse_constraint_characteristics()?;
9396            Ok(Some(
9397                UniqueConstraint {
9398                    name: None,
9399                    index_name: None,
9400                    index_type_display,
9401                    index_type: None,
9402                    columns: vec![],
9403                    include: vec![],
9404                    index_options: vec![],
9405                    characteristics,
9406                    nulls_distinct: NullsDistinctOption::None,
9407                }
9408                .into(),
9409            ))
9410        } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9411            // In MySQL, `KEY` in a column definition is shorthand for `PRIMARY KEY`.
9412            // See: https://dev.mysql.com/doc/refman/8.4/en/create-table.html
9413            let characteristics = self.parse_constraint_characteristics()?;
9414            Ok(Some(
9415                PrimaryKeyConstraint {
9416                    name: None,
9417                    index_name: None,
9418                    index_type: None,
9419                    columns: vec![],
9420                    include: vec![],
9421                    index_options: vec![],
9422                    characteristics,
9423                }
9424                .into(),
9425            ))
9426        } else if self.parse_keyword(Keyword::REFERENCES) {
9427            let foreign_table = self.parse_object_name(false)?;
9428            // PostgreSQL allows omitting the column list and
9429            // uses the primary key column of the foreign table by default
9430            let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9431            let mut match_kind = None;
9432            let mut on_delete = None;
9433            let mut on_update = None;
9434            loop {
9435                if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9436                    match_kind = Some(self.parse_match_kind()?);
9437                } else if on_delete.is_none()
9438                    && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9439                {
9440                    on_delete = Some(self.parse_referential_action()?);
9441                } else if on_update.is_none()
9442                    && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9443                {
9444                    on_update = Some(self.parse_referential_action()?);
9445                } else {
9446                    break;
9447                }
9448            }
9449            let characteristics = self.parse_constraint_characteristics()?;
9450
9451            Ok(Some(
9452                ForeignKeyConstraint {
9453                    name: None,       // Column-level constraints don't have names
9454                    index_name: None, // Not applicable for column-level constraints
9455                    columns: vec![],  // Not applicable for column-level constraints
9456                    foreign_table,
9457                    referred_columns,
9458                    on_delete,
9459                    on_update,
9460                    match_kind,
9461                    characteristics,
9462                }
9463                .into(),
9464            ))
9465        } else if self.parse_keyword(Keyword::CHECK) {
9466            self.expect_token(&Token::LParen)?;
9467            // since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
9468            let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9469            self.expect_token(&Token::RParen)?;
9470
9471            let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9472                Some(true)
9473            } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9474                Some(false)
9475            } else {
9476                None
9477            };
9478
9479            Ok(Some(
9480                CheckConstraint {
9481                    name: None, // Column-level check constraints don't have names
9482                    expr: Box::new(expr),
9483                    enforced,
9484                }
9485                .into(),
9486            ))
9487        } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9488            && dialect_of!(self is MySqlDialect | GenericDialect)
9489        {
9490            // Support AUTO_INCREMENT for MySQL
9491            Ok(Some(ColumnOption::DialectSpecific(vec![
9492                Token::make_keyword("AUTO_INCREMENT"),
9493            ])))
9494        } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9495            && dialect_of!(self is SQLiteDialect |  GenericDialect)
9496        {
9497            // Support AUTOINCREMENT for SQLite
9498            Ok(Some(ColumnOption::DialectSpecific(vec![
9499                Token::make_keyword("AUTOINCREMENT"),
9500            ])))
9501        } else if self.parse_keyword(Keyword::ASC)
9502            && self.dialect.supports_asc_desc_in_column_definition()
9503        {
9504            // Support ASC for SQLite
9505            Ok(Some(ColumnOption::DialectSpecific(vec![
9506                Token::make_keyword("ASC"),
9507            ])))
9508        } else if self.parse_keyword(Keyword::DESC)
9509            && self.dialect.supports_asc_desc_in_column_definition()
9510        {
9511            // Support DESC for SQLite
9512            Ok(Some(ColumnOption::DialectSpecific(vec![
9513                Token::make_keyword("DESC"),
9514            ])))
9515        } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9516            && dialect_of!(self is MySqlDialect | GenericDialect)
9517        {
9518            let expr = self.parse_expr()?;
9519            Ok(Some(ColumnOption::OnUpdate(expr)))
9520        } else if self.parse_keyword(Keyword::GENERATED) {
9521            self.parse_optional_column_option_generated()
9522        } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9523            && self.parse_keyword(Keyword::OPTIONS)
9524        {
9525            self.prev_token();
9526            Ok(Some(ColumnOption::Options(
9527                self.parse_options(Keyword::OPTIONS)?,
9528            )))
9529        } else if self.parse_keyword(Keyword::AS)
9530            && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9531        {
9532            self.parse_optional_column_option_as()
9533        } else if self.parse_keyword(Keyword::SRID)
9534            && dialect_of!(self is MySqlDialect | GenericDialect)
9535        {
9536            Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9537        } else if self.parse_keyword(Keyword::IDENTITY)
9538            && dialect_of!(self is MsSqlDialect | GenericDialect)
9539        {
9540            let parameters = if self.consume_token(&Token::LParen) {
9541                let seed = self.parse_number()?;
9542                self.expect_token(&Token::Comma)?;
9543                let increment = self.parse_number()?;
9544                self.expect_token(&Token::RParen)?;
9545
9546                Some(IdentityPropertyFormatKind::FunctionCall(
9547                    IdentityParameters { seed, increment },
9548                ))
9549            } else {
9550                None
9551            };
9552            Ok(Some(ColumnOption::Identity(
9553                IdentityPropertyKind::Identity(IdentityProperty {
9554                    parameters,
9555                    order: None,
9556                }),
9557            )))
9558        } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9559            && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9560        {
9561            // Support ON CONFLICT for SQLite
9562            Ok(Some(ColumnOption::OnConflict(
9563                self.expect_one_of_keywords(&[
9564                    Keyword::ROLLBACK,
9565                    Keyword::ABORT,
9566                    Keyword::FAIL,
9567                    Keyword::IGNORE,
9568                    Keyword::REPLACE,
9569                ])?,
9570            )))
9571        } else if self.parse_keyword(Keyword::INVISIBLE) {
9572            Ok(Some(ColumnOption::Invisible))
9573        } else {
9574            Ok(None)
9575        }
9576    }
9577
9578    pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9579        let name = self.parse_object_name(false)?;
9580        self.expect_token(&Token::Eq)?;
9581        let value = self.parse_literal_string()?;
9582
9583        Ok(Tag::new(name, value))
9584    }
9585
9586    fn parse_optional_column_option_generated(
9587        &mut self,
9588    ) -> Result<Option<ColumnOption>, ParserError> {
9589        if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9590            let mut sequence_options = vec![];
9591            if self.expect_token(&Token::LParen).is_ok() {
9592                sequence_options = self.parse_create_sequence_options()?;
9593                self.expect_token(&Token::RParen)?;
9594            }
9595            Ok(Some(ColumnOption::Generated {
9596                generated_as: GeneratedAs::Always,
9597                sequence_options: Some(sequence_options),
9598                generation_expr: None,
9599                generation_expr_mode: None,
9600                generated_keyword: true,
9601            }))
9602        } else if self.parse_keywords(&[
9603            Keyword::BY,
9604            Keyword::DEFAULT,
9605            Keyword::AS,
9606            Keyword::IDENTITY,
9607        ]) {
9608            let mut sequence_options = vec![];
9609            if self.expect_token(&Token::LParen).is_ok() {
9610                sequence_options = self.parse_create_sequence_options()?;
9611                self.expect_token(&Token::RParen)?;
9612            }
9613            Ok(Some(ColumnOption::Generated {
9614                generated_as: GeneratedAs::ByDefault,
9615                sequence_options: Some(sequence_options),
9616                generation_expr: None,
9617                generation_expr_mode: None,
9618                generated_keyword: true,
9619            }))
9620        } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9621            if self.expect_token(&Token::LParen).is_ok() {
9622                let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9623                self.expect_token(&Token::RParen)?;
9624                let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9625                    Ok((
9626                        GeneratedAs::ExpStored,
9627                        Some(GeneratedExpressionMode::Stored),
9628                    ))
9629                } else if dialect_of!(self is PostgreSqlDialect) {
9630                    // Postgres' AS IDENTITY branches are above, this one needs STORED
9631                    self.expected_ref("STORED", self.peek_token_ref())
9632                } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9633                    Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9634                } else {
9635                    Ok((GeneratedAs::Always, None))
9636                }?;
9637
9638                Ok(Some(ColumnOption::Generated {
9639                    generated_as: gen_as,
9640                    sequence_options: None,
9641                    generation_expr: Some(expr),
9642                    generation_expr_mode: expr_mode,
9643                    generated_keyword: true,
9644                }))
9645            } else {
9646                Ok(None)
9647            }
9648        } else {
9649            Ok(None)
9650        }
9651    }
9652
9653    fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9654        // Some DBs allow 'AS (expr)', shorthand for GENERATED ALWAYS AS
9655        self.expect_token(&Token::LParen)?;
9656        let expr = self.parse_expr()?;
9657        self.expect_token(&Token::RParen)?;
9658
9659        let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9660            (
9661                GeneratedAs::ExpStored,
9662                Some(GeneratedExpressionMode::Stored),
9663            )
9664        } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9665            (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9666        } else {
9667            (GeneratedAs::Always, None)
9668        };
9669
9670        Ok(Some(ColumnOption::Generated {
9671            generated_as: gen_as,
9672            sequence_options: None,
9673            generation_expr: Some(expr),
9674            generation_expr_mode: expr_mode,
9675            generated_keyword: false,
9676        }))
9677    }
9678
9679    /// Parse optional `CLUSTERED BY` clause for Hive/Generic dialects.
9680    pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9681        let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9682            && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9683        {
9684            let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9685
9686            let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9687                self.expect_token(&Token::LParen)?;
9688                let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9689                self.expect_token(&Token::RParen)?;
9690                Some(sorted_by_columns)
9691            } else {
9692                None
9693            };
9694
9695            self.expect_keyword_is(Keyword::INTO)?;
9696            let num_buckets = self.parse_number_value()?.value;
9697            self.expect_keyword_is(Keyword::BUCKETS)?;
9698            Some(ClusteredBy {
9699                columns,
9700                sorted_by,
9701                num_buckets,
9702            })
9703        } else {
9704            None
9705        };
9706        Ok(clustered_by)
9707    }
9708
9709    /// Parse a referential action used in foreign key clauses.
9710    ///
9711    /// Recognized forms: `RESTRICT`, `CASCADE`, `SET NULL`, `NO ACTION`, `SET DEFAULT`.
9712    pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9713        if self.parse_keyword(Keyword::RESTRICT) {
9714            Ok(ReferentialAction::Restrict)
9715        } else if self.parse_keyword(Keyword::CASCADE) {
9716            Ok(ReferentialAction::Cascade)
9717        } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9718            Ok(ReferentialAction::SetNull)
9719        } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9720            Ok(ReferentialAction::NoAction)
9721        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9722            Ok(ReferentialAction::SetDefault)
9723        } else {
9724            self.expected_ref(
9725                "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9726                self.peek_token_ref(),
9727            )
9728        }
9729    }
9730
9731    /// Parse a `MATCH` kind for constraint references: `FULL`, `PARTIAL`, or `SIMPLE`.
9732    pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9733        if self.parse_keyword(Keyword::FULL) {
9734            Ok(ConstraintReferenceMatchKind::Full)
9735        } else if self.parse_keyword(Keyword::PARTIAL) {
9736            Ok(ConstraintReferenceMatchKind::Partial)
9737        } else if self.parse_keyword(Keyword::SIMPLE) {
9738            Ok(ConstraintReferenceMatchKind::Simple)
9739        } else {
9740            self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9741        }
9742    }
9743
9744    /// Parse `index_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]`
9745    /// after `{ PRIMARY KEY | UNIQUE } USING INDEX`.
9746    fn parse_constraint_using_index(
9747        &mut self,
9748        name: Option<Ident>,
9749    ) -> Result<ConstraintUsingIndex, ParserError> {
9750        let index_name = self.parse_identifier()?;
9751        let characteristics = self.parse_constraint_characteristics()?;
9752        Ok(ConstraintUsingIndex {
9753            name,
9754            index_name,
9755            characteristics,
9756        })
9757    }
9758
9759    /// Parse optional constraint characteristics such as `DEFERRABLE`, `INITIALLY` and `ENFORCED`.
9760    pub fn parse_constraint_characteristics(
9761        &mut self,
9762    ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
9763        let mut cc = ConstraintCharacteristics::default();
9764
9765        loop {
9766            if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
9767            {
9768                cc.deferrable = Some(false);
9769            } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
9770                cc.deferrable = Some(true);
9771            } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
9772                if self.parse_keyword(Keyword::DEFERRED) {
9773                    cc.initially = Some(DeferrableInitial::Deferred);
9774                } else if self.parse_keyword(Keyword::IMMEDIATE) {
9775                    cc.initially = Some(DeferrableInitial::Immediate);
9776                } else {
9777                    self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
9778                }
9779            } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
9780                cc.enforced = Some(true);
9781            } else if cc.enforced.is_none()
9782                && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
9783            {
9784                cc.enforced = Some(false);
9785            } else {
9786                break;
9787            }
9788        }
9789
9790        if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
9791            Ok(Some(cc))
9792        } else {
9793            Ok(None)
9794        }
9795    }
9796
9797    /// Parse an optional table constraint (e.g. `PRIMARY KEY`, `UNIQUE`, `FOREIGN KEY`, `CHECK`).
9798    pub fn parse_optional_table_constraint(
9799        &mut self,
9800    ) -> Result<Option<TableConstraint>, ParserError> {
9801        let name = if self.parse_keyword(Keyword::CONSTRAINT) {
9802            if self.dialect.supports_constraint_keyword_without_name()
9803                && self
9804                    .peek_one_of_keywords(&[
9805                        Keyword::CHECK,
9806                        Keyword::PRIMARY,
9807                        Keyword::UNIQUE,
9808                        Keyword::FOREIGN,
9809                    ])
9810                    .is_some()
9811            {
9812                None
9813            } else {
9814                Some(self.parse_identifier()?)
9815            }
9816        } else {
9817            None
9818        };
9819
9820        let next_token = self.next_token();
9821        match next_token.token {
9822            Token::Word(w) if w.keyword == Keyword::UNIQUE => {
9823                // PostgreSQL: UNIQUE USING INDEX index_name
9824                // https://www.postgresql.org/docs/current/sql-altertable.html
9825                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9826                    return Ok(Some(TableConstraint::UniqueUsingIndex(
9827                        self.parse_constraint_using_index(name)?,
9828                    )));
9829                }
9830
9831                let index_type_display = self.parse_index_type_display();
9832                if !dialect_of!(self is GenericDialect | MySqlDialect)
9833                    && !index_type_display.is_none()
9834                {
9835                    return self.expected_ref(
9836                        "`index_name` or `(column_name [, ...])`",
9837                        self.peek_token_ref(),
9838                    );
9839                }
9840
9841                let nulls_distinct = self.parse_optional_nulls_distinct()?;
9842
9843                // optional index name
9844                let index_name = self.parse_optional_ident()?;
9845                let index_type = self.parse_optional_using_then_index_type()?;
9846
9847                let columns = self.parse_parenthesized_index_column_list()?;
9848                let include = self.parse_optional_include_columns()?;
9849                let index_options = self.parse_index_options()?;
9850                let characteristics = self.parse_constraint_characteristics()?;
9851                Ok(Some(
9852                    UniqueConstraint {
9853                        name,
9854                        index_name,
9855                        index_type_display,
9856                        index_type,
9857                        columns,
9858                        include,
9859                        index_options,
9860                        characteristics,
9861                        nulls_distinct,
9862                    }
9863                    .into(),
9864                ))
9865            }
9866            Token::Word(w) if w.keyword == Keyword::PRIMARY => {
9867                // after `PRIMARY` always stay `KEY`
9868                self.expect_keyword_is(Keyword::KEY)?;
9869
9870                // PostgreSQL: PRIMARY KEY USING INDEX index_name
9871                // https://www.postgresql.org/docs/current/sql-altertable.html
9872                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9873                    return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
9874                        self.parse_constraint_using_index(name)?,
9875                    )));
9876                }
9877
9878                // optional index name
9879                let index_name = self.parse_optional_ident()?;
9880                let index_type = self.parse_optional_using_then_index_type()?;
9881
9882                let columns = self.parse_parenthesized_index_column_list()?;
9883                let include = self.parse_optional_include_columns()?;
9884                let index_options = self.parse_index_options()?;
9885                let characteristics = self.parse_constraint_characteristics()?;
9886                Ok(Some(
9887                    PrimaryKeyConstraint {
9888                        name,
9889                        index_name,
9890                        index_type,
9891                        columns,
9892                        include,
9893                        index_options,
9894                        characteristics,
9895                    }
9896                    .into(),
9897                ))
9898            }
9899            Token::Word(w) if w.keyword == Keyword::FOREIGN => {
9900                self.expect_keyword_is(Keyword::KEY)?;
9901                let index_name = self.parse_optional_ident()?;
9902                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9903                self.expect_keyword_is(Keyword::REFERENCES)?;
9904                let foreign_table = self.parse_object_name(false)?;
9905                let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9906                let mut match_kind = None;
9907                let mut on_delete = None;
9908                let mut on_update = None;
9909                loop {
9910                    if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9911                        match_kind = Some(self.parse_match_kind()?);
9912                    } else if on_delete.is_none()
9913                        && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9914                    {
9915                        on_delete = Some(self.parse_referential_action()?);
9916                    } else if on_update.is_none()
9917                        && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9918                    {
9919                        on_update = Some(self.parse_referential_action()?);
9920                    } else {
9921                        break;
9922                    }
9923                }
9924
9925                let characteristics = self.parse_constraint_characteristics()?;
9926
9927                Ok(Some(
9928                    ForeignKeyConstraint {
9929                        name,
9930                        index_name,
9931                        columns,
9932                        foreign_table,
9933                        referred_columns,
9934                        on_delete,
9935                        on_update,
9936                        match_kind,
9937                        characteristics,
9938                    }
9939                    .into(),
9940                ))
9941            }
9942            Token::Word(w) if w.keyword == Keyword::CHECK => {
9943                self.expect_token(&Token::LParen)?;
9944                let expr = Box::new(self.parse_expr()?);
9945                self.expect_token(&Token::RParen)?;
9946
9947                let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9948                    Some(true)
9949                } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9950                    Some(false)
9951                } else {
9952                    None
9953                };
9954
9955                Ok(Some(
9956                    CheckConstraint {
9957                        name,
9958                        expr,
9959                        enforced,
9960                    }
9961                    .into(),
9962                ))
9963            }
9964            Token::Word(w)
9965                if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
9966                    && dialect_of!(self is GenericDialect | MySqlDialect)
9967                    && name.is_none() =>
9968            {
9969                let display_as_key = w.keyword == Keyword::KEY;
9970
9971                let name = match &self.peek_token_ref().token {
9972                    Token::Word(word) if word.keyword == Keyword::USING => None,
9973                    _ => self.parse_optional_ident()?,
9974                };
9975
9976                let index_type = self.parse_optional_using_then_index_type()?;
9977                let columns = self.parse_parenthesized_index_column_list()?;
9978                let index_options = self.parse_index_options()?;
9979
9980                Ok(Some(
9981                    IndexConstraint {
9982                        display_as_key,
9983                        name,
9984                        index_type,
9985                        columns,
9986                        index_options,
9987                    }
9988                    .into(),
9989                ))
9990            }
9991            Token::Word(w)
9992                if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
9993                    && dialect_of!(self is GenericDialect | MySqlDialect) =>
9994            {
9995                if let Some(name) = name {
9996                    return self.expected(
9997                        "FULLTEXT or SPATIAL option without constraint name",
9998                        TokenWithSpan {
9999                            token: Token::make_keyword(&name.to_string()),
10000                            span: next_token.span,
10001                        },
10002                    );
10003                }
10004
10005                let fulltext = w.keyword == Keyword::FULLTEXT;
10006
10007                let index_type_display = self.parse_index_type_display();
10008
10009                let opt_index_name = self.parse_optional_ident()?;
10010
10011                let columns = self.parse_parenthesized_index_column_list()?;
10012
10013                Ok(Some(
10014                    FullTextOrSpatialConstraint {
10015                        fulltext,
10016                        index_type_display,
10017                        opt_index_name,
10018                        columns,
10019                    }
10020                    .into(),
10021                ))
10022            }
10023            _ => {
10024                if name.is_some() {
10025                    self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
10026                } else {
10027                    self.prev_token();
10028                    Ok(None)
10029                }
10030            }
10031        }
10032    }
10033
10034    fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
10035        Ok(if self.parse_keyword(Keyword::NULLS) {
10036            let not = self.parse_keyword(Keyword::NOT);
10037            self.expect_keyword_is(Keyword::DISTINCT)?;
10038            if not {
10039                NullsDistinctOption::NotDistinct
10040            } else {
10041                NullsDistinctOption::Distinct
10042            }
10043        } else {
10044            NullsDistinctOption::None
10045        })
10046    }
10047
10048    /// Optionally parse a parenthesized list of `SqlOption`s introduced by `keyword`.
10049    pub fn maybe_parse_options(
10050        &mut self,
10051        keyword: Keyword,
10052    ) -> Result<Option<Vec<SqlOption>>, ParserError> {
10053        if let Token::Word(word) = &self.peek_token_ref().token {
10054            if word.keyword == keyword {
10055                return Ok(Some(self.parse_options(keyword)?));
10056            }
10057        };
10058        Ok(None)
10059    }
10060
10061    /// Parse a parenthesized list of `SqlOption`s following `keyword`, or return an empty vec.
10062    pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
10063        if self.parse_keyword(keyword) {
10064            self.expect_token(&Token::LParen)?;
10065            let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
10066            self.expect_token(&Token::RParen)?;
10067            Ok(options)
10068        } else {
10069            Ok(vec![])
10070        }
10071    }
10072
10073    /// Parse options introduced by one of `keywords` followed by a parenthesized list.
10074    pub fn parse_options_with_keywords(
10075        &mut self,
10076        keywords: &[Keyword],
10077    ) -> Result<Vec<SqlOption>, ParserError> {
10078        if self.parse_keywords(keywords) {
10079            self.expect_token(&Token::LParen)?;
10080            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
10081            self.expect_token(&Token::RParen)?;
10082            Ok(options)
10083        } else {
10084            Ok(vec![])
10085        }
10086    }
10087
10088    /// Parse an index type token (e.g. `BTREE`, `HASH`, or a custom identifier).
10089    pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
10090        Ok(if self.parse_keyword(Keyword::BTREE) {
10091            IndexType::BTree
10092        } else if self.parse_keyword(Keyword::HASH) {
10093            IndexType::Hash
10094        } else if self.parse_keyword(Keyword::GIN) {
10095            IndexType::GIN
10096        } else if self.parse_keyword(Keyword::GIST) {
10097            IndexType::GiST
10098        } else if self.parse_keyword(Keyword::SPGIST) {
10099            IndexType::SPGiST
10100        } else if self.parse_keyword(Keyword::BRIN) {
10101            IndexType::BRIN
10102        } else if self.parse_keyword(Keyword::BLOOM) {
10103            IndexType::Bloom
10104        } else {
10105            IndexType::Custom(self.parse_identifier()?)
10106        })
10107    }
10108
10109    /// Optionally parse the `USING` keyword, followed by an [IndexType]
10110    /// Example:
10111    /// ```sql
10112    //// USING BTREE (name, age DESC)
10113    /// ```
10114    /// Optionally parse `USING <index_type>` and return the parsed `IndexType` if present.
10115    pub fn parse_optional_using_then_index_type(
10116        &mut self,
10117    ) -> Result<Option<IndexType>, ParserError> {
10118        if self.parse_keyword(Keyword::USING) {
10119            Ok(Some(self.parse_index_type()?))
10120        } else {
10121            Ok(None)
10122        }
10123    }
10124
10125    /// Parse `[ident]`, mostly `ident` is name, like:
10126    /// `window_name`, `index_name`, ...
10127    /// Parse an optional identifier, returning `Some(Ident)` if present.
10128    pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10129        self.maybe_parse(|parser| parser.parse_identifier())
10130    }
10131
10132    #[must_use]
10133    /// Parse optional `KEY` or `INDEX` display tokens used in index/constraint declarations.
10134    pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10135        if self.parse_keyword(Keyword::KEY) {
10136            KeyOrIndexDisplay::Key
10137        } else if self.parse_keyword(Keyword::INDEX) {
10138            KeyOrIndexDisplay::Index
10139        } else {
10140            KeyOrIndexDisplay::None
10141        }
10142    }
10143
10144    /// Parse an optional index option such as `USING <type>` or `COMMENT <string>`.
10145    pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10146        if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10147            Ok(Some(IndexOption::Using(index_type)))
10148        } else if self.parse_keyword(Keyword::COMMENT) {
10149            let s = self.parse_literal_string()?;
10150            Ok(Some(IndexOption::Comment(s)))
10151        } else {
10152            Ok(None)
10153        }
10154    }
10155
10156    /// Parse zero or more index options and return them as a vector.
10157    pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10158        let mut options = Vec::new();
10159
10160        loop {
10161            match self.parse_optional_index_option()? {
10162                Some(index_option) => options.push(index_option),
10163                None => return Ok(options),
10164            }
10165        }
10166    }
10167
10168    /// Parse an optional `INCLUDE (col, ...)` clause on a table constraint.
10169    pub fn parse_optional_include_columns(&mut self) -> Result<Vec<Ident>, ParserError> {
10170        if self.parse_keyword(Keyword::INCLUDE) {
10171            self.expect_token(&Token::LParen)?;
10172            let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
10173            self.expect_token(&Token::RParen)?;
10174            Ok(columns)
10175        } else {
10176            Ok(vec![])
10177        }
10178    }
10179
10180    /// Parse a single `SqlOption` used by various dialect-specific DDL statements.
10181    pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10182        let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10183
10184        match &self.peek_token_ref().token {
10185            Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10186                Ok(SqlOption::Ident(self.parse_identifier()?))
10187            }
10188            Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10189                self.parse_option_partition()
10190            }
10191            Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10192                self.parse_option_clustered()
10193            }
10194            _ => {
10195                let name = self.parse_identifier()?;
10196                self.expect_token(&Token::Eq)?;
10197                let value = self.parse_expr()?;
10198
10199                Ok(SqlOption::KeyValue { key: name, value })
10200            }
10201        }
10202    }
10203
10204    /// Parse a `CLUSTERED` table option (MSSQL-specific syntaxes supported).
10205    pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10206        if self.parse_keywords(&[
10207            Keyword::CLUSTERED,
10208            Keyword::COLUMNSTORE,
10209            Keyword::INDEX,
10210            Keyword::ORDER,
10211        ]) {
10212            Ok(SqlOption::Clustered(
10213                TableOptionsClustered::ColumnstoreIndexOrder(
10214                    self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10215                ),
10216            ))
10217        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10218            Ok(SqlOption::Clustered(
10219                TableOptionsClustered::ColumnstoreIndex,
10220            ))
10221        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10222            self.expect_token(&Token::LParen)?;
10223
10224            let columns = self.parse_comma_separated(|p| {
10225                let name = p.parse_identifier()?;
10226                let asc = p.parse_asc_desc();
10227
10228                Ok(ClusteredIndex { name, asc })
10229            })?;
10230
10231            self.expect_token(&Token::RParen)?;
10232
10233            Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10234        } else {
10235            Err(ParserError::ParserError(
10236                "invalid CLUSTERED sequence".to_string(),
10237            ))
10238        }
10239    }
10240
10241    /// Parse a `PARTITION(...) FOR VALUES(...)` table option.
10242    pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10243        self.expect_keyword_is(Keyword::PARTITION)?;
10244        self.expect_token(&Token::LParen)?;
10245        let column_name = self.parse_identifier()?;
10246
10247        self.expect_keyword_is(Keyword::RANGE)?;
10248        let range_direction = if self.parse_keyword(Keyword::LEFT) {
10249            Some(PartitionRangeDirection::Left)
10250        } else if self.parse_keyword(Keyword::RIGHT) {
10251            Some(PartitionRangeDirection::Right)
10252        } else {
10253            None
10254        };
10255
10256        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10257        self.expect_token(&Token::LParen)?;
10258
10259        let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10260
10261        self.expect_token(&Token::RParen)?;
10262        self.expect_token(&Token::RParen)?;
10263
10264        Ok(SqlOption::Partition {
10265            column_name,
10266            range_direction,
10267            for_values,
10268        })
10269    }
10270
10271    /// Parse a parenthesized list of partition expressions and return a `Partition` value.
10272    pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10273        self.expect_token(&Token::LParen)?;
10274        let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10275        self.expect_token(&Token::RParen)?;
10276        Ok(Partition::Partitions(partitions))
10277    }
10278
10279    /// Parse a parenthesized `SELECT` projection used for projection-based operations.
10280    pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10281        self.expect_token(&Token::LParen)?;
10282        self.expect_keyword_is(Keyword::SELECT)?;
10283        let projection = self.parse_projection()?;
10284        let group_by = self.parse_optional_group_by()?;
10285        let order_by = self.parse_optional_order_by()?;
10286        self.expect_token(&Token::RParen)?;
10287        Ok(ProjectionSelect {
10288            projection,
10289            group_by,
10290            order_by,
10291        })
10292    }
10293    /// Parse `ALTER TABLE ... ADD PROJECTION ...` operation.
10294    pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10295        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10296        let name = self.parse_identifier()?;
10297        let query = self.parse_projection_select()?;
10298        Ok(AlterTableOperation::AddProjection {
10299            if_not_exists,
10300            name,
10301            select: query,
10302        })
10303    }
10304
10305    /// Parse Redshift `ALTER SORTKEY (column_list)`.
10306    ///
10307    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html>
10308    fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10309        self.expect_keyword_is(Keyword::ALTER)?;
10310        self.expect_keyword_is(Keyword::SORTKEY)?;
10311        self.expect_token(&Token::LParen)?;
10312        let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10313        self.expect_token(&Token::RParen)?;
10314        Ok(AlterTableOperation::AlterSortKey { columns })
10315    }
10316
10317    /// Parse a single `ALTER TABLE` operation and return an `AlterTableOperation`.
10318    pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10319        let operation = if self.parse_keyword(Keyword::ADD) {
10320            if let Some(constraint) = self.parse_optional_table_constraint()? {
10321                let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10322                AlterTableOperation::AddConstraint {
10323                    constraint,
10324                    not_valid,
10325                }
10326            } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10327                && self.parse_keyword(Keyword::PROJECTION)
10328            {
10329                return self.parse_alter_table_add_projection();
10330            } else {
10331                let if_not_exists =
10332                    self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10333                let mut new_partitions = vec![];
10334                loop {
10335                    if self.parse_keyword(Keyword::PARTITION) {
10336                        new_partitions.push(self.parse_partition()?);
10337                    } else {
10338                        break;
10339                    }
10340                }
10341                if !new_partitions.is_empty() {
10342                    AlterTableOperation::AddPartitions {
10343                        if_not_exists,
10344                        new_partitions,
10345                    }
10346                } else {
10347                    let column_keyword = self.parse_keyword(Keyword::COLUMN);
10348
10349                    let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10350                    {
10351                        self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10352                            || if_not_exists
10353                    } else {
10354                        false
10355                    };
10356
10357                    let column_def = self.parse_column_def()?;
10358
10359                    let column_position = self.parse_column_position()?;
10360
10361                    AlterTableOperation::AddColumn {
10362                        column_keyword,
10363                        if_not_exists,
10364                        column_def,
10365                        column_position,
10366                    }
10367                }
10368            }
10369        } else if self.parse_keyword(Keyword::RENAME) {
10370            if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10371                let old_name = self.parse_identifier()?;
10372                self.expect_keyword_is(Keyword::TO)?;
10373                let new_name = self.parse_identifier()?;
10374                AlterTableOperation::RenameConstraint { old_name, new_name }
10375            } else if self.parse_keyword(Keyword::TO) {
10376                let table_name = self.parse_object_name(false)?;
10377                AlterTableOperation::RenameTable {
10378                    table_name: RenameTableNameKind::To(table_name),
10379                }
10380            } else if self.parse_keyword(Keyword::AS) {
10381                let table_name = self.parse_object_name(false)?;
10382                AlterTableOperation::RenameTable {
10383                    table_name: RenameTableNameKind::As(table_name),
10384                }
10385            } else {
10386                let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10387                let old_column_name = self.parse_identifier()?;
10388                self.expect_keyword_is(Keyword::TO)?;
10389                let new_column_name = self.parse_identifier()?;
10390                AlterTableOperation::RenameColumn {
10391                    old_column_name,
10392                    new_column_name,
10393                }
10394            }
10395        } else if self.parse_keyword(Keyword::DISABLE) {
10396            if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10397                AlterTableOperation::DisableRowLevelSecurity {}
10398            } else if self.parse_keyword(Keyword::RULE) {
10399                let name = self.parse_identifier()?;
10400                AlterTableOperation::DisableRule { name }
10401            } else if self.parse_keyword(Keyword::TRIGGER) {
10402                let name = self.parse_identifier()?;
10403                AlterTableOperation::DisableTrigger { name }
10404            } else {
10405                return self.expected_ref(
10406                    "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10407                    self.peek_token_ref(),
10408                );
10409            }
10410        } else if self.parse_keyword(Keyword::ENABLE) {
10411            if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10412                let name = self.parse_identifier()?;
10413                AlterTableOperation::EnableAlwaysRule { name }
10414            } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10415                let name = self.parse_identifier()?;
10416                AlterTableOperation::EnableAlwaysTrigger { name }
10417            } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10418                AlterTableOperation::EnableRowLevelSecurity {}
10419            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10420                let name = self.parse_identifier()?;
10421                AlterTableOperation::EnableReplicaRule { name }
10422            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10423                let name = self.parse_identifier()?;
10424                AlterTableOperation::EnableReplicaTrigger { name }
10425            } else if self.parse_keyword(Keyword::RULE) {
10426                let name = self.parse_identifier()?;
10427                AlterTableOperation::EnableRule { name }
10428            } else if self.parse_keyword(Keyword::TRIGGER) {
10429                let name = self.parse_identifier()?;
10430                AlterTableOperation::EnableTrigger { name }
10431            } else {
10432                return self.expected_ref(
10433                    "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10434                    self.peek_token_ref(),
10435                );
10436            }
10437        } else if self.parse_keywords(&[
10438            Keyword::FORCE,
10439            Keyword::ROW,
10440            Keyword::LEVEL,
10441            Keyword::SECURITY,
10442        ]) {
10443            AlterTableOperation::ForceRowLevelSecurity
10444        } else if self.parse_keywords(&[
10445            Keyword::NO,
10446            Keyword::FORCE,
10447            Keyword::ROW,
10448            Keyword::LEVEL,
10449            Keyword::SECURITY,
10450        ]) {
10451            AlterTableOperation::NoForceRowLevelSecurity
10452        } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10453            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10454        {
10455            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10456            let name = self.parse_identifier()?;
10457            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10458                Some(self.parse_identifier()?)
10459            } else {
10460                None
10461            };
10462            AlterTableOperation::ClearProjection {
10463                if_exists,
10464                name,
10465                partition,
10466            }
10467        } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10468            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10469        {
10470            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10471            let name = self.parse_identifier()?;
10472            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10473                Some(self.parse_identifier()?)
10474            } else {
10475                None
10476            };
10477            AlterTableOperation::MaterializeProjection {
10478                if_exists,
10479                name,
10480                partition,
10481            }
10482        } else if self.parse_keyword(Keyword::DROP) {
10483            if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10484                self.expect_token(&Token::LParen)?;
10485                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10486                self.expect_token(&Token::RParen)?;
10487                AlterTableOperation::DropPartitions {
10488                    partitions,
10489                    if_exists: true,
10490                }
10491            } else if self.parse_keyword(Keyword::PARTITION) {
10492                self.expect_token(&Token::LParen)?;
10493                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10494                self.expect_token(&Token::RParen)?;
10495                AlterTableOperation::DropPartitions {
10496                    partitions,
10497                    if_exists: false,
10498                }
10499            } else if self.parse_keyword(Keyword::CONSTRAINT) {
10500                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10501                let name = self.parse_identifier()?;
10502                let drop_behavior = self.parse_optional_drop_behavior();
10503                AlterTableOperation::DropConstraint {
10504                    if_exists,
10505                    name,
10506                    drop_behavior,
10507                }
10508            } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10509                let drop_behavior = self.parse_optional_drop_behavior();
10510                AlterTableOperation::DropPrimaryKey { drop_behavior }
10511            } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10512                let name = self.parse_identifier()?;
10513                let drop_behavior = self.parse_optional_drop_behavior();
10514                AlterTableOperation::DropForeignKey {
10515                    name,
10516                    drop_behavior,
10517                }
10518            } else if self.parse_keyword(Keyword::INDEX) {
10519                let name = self.parse_identifier()?;
10520                AlterTableOperation::DropIndex { name }
10521            } else if self.parse_keyword(Keyword::PROJECTION)
10522                && dialect_of!(self is ClickHouseDialect|GenericDialect)
10523            {
10524                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10525                let name = self.parse_identifier()?;
10526                AlterTableOperation::DropProjection { if_exists, name }
10527            } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10528                AlterTableOperation::DropClusteringKey
10529            } else {
10530                let has_column_keyword = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10531                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10532                let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10533                    self.parse_comma_separated(Parser::parse_identifier)?
10534                } else {
10535                    vec![self.parse_identifier()?]
10536                };
10537                let drop_behavior = self.parse_optional_drop_behavior();
10538                AlterTableOperation::DropColumn {
10539                    has_column_keyword,
10540                    column_names,
10541                    if_exists,
10542                    drop_behavior,
10543                }
10544            }
10545        } else if self.parse_keyword(Keyword::PARTITION) {
10546            self.expect_token(&Token::LParen)?;
10547            let before = self.parse_comma_separated(Parser::parse_expr)?;
10548            self.expect_token(&Token::RParen)?;
10549            self.expect_keyword_is(Keyword::RENAME)?;
10550            self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10551            self.expect_token(&Token::LParen)?;
10552            let renames = self.parse_comma_separated(Parser::parse_expr)?;
10553            self.expect_token(&Token::RParen)?;
10554            AlterTableOperation::RenamePartitions {
10555                old_partitions: before,
10556                new_partitions: renames,
10557            }
10558        } else if self.parse_keyword(Keyword::CHANGE) {
10559            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10560            let old_name = self.parse_identifier()?;
10561            let new_name = self.parse_identifier()?;
10562            let data_type = self.parse_data_type()?;
10563            let mut options = vec![];
10564            while let Some(option) = self.parse_optional_column_option()? {
10565                options.push(option);
10566            }
10567
10568            let column_position = self.parse_column_position()?;
10569
10570            AlterTableOperation::ChangeColumn {
10571                old_name,
10572                new_name,
10573                data_type,
10574                options,
10575                column_position,
10576            }
10577        } else if self.parse_keyword(Keyword::MODIFY) {
10578            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10579            let col_name = self.parse_identifier()?;
10580            let data_type = self.parse_data_type()?;
10581            let mut options = vec![];
10582            while let Some(option) = self.parse_optional_column_option()? {
10583                options.push(option);
10584            }
10585
10586            let column_position = self.parse_column_position()?;
10587
10588            AlterTableOperation::ModifyColumn {
10589                col_name,
10590                data_type,
10591                options,
10592                column_position,
10593            }
10594        } else if self.parse_keyword(Keyword::ALTER) {
10595            if self.peek_keyword(Keyword::SORTKEY) {
10596                self.prev_token();
10597                return self.parse_alter_sort_key();
10598            }
10599
10600            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10601            let column_name = self.parse_identifier()?;
10602            let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10603
10604            let op: AlterColumnOperation = if self.parse_keywords(&[
10605                Keyword::SET,
10606                Keyword::NOT,
10607                Keyword::NULL,
10608            ]) {
10609                AlterColumnOperation::SetNotNull {}
10610            } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10611                AlterColumnOperation::DropNotNull {}
10612            } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10613                AlterColumnOperation::SetDefault {
10614                    value: self.parse_expr()?,
10615                }
10616            } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10617                AlterColumnOperation::DropDefault {}
10618            } else if self.parse_keywords(&[Keyword::SET, Keyword::STORAGE]) {
10619                let storage = self.parse_column_storage()?;
10620                AlterColumnOperation::SetStorage { storage }
10621            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10622                self.parse_set_data_type(true)?
10623            } else if self.parse_keyword(Keyword::TYPE) {
10624                self.parse_set_data_type(false)?
10625            } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10626                let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10627                    Some(GeneratedAs::Always)
10628                } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10629                    Some(GeneratedAs::ByDefault)
10630                } else {
10631                    None
10632                };
10633
10634                self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10635
10636                let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10637
10638                if self.peek_token_ref().token == Token::LParen {
10639                    self.expect_token(&Token::LParen)?;
10640                    sequence_options = Some(self.parse_create_sequence_options()?);
10641                    self.expect_token(&Token::RParen)?;
10642                }
10643
10644                AlterColumnOperation::AddGenerated {
10645                    generated_as,
10646                    sequence_options,
10647                }
10648            } else {
10649                let message = if is_postgresql {
10650                    "SET/DROP NOT NULL, SET DEFAULT, SET STORAGE, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10651                } else {
10652                    "SET/DROP NOT NULL, SET DEFAULT, SET STORAGE, or SET DATA TYPE after ALTER COLUMN"
10653                };
10654
10655                return self.expected_ref(message, self.peek_token_ref());
10656            };
10657            AlterTableOperation::AlterColumn { column_name, op }
10658        } else if self.parse_keyword(Keyword::SWAP) {
10659            self.expect_keyword_is(Keyword::WITH)?;
10660            let table_name = self.parse_object_name(false)?;
10661            AlterTableOperation::SwapWith { table_name }
10662        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10663            && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10664        {
10665            let new_owner = self.parse_owner()?;
10666            AlterTableOperation::OwnerTo { new_owner }
10667        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10668            && self.parse_keyword(Keyword::ATTACH)
10669        {
10670            AlterTableOperation::AttachPartition {
10671                partition: self.parse_part_or_partition()?,
10672            }
10673        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10674            && self.parse_keyword(Keyword::DETACH)
10675        {
10676            AlterTableOperation::DetachPartition {
10677                partition: self.parse_part_or_partition()?,
10678            }
10679        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10680            && self.parse_keyword(Keyword::FREEZE)
10681        {
10682            let partition = self.parse_part_or_partition()?;
10683            let with_name = if self.parse_keyword(Keyword::WITH) {
10684                self.expect_keyword_is(Keyword::NAME)?;
10685                Some(self.parse_identifier()?)
10686            } else {
10687                None
10688            };
10689            AlterTableOperation::FreezePartition {
10690                partition,
10691                with_name,
10692            }
10693        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10694            && self.parse_keyword(Keyword::UNFREEZE)
10695        {
10696            let partition = self.parse_part_or_partition()?;
10697            let with_name = if self.parse_keyword(Keyword::WITH) {
10698                self.expect_keyword_is(Keyword::NAME)?;
10699                Some(self.parse_identifier()?)
10700            } else {
10701                None
10702            };
10703            AlterTableOperation::UnfreezePartition {
10704                partition,
10705                with_name,
10706            }
10707        } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
10708            self.expect_token(&Token::LParen)?;
10709            let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
10710            self.expect_token(&Token::RParen)?;
10711            AlterTableOperation::ClusterBy { exprs }
10712        } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
10713            AlterTableOperation::SuspendRecluster
10714        } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
10715            AlterTableOperation::ResumeRecluster
10716        } else if self.parse_keyword(Keyword::LOCK) {
10717            let equals = self.consume_token(&Token::Eq);
10718            let lock = match self.parse_one_of_keywords(&[
10719                Keyword::DEFAULT,
10720                Keyword::EXCLUSIVE,
10721                Keyword::NONE,
10722                Keyword::SHARED,
10723            ]) {
10724                Some(Keyword::DEFAULT) => AlterTableLock::Default,
10725                Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
10726                Some(Keyword::NONE) => AlterTableLock::None,
10727                Some(Keyword::SHARED) => AlterTableLock::Shared,
10728                _ => self.expected_ref(
10729                    "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
10730                    self.peek_token_ref(),
10731                )?,
10732            };
10733            AlterTableOperation::Lock { equals, lock }
10734        } else if self.parse_keyword(Keyword::ALGORITHM) {
10735            let equals = self.consume_token(&Token::Eq);
10736            let algorithm = match self.parse_one_of_keywords(&[
10737                Keyword::DEFAULT,
10738                Keyword::INSTANT,
10739                Keyword::INPLACE,
10740                Keyword::COPY,
10741            ]) {
10742                Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
10743                Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
10744                Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
10745                Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
10746                _ => self.expected_ref(
10747                    "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
10748                    self.peek_token_ref(),
10749                )?,
10750            };
10751            AlterTableOperation::Algorithm { equals, algorithm }
10752        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
10753            let equals = self.consume_token(&Token::Eq);
10754            let value = self.parse_number_value()?;
10755            AlterTableOperation::AutoIncrement { equals, value }
10756        } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
10757            let identity = if self.parse_keyword(Keyword::NOTHING) {
10758                ReplicaIdentity::Nothing
10759            } else if self.parse_keyword(Keyword::FULL) {
10760                ReplicaIdentity::Full
10761            } else if self.parse_keyword(Keyword::DEFAULT) {
10762                ReplicaIdentity::Default
10763            } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10764                ReplicaIdentity::Index(self.parse_identifier()?)
10765            } else {
10766                return self.expected_ref(
10767                    "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
10768                    self.peek_token_ref(),
10769                );
10770            };
10771
10772            AlterTableOperation::ReplicaIdentity { identity }
10773        } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
10774            let name = self.parse_identifier()?;
10775            AlterTableOperation::ValidateConstraint { name }
10776        } else {
10777            let mut options =
10778                self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
10779            if !options.is_empty() {
10780                AlterTableOperation::SetTblProperties {
10781                    table_properties: options,
10782                }
10783            } else {
10784                options = self.parse_options(Keyword::SET)?;
10785                if !options.is_empty() {
10786                    AlterTableOperation::SetOptionsParens { options }
10787                } else {
10788                    return self.expected_ref(
10789                    "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
10790                    self.peek_token_ref(),
10791                  );
10792                }
10793            }
10794        };
10795        Ok(operation)
10796    }
10797
10798    fn parse_column_storage(&mut self) -> Result<AlterColumnStorage, ParserError> {
10799        match self.parse_one_of_keywords(&[
10800            Keyword::PLAIN,
10801            Keyword::EXTERNAL,
10802            Keyword::EXTENDED,
10803            Keyword::MAIN,
10804            Keyword::DEFAULT,
10805        ]) {
10806            Some(Keyword::PLAIN) => Ok(AlterColumnStorage::Plain),
10807            Some(Keyword::EXTERNAL) => Ok(AlterColumnStorage::External),
10808            Some(Keyword::EXTENDED) => Ok(AlterColumnStorage::Extended),
10809            Some(Keyword::MAIN) => Ok(AlterColumnStorage::Main),
10810            Some(Keyword::DEFAULT) => Ok(AlterColumnStorage::Default),
10811            _ => self.expected_ref(
10812                "storage value (PLAIN, EXTERNAL, EXTENDED, MAIN, or DEFAULT)",
10813                self.peek_token_ref(),
10814            ),
10815        }
10816    }
10817
10818    fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
10819        let data_type = self.parse_data_type()?;
10820        let using = if self.dialect.supports_alter_column_type_using()
10821            && self.parse_keyword(Keyword::USING)
10822        {
10823            Some(self.parse_expr()?)
10824        } else {
10825            None
10826        };
10827        Ok(AlterColumnOperation::SetDataType {
10828            data_type,
10829            using,
10830            had_set,
10831        })
10832    }
10833
10834    fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
10835        let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
10836        match keyword {
10837            Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
10838            Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
10839            // unreachable because expect_one_of_keywords used above
10840            unexpected_keyword => Err(ParserError::ParserError(
10841                format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
10842            )),
10843        }
10844    }
10845
10846    /// Parse an `ALTER <object>` statement and dispatch to the appropriate alter handler.
10847    pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
10848        let object_type = self.expect_one_of_keywords(&[
10849            Keyword::VIEW,
10850            Keyword::TYPE,
10851            Keyword::COLLATION,
10852            Keyword::TABLE,
10853            Keyword::INDEX,
10854            Keyword::FUNCTION,
10855            Keyword::AGGREGATE,
10856            Keyword::ROLE,
10857            Keyword::POLICY,
10858            Keyword::CONNECTOR,
10859            Keyword::ICEBERG,
10860            Keyword::SCHEMA,
10861            Keyword::USER,
10862            Keyword::OPERATOR,
10863        ])?;
10864        match object_type {
10865            Keyword::SCHEMA => {
10866                self.prev_token();
10867                self.prev_token();
10868                self.parse_alter_schema()
10869            }
10870            Keyword::VIEW => self.parse_alter_view(),
10871            Keyword::TYPE => self.parse_alter_type(),
10872            Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
10873            Keyword::TABLE => self.parse_alter_table(false),
10874            Keyword::ICEBERG => {
10875                self.expect_keyword(Keyword::TABLE)?;
10876                self.parse_alter_table(true)
10877            }
10878            Keyword::INDEX => {
10879                let index_name = self.parse_object_name(false)?;
10880                let operation = if self.parse_keyword(Keyword::RENAME) {
10881                    if self.parse_keyword(Keyword::TO) {
10882                        let index_name = self.parse_object_name(false)?;
10883                        AlterIndexOperation::RenameIndex { index_name }
10884                    } else {
10885                        return self.expected_ref("TO after RENAME", self.peek_token_ref());
10886                    }
10887                } else {
10888                    return self.expected_ref("RENAME after ALTER INDEX", self.peek_token_ref());
10889                };
10890
10891                Ok(Statement::AlterIndex {
10892                    name: index_name,
10893                    operation,
10894                })
10895            }
10896            Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
10897            Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
10898            Keyword::OPERATOR => {
10899                if self.parse_keyword(Keyword::FAMILY) {
10900                    self.parse_alter_operator_family().map(Into::into)
10901                } else if self.parse_keyword(Keyword::CLASS) {
10902                    self.parse_alter_operator_class().map(Into::into)
10903                } else {
10904                    self.parse_alter_operator().map(Into::into)
10905                }
10906            }
10907            Keyword::ROLE => self.parse_alter_role(),
10908            Keyword::POLICY => self.parse_alter_policy().map(Into::into),
10909            Keyword::CONNECTOR => self.parse_alter_connector(),
10910            Keyword::USER => self.parse_alter_user().map(Into::into),
10911            // unreachable because expect_one_of_keywords used above
10912            unexpected_keyword => Err(ParserError::ParserError(
10913                format!("Internal parser error: expected any of {{VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR}}, got {unexpected_keyword:?}"),
10914            )),
10915        }
10916    }
10917
10918    fn parse_alter_aggregate_signature(
10919        &mut self,
10920    ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
10921        let name = self.parse_object_name(false)?;
10922        self.expect_token(&Token::LParen)?;
10923
10924        if self.consume_token(&Token::Mul) {
10925            self.expect_token(&Token::RParen)?;
10926            return Ok((
10927                FunctionDesc {
10928                    name,
10929                    args: Some(vec![]),
10930                },
10931                true,
10932                None,
10933            ));
10934        }
10935
10936        let args =
10937            if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
10938                vec![]
10939            } else {
10940                self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
10941            };
10942
10943        let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
10944            Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
10945        } else {
10946            None
10947        };
10948
10949        self.expect_token(&Token::RParen)?;
10950        Ok((
10951            FunctionDesc {
10952                name,
10953                args: Some(args),
10954            },
10955            false,
10956            aggregate_order_by,
10957        ))
10958    }
10959
10960    fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
10961        let action = if self.parse_keywords(&[
10962            Keyword::CALLED,
10963            Keyword::ON,
10964            Keyword::NULL,
10965            Keyword::INPUT,
10966        ]) {
10967            Some(AlterFunctionAction::CalledOnNull(
10968                FunctionCalledOnNull::CalledOnNullInput,
10969            ))
10970        } else if self.parse_keywords(&[
10971            Keyword::RETURNS,
10972            Keyword::NULL,
10973            Keyword::ON,
10974            Keyword::NULL,
10975            Keyword::INPUT,
10976        ]) {
10977            Some(AlterFunctionAction::CalledOnNull(
10978                FunctionCalledOnNull::ReturnsNullOnNullInput,
10979            ))
10980        } else if self.parse_keyword(Keyword::STRICT) {
10981            Some(AlterFunctionAction::CalledOnNull(
10982                FunctionCalledOnNull::Strict,
10983            ))
10984        } else if self.parse_keyword(Keyword::IMMUTABLE) {
10985            Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
10986        } else if self.parse_keyword(Keyword::STABLE) {
10987            Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
10988        } else if self.parse_keyword(Keyword::VOLATILE) {
10989            Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
10990        } else if self.parse_keyword(Keyword::NOT) {
10991            self.expect_keyword(Keyword::LEAKPROOF)?;
10992            Some(AlterFunctionAction::Leakproof(false))
10993        } else if self.parse_keyword(Keyword::LEAKPROOF) {
10994            Some(AlterFunctionAction::Leakproof(true))
10995        } else if self.parse_keyword(Keyword::EXTERNAL) {
10996            self.expect_keyword(Keyword::SECURITY)?;
10997            let security = if self.parse_keyword(Keyword::DEFINER) {
10998                FunctionSecurity::Definer
10999            } else if self.parse_keyword(Keyword::INVOKER) {
11000                FunctionSecurity::Invoker
11001            } else {
11002                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11003            };
11004            Some(AlterFunctionAction::Security {
11005                external: true,
11006                security,
11007            })
11008        } else if self.parse_keyword(Keyword::SECURITY) {
11009            let security = if self.parse_keyword(Keyword::DEFINER) {
11010                FunctionSecurity::Definer
11011            } else if self.parse_keyword(Keyword::INVOKER) {
11012                FunctionSecurity::Invoker
11013            } else {
11014                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11015            };
11016            Some(AlterFunctionAction::Security {
11017                external: false,
11018                security,
11019            })
11020        } else if self.parse_keyword(Keyword::PARALLEL) {
11021            let parallel = if self.parse_keyword(Keyword::UNSAFE) {
11022                FunctionParallel::Unsafe
11023            } else if self.parse_keyword(Keyword::RESTRICTED) {
11024                FunctionParallel::Restricted
11025            } else if self.parse_keyword(Keyword::SAFE) {
11026                FunctionParallel::Safe
11027            } else {
11028                return self
11029                    .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
11030            };
11031            Some(AlterFunctionAction::Parallel(parallel))
11032        } else if self.parse_keyword(Keyword::COST) {
11033            Some(AlterFunctionAction::Cost(self.parse_number()?))
11034        } else if self.parse_keyword(Keyword::ROWS) {
11035            Some(AlterFunctionAction::Rows(self.parse_number()?))
11036        } else if self.parse_keyword(Keyword::SUPPORT) {
11037            Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
11038        } else if self.parse_keyword(Keyword::SET) {
11039            let name = self.parse_object_name(false)?;
11040            let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
11041                FunctionSetValue::FromCurrent
11042            } else {
11043                if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
11044                    return self.expected_ref("= or TO", self.peek_token_ref());
11045                }
11046                if self.parse_keyword(Keyword::DEFAULT) {
11047                    FunctionSetValue::Default
11048                } else {
11049                    FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
11050                }
11051            };
11052            Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
11053                name,
11054                value,
11055            }))
11056        } else if self.parse_keyword(Keyword::RESET) {
11057            let reset_config = if self.parse_keyword(Keyword::ALL) {
11058                ResetConfig::ALL
11059            } else {
11060                ResetConfig::ConfigName(self.parse_object_name(false)?)
11061            };
11062            Some(AlterFunctionAction::Reset(reset_config))
11063        } else {
11064            None
11065        };
11066
11067        Ok(action)
11068    }
11069
11070    fn parse_alter_function_actions(
11071        &mut self,
11072    ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
11073        let mut actions = vec![];
11074        while let Some(action) = self.parse_alter_function_action()? {
11075            actions.push(action);
11076        }
11077        if actions.is_empty() {
11078            return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
11079        }
11080        let restrict = self.parse_keyword(Keyword::RESTRICT);
11081        Ok((actions, restrict))
11082    }
11083
11084    /// Parse an `ALTER FUNCTION` or `ALTER AGGREGATE` statement.
11085    pub fn parse_alter_function(
11086        &mut self,
11087        kind: AlterFunctionKind,
11088    ) -> Result<Statement, ParserError> {
11089        let (function, aggregate_star, aggregate_order_by) = match kind {
11090            AlterFunctionKind::Function => (self.parse_function_desc()?, false, None),
11091            AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
11092        };
11093
11094        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11095            let new_name = self.parse_identifier()?;
11096            AlterFunctionOperation::RenameTo { new_name }
11097        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11098            AlterFunctionOperation::OwnerTo(self.parse_owner()?)
11099        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11100            AlterFunctionOperation::SetSchema {
11101                schema_name: self.parse_object_name(false)?,
11102            }
11103        } else if matches!(kind, AlterFunctionKind::Function) && self.parse_keyword(Keyword::NO) {
11104            if !self.parse_keyword(Keyword::DEPENDS) {
11105                return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
11106            }
11107            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11108            AlterFunctionOperation::DependsOnExtension {
11109                no: true,
11110                extension_name: self.parse_object_name(false)?,
11111            }
11112        } else if matches!(kind, AlterFunctionKind::Function)
11113            && self.parse_keyword(Keyword::DEPENDS)
11114        {
11115            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11116            AlterFunctionOperation::DependsOnExtension {
11117                no: false,
11118                extension_name: self.parse_object_name(false)?,
11119            }
11120        } else if matches!(kind, AlterFunctionKind::Function) {
11121            let (actions, restrict) = self.parse_alter_function_actions()?;
11122            AlterFunctionOperation::Actions { actions, restrict }
11123        } else {
11124            return self.expected_ref(
11125                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
11126                self.peek_token_ref(),
11127            );
11128        };
11129
11130        Ok(Statement::AlterFunction(AlterFunction {
11131            kind,
11132            function,
11133            aggregate_order_by,
11134            aggregate_star,
11135            operation,
11136        }))
11137    }
11138
11139    /// Parse a [Statement::AlterTable]
11140    pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11141        let r#async = self.parse_keyword(Keyword::ASYNC); // [ ASYNC ] (DSQL)
11142        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11143        let only = self.parse_keyword(Keyword::ONLY); // [ ONLY ]
11144        let table_name = self.parse_object_name(false)?;
11145        let on_cluster = self.parse_optional_on_cluster()?;
11146        let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11147
11148        let mut location = None;
11149        if self.parse_keyword(Keyword::LOCATION) {
11150            location = Some(HiveSetLocation {
11151                has_set: false,
11152                location: self.parse_identifier()?,
11153            });
11154        } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11155            location = Some(HiveSetLocation {
11156                has_set: true,
11157                location: self.parse_identifier()?,
11158            });
11159        }
11160
11161        let end_token = if self.peek_token_ref().token == Token::SemiColon {
11162            self.peek_token_ref().clone()
11163        } else {
11164            self.get_current_token().clone()
11165        };
11166
11167        Ok(AlterTable {
11168            name: table_name,
11169            r#async,
11170            if_exists,
11171            only,
11172            operations,
11173            location,
11174            on_cluster,
11175            table_type: if iceberg {
11176                Some(AlterTableType::Iceberg)
11177            } else {
11178                None
11179            },
11180            end_token: AttachedToken(end_token),
11181        }
11182        .into())
11183    }
11184
11185    /// Parse an `ALTER VIEW` statement.
11186    pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11187        let name = self.parse_object_name(false)?;
11188        let columns = self.parse_parenthesized_column_list(Optional, false)?;
11189
11190        let with_options = self.parse_options(Keyword::WITH)?;
11191
11192        self.expect_keyword_is(Keyword::AS)?;
11193        let query = self.parse_query()?;
11194
11195        Ok(Statement::AlterView {
11196            name,
11197            columns,
11198            query,
11199            with_options,
11200        })
11201    }
11202
11203    /// Parse a [Statement::AlterType]
11204    pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11205        let name = self.parse_object_name(false)?;
11206
11207        if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11208            let new_name = self.parse_identifier()?;
11209            Ok(Statement::AlterType(AlterType {
11210                name,
11211                operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
11212            }))
11213        } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11214            let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11215            let new_enum_value = self.parse_identifier()?;
11216            let position = if self.parse_keyword(Keyword::BEFORE) {
11217                Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11218            } else if self.parse_keyword(Keyword::AFTER) {
11219                Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11220            } else {
11221                None
11222            };
11223
11224            Ok(Statement::AlterType(AlterType {
11225                name,
11226                operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
11227                    if_not_exists,
11228                    value: new_enum_value,
11229                    position,
11230                }),
11231            }))
11232        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11233            let existing_enum_value = self.parse_identifier()?;
11234            self.expect_keyword(Keyword::TO)?;
11235            let new_enum_value = self.parse_identifier()?;
11236
11237            Ok(Statement::AlterType(AlterType {
11238                name,
11239                operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11240                    from: existing_enum_value,
11241                    to: new_enum_value,
11242                }),
11243            }))
11244        } else {
11245            self.expected_ref(
11246                "{RENAME TO | { RENAME | ADD } VALUE}",
11247                self.peek_token_ref(),
11248            )
11249        }
11250    }
11251
11252    /// Parse a [Statement::AlterCollation].
11253    ///
11254    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-altercollation.html)
11255    pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11256        let name = self.parse_object_name(false)?;
11257        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11258            AlterCollationOperation::RenameTo {
11259                new_name: self.parse_identifier()?,
11260            }
11261        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11262            AlterCollationOperation::OwnerTo(self.parse_owner()?)
11263        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11264            AlterCollationOperation::SetSchema {
11265                schema_name: self.parse_object_name(false)?,
11266            }
11267        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11268            AlterCollationOperation::RefreshVersion
11269        } else {
11270            return self.expected_ref(
11271                "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11272                self.peek_token_ref(),
11273            );
11274        };
11275
11276        Ok(AlterCollation { name, operation })
11277    }
11278
11279    /// Parse a [Statement::AlterOperator]
11280    ///
11281    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-alteroperator.html)
11282    pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11283        let name = self.parse_operator_name()?;
11284
11285        // Parse (left_type, right_type)
11286        self.expect_token(&Token::LParen)?;
11287
11288        let left_type = if self.parse_keyword(Keyword::NONE) {
11289            None
11290        } else {
11291            Some(self.parse_data_type()?)
11292        };
11293
11294        self.expect_token(&Token::Comma)?;
11295        let right_type = self.parse_data_type()?;
11296        self.expect_token(&Token::RParen)?;
11297
11298        // Parse the operation
11299        let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11300            let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11301                Owner::CurrentRole
11302            } else if self.parse_keyword(Keyword::CURRENT_USER) {
11303                Owner::CurrentUser
11304            } else if self.parse_keyword(Keyword::SESSION_USER) {
11305                Owner::SessionUser
11306            } else {
11307                Owner::Ident(self.parse_identifier()?)
11308            };
11309            AlterOperatorOperation::OwnerTo(owner)
11310        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11311            let schema_name = self.parse_object_name(false)?;
11312            AlterOperatorOperation::SetSchema { schema_name }
11313        } else if self.parse_keyword(Keyword::SET) {
11314            self.expect_token(&Token::LParen)?;
11315
11316            let mut options = Vec::new();
11317            loop {
11318                let keyword = self.expect_one_of_keywords(&[
11319                    Keyword::RESTRICT,
11320                    Keyword::JOIN,
11321                    Keyword::COMMUTATOR,
11322                    Keyword::NEGATOR,
11323                    Keyword::HASHES,
11324                    Keyword::MERGES,
11325                ])?;
11326
11327                match keyword {
11328                    Keyword::RESTRICT => {
11329                        self.expect_token(&Token::Eq)?;
11330                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11331                            None
11332                        } else {
11333                            Some(self.parse_object_name(false)?)
11334                        };
11335                        options.push(OperatorOption::Restrict(proc_name));
11336                    }
11337                    Keyword::JOIN => {
11338                        self.expect_token(&Token::Eq)?;
11339                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11340                            None
11341                        } else {
11342                            Some(self.parse_object_name(false)?)
11343                        };
11344                        options.push(OperatorOption::Join(proc_name));
11345                    }
11346                    Keyword::COMMUTATOR => {
11347                        self.expect_token(&Token::Eq)?;
11348                        let op_name = self.parse_operator_name()?;
11349                        options.push(OperatorOption::Commutator(op_name));
11350                    }
11351                    Keyword::NEGATOR => {
11352                        self.expect_token(&Token::Eq)?;
11353                        let op_name = self.parse_operator_name()?;
11354                        options.push(OperatorOption::Negator(op_name));
11355                    }
11356                    Keyword::HASHES => {
11357                        options.push(OperatorOption::Hashes);
11358                    }
11359                    Keyword::MERGES => {
11360                        options.push(OperatorOption::Merges);
11361                    }
11362                    unexpected_keyword => return Err(ParserError::ParserError(
11363                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11364                    )),
11365                }
11366
11367                if !self.consume_token(&Token::Comma) {
11368                    break;
11369                }
11370            }
11371
11372            self.expect_token(&Token::RParen)?;
11373            AlterOperatorOperation::Set { options }
11374        } else {
11375            return self.expected_ref(
11376                "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11377                self.peek_token_ref(),
11378            );
11379        };
11380
11381        Ok(AlterOperator {
11382            name,
11383            left_type,
11384            right_type,
11385            operation,
11386        })
11387    }
11388
11389    /// Parse an operator item for ALTER OPERATOR FAMILY ADD operations
11390    fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11391        let strategy_number = self.parse_literal_uint()?;
11392        let operator_name = self.parse_operator_name()?;
11393
11394        // Operator argument types (required for ALTER OPERATOR FAMILY)
11395        self.expect_token(&Token::LParen)?;
11396        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11397        self.expect_token(&Token::RParen)?;
11398
11399        // Optional purpose
11400        let purpose = if self.parse_keyword(Keyword::FOR) {
11401            if self.parse_keyword(Keyword::SEARCH) {
11402                Some(OperatorPurpose::ForSearch)
11403            } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11404                let sort_family = self.parse_object_name(false)?;
11405                Some(OperatorPurpose::ForOrderBy { sort_family })
11406            } else {
11407                return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11408            }
11409        } else {
11410            None
11411        };
11412
11413        Ok(OperatorFamilyItem::Operator {
11414            strategy_number,
11415            operator_name,
11416            op_types,
11417            purpose,
11418        })
11419    }
11420
11421    /// Parse a function item for ALTER OPERATOR FAMILY ADD operations
11422    fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11423        let support_number = self.parse_literal_uint()?;
11424
11425        // Optional operator types
11426        let op_types =
11427            if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
11428                let types = self.parse_comma_separated(Parser::parse_data_type)?;
11429                self.expect_token(&Token::RParen)?;
11430                Some(types)
11431            } else if self.consume_token(&Token::LParen) {
11432                self.expect_token(&Token::RParen)?;
11433                Some(vec![])
11434            } else {
11435                None
11436            };
11437
11438        let function_name = self.parse_object_name(false)?;
11439
11440        // Function argument types
11441        let argument_types = if self.consume_token(&Token::LParen) {
11442            if self.peek_token_ref().token == Token::RParen {
11443                self.expect_token(&Token::RParen)?;
11444                vec![]
11445            } else {
11446                let types = self.parse_comma_separated(Parser::parse_data_type)?;
11447                self.expect_token(&Token::RParen)?;
11448                types
11449            }
11450        } else {
11451            vec![]
11452        };
11453
11454        Ok(OperatorFamilyItem::Function {
11455            support_number,
11456            op_types,
11457            function_name,
11458            argument_types,
11459        })
11460    }
11461
11462    /// Parse an operator item for ALTER OPERATOR FAMILY DROP operations
11463    fn parse_operator_family_drop_operator(
11464        &mut self,
11465    ) -> Result<OperatorFamilyDropItem, ParserError> {
11466        let strategy_number = self.parse_literal_uint()?;
11467
11468        // Operator argument types (required for DROP)
11469        self.expect_token(&Token::LParen)?;
11470        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11471        self.expect_token(&Token::RParen)?;
11472
11473        Ok(OperatorFamilyDropItem::Operator {
11474            strategy_number,
11475            op_types,
11476        })
11477    }
11478
11479    /// Parse a function item for ALTER OPERATOR FAMILY DROP operations
11480    fn parse_operator_family_drop_function(
11481        &mut self,
11482    ) -> Result<OperatorFamilyDropItem, ParserError> {
11483        let support_number = self.parse_literal_uint()?;
11484
11485        // Operator types (required for DROP)
11486        self.expect_token(&Token::LParen)?;
11487        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11488        self.expect_token(&Token::RParen)?;
11489
11490        Ok(OperatorFamilyDropItem::Function {
11491            support_number,
11492            op_types,
11493        })
11494    }
11495
11496    /// Parse an operator family item for ADD operations (dispatches to operator or function parsing)
11497    fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11498        if self.parse_keyword(Keyword::OPERATOR) {
11499            self.parse_operator_family_add_operator()
11500        } else if self.parse_keyword(Keyword::FUNCTION) {
11501            self.parse_operator_family_add_function()
11502        } else {
11503            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11504        }
11505    }
11506
11507    /// Parse an operator family item for DROP operations (dispatches to operator or function parsing)
11508    fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
11509        if self.parse_keyword(Keyword::OPERATOR) {
11510            self.parse_operator_family_drop_operator()
11511        } else if self.parse_keyword(Keyword::FUNCTION) {
11512            self.parse_operator_family_drop_function()
11513        } else {
11514            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11515        }
11516    }
11517
11518    /// Parse a [Statement::AlterOperatorFamily]
11519    /// See <https://www.postgresql.org/docs/current/sql-alteropfamily.html>
11520    pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
11521        let name = self.parse_object_name(false)?;
11522        self.expect_keyword(Keyword::USING)?;
11523        let using = self.parse_identifier()?;
11524
11525        let operation = if self.parse_keyword(Keyword::ADD) {
11526            let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
11527            AlterOperatorFamilyOperation::Add { items }
11528        } else if self.parse_keyword(Keyword::DROP) {
11529            let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
11530            AlterOperatorFamilyOperation::Drop { items }
11531        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11532            let new_name = self.parse_object_name(false)?;
11533            AlterOperatorFamilyOperation::RenameTo { new_name }
11534        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11535            let owner = self.parse_owner()?;
11536            AlterOperatorFamilyOperation::OwnerTo(owner)
11537        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11538            let schema_name = self.parse_object_name(false)?;
11539            AlterOperatorFamilyOperation::SetSchema { schema_name }
11540        } else {
11541            return self.expected_ref(
11542                "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
11543                self.peek_token_ref(),
11544            );
11545        };
11546
11547        Ok(AlterOperatorFamily {
11548            name,
11549            using,
11550            operation,
11551        })
11552    }
11553
11554    /// Parse an `ALTER OPERATOR CLASS` statement.
11555    ///
11556    /// Handles operations like `RENAME TO`, `OWNER TO`, and `SET SCHEMA`.
11557    pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
11558        let name = self.parse_object_name(false)?;
11559        self.expect_keyword(Keyword::USING)?;
11560        let using = self.parse_identifier()?;
11561
11562        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11563            let new_name = self.parse_object_name(false)?;
11564            AlterOperatorClassOperation::RenameTo { new_name }
11565        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11566            let owner = self.parse_owner()?;
11567            AlterOperatorClassOperation::OwnerTo(owner)
11568        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11569            let schema_name = self.parse_object_name(false)?;
11570            AlterOperatorClassOperation::SetSchema { schema_name }
11571        } else {
11572            return self.expected_ref(
11573                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
11574                self.peek_token_ref(),
11575            );
11576        };
11577
11578        Ok(AlterOperatorClass {
11579            name,
11580            using,
11581            operation,
11582        })
11583    }
11584
11585    /// Parse an `ALTER SCHEMA` statement.
11586    ///
11587    /// Supports operations such as setting options, renaming, adding/dropping replicas, and changing owner.
11588    pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
11589        self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
11590        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11591        let name = self.parse_object_name(false)?;
11592        let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
11593            self.prev_token();
11594            let options = self.parse_options(Keyword::OPTIONS)?;
11595            AlterSchemaOperation::SetOptionsParens { options }
11596        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
11597            let collate = self.parse_expr()?;
11598            AlterSchemaOperation::SetDefaultCollate { collate }
11599        } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
11600            let replica = self.parse_identifier()?;
11601            let options = if self.peek_keyword(Keyword::OPTIONS) {
11602                Some(self.parse_options(Keyword::OPTIONS)?)
11603            } else {
11604                None
11605            };
11606            AlterSchemaOperation::AddReplica { replica, options }
11607        } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
11608            let replica = self.parse_identifier()?;
11609            AlterSchemaOperation::DropReplica { replica }
11610        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11611            let new_name = self.parse_object_name(false)?;
11612            AlterSchemaOperation::Rename { name: new_name }
11613        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11614            let owner = self.parse_owner()?;
11615            AlterSchemaOperation::OwnerTo { owner }
11616        } else {
11617            return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
11618        };
11619        Ok(Statement::AlterSchema(AlterSchema {
11620            name,
11621            if_exists,
11622            operations: vec![operation],
11623        }))
11624    }
11625
11626    /// Parse a `CALL procedure_name(arg1, arg2, ...)`
11627    /// or `CALL procedure_name` statement
11628    pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
11629        let object_name = self.parse_object_name(false)?;
11630        if self.peek_token_ref().token == Token::LParen {
11631            match self.parse_function(object_name)? {
11632                Expr::Function(f) => Ok(Statement::Call(f)),
11633                other => parser_err!(
11634                    format!("Expected a simple procedure call but found: {other}"),
11635                    self.peek_token_ref().span.start
11636                ),
11637            }
11638        } else {
11639            Ok(Statement::Call(Function {
11640                name: object_name,
11641                uses_odbc_syntax: false,
11642                parameters: FunctionArguments::None,
11643                args: FunctionArguments::None,
11644                over: None,
11645                filter: None,
11646                null_treatment: None,
11647                within_group: vec![],
11648            }))
11649        }
11650    }
11651
11652    /// Parse a copy statement
11653    pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
11654        let source;
11655        if self.consume_token(&Token::LParen) {
11656            source = CopySource::Query(self.parse_query()?);
11657            self.expect_token(&Token::RParen)?;
11658        } else {
11659            let table_name = self.parse_object_name(false)?;
11660            let columns = self.parse_parenthesized_column_list(Optional, false)?;
11661            source = CopySource::Table {
11662                table_name,
11663                columns,
11664            };
11665        }
11666        let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
11667            Some(Keyword::FROM) => false,
11668            Some(Keyword::TO) => true,
11669            _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
11670        };
11671        if !to {
11672            // Use a separate if statement to prevent Rust compiler from complaining about
11673            // "if statement in this position is unstable: https://github.com/rust-lang/rust/issues/53667"
11674            if let CopySource::Query(_) = source {
11675                return Err(ParserError::ParserError(
11676                    "COPY ... FROM does not support query as a source".to_string(),
11677                ));
11678            }
11679        }
11680        let target = if self.parse_keyword(Keyword::STDIN) {
11681            CopyTarget::Stdin
11682        } else if self.parse_keyword(Keyword::STDOUT) {
11683            CopyTarget::Stdout
11684        } else if self.parse_keyword(Keyword::PROGRAM) {
11685            CopyTarget::Program {
11686                command: self.parse_literal_string()?,
11687            }
11688        } else {
11689            CopyTarget::File {
11690                filename: self.parse_literal_string()?,
11691            }
11692        };
11693        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
11694        let mut options = vec![];
11695        if self.consume_token(&Token::LParen) {
11696            options = self.parse_comma_separated(Parser::parse_copy_option)?;
11697            self.expect_token(&Token::RParen)?;
11698        }
11699        let mut legacy_options = vec![];
11700        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
11701            legacy_options.push(opt);
11702        }
11703        let values =
11704            if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
11705                self.expect_token(&Token::SemiColon)?;
11706                self.parse_tsv()
11707            } else {
11708                vec![]
11709            };
11710        Ok(Statement::Copy {
11711            source,
11712            to,
11713            target,
11714            options,
11715            legacy_options,
11716            values,
11717        })
11718    }
11719
11720    /// Parse [Statement::Open]
11721    fn parse_open(&mut self) -> Result<Statement, ParserError> {
11722        self.expect_keyword(Keyword::OPEN)?;
11723        Ok(Statement::Open(OpenStatement {
11724            cursor_name: self.parse_identifier()?,
11725        }))
11726    }
11727
11728    /// Parse a `CLOSE` cursor statement.
11729    pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
11730        let cursor = if self.parse_keyword(Keyword::ALL) {
11731            CloseCursor::All
11732        } else {
11733            let name = self.parse_identifier()?;
11734
11735            CloseCursor::Specific { name }
11736        };
11737
11738        Ok(Statement::Close { cursor })
11739    }
11740
11741    fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
11742        let ret = match self.parse_one_of_keywords(&[
11743            Keyword::FORMAT,
11744            Keyword::FREEZE,
11745            Keyword::DELIMITER,
11746            Keyword::NULL,
11747            Keyword::HEADER,
11748            Keyword::QUOTE,
11749            Keyword::ESCAPE,
11750            Keyword::FORCE_QUOTE,
11751            Keyword::FORCE_NOT_NULL,
11752            Keyword::FORCE_NULL,
11753            Keyword::ENCODING,
11754        ]) {
11755            Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
11756            Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
11757                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11758                Some(Keyword::FALSE)
11759            )),
11760            Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
11761            Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
11762            Some(Keyword::HEADER) => CopyOption::Header(!matches!(
11763                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11764                Some(Keyword::FALSE)
11765            )),
11766            Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
11767            Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
11768            Some(Keyword::FORCE_QUOTE) => {
11769                CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
11770            }
11771            Some(Keyword::FORCE_NOT_NULL) => {
11772                CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11773            }
11774            Some(Keyword::FORCE_NULL) => {
11775                CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11776            }
11777            Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
11778            _ => self.expected_ref("option", self.peek_token_ref())?,
11779        };
11780        Ok(ret)
11781    }
11782
11783    fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
11784        // FORMAT \[ AS \] is optional
11785        if self.parse_keyword(Keyword::FORMAT) {
11786            let _ = self.parse_keyword(Keyword::AS);
11787        }
11788
11789        let ret = match self.parse_one_of_keywords(&[
11790            Keyword::ACCEPTANYDATE,
11791            Keyword::ACCEPTINVCHARS,
11792            Keyword::ADDQUOTES,
11793            Keyword::ALLOWOVERWRITE,
11794            Keyword::BINARY,
11795            Keyword::BLANKSASNULL,
11796            Keyword::BZIP2,
11797            Keyword::CLEANPATH,
11798            Keyword::COMPUPDATE,
11799            Keyword::CREDENTIALS,
11800            Keyword::CSV,
11801            Keyword::DATEFORMAT,
11802            Keyword::DELIMITER,
11803            Keyword::EMPTYASNULL,
11804            Keyword::ENCRYPTED,
11805            Keyword::ESCAPE,
11806            Keyword::EXTENSION,
11807            Keyword::FIXEDWIDTH,
11808            Keyword::GZIP,
11809            Keyword::HEADER,
11810            Keyword::IAM_ROLE,
11811            Keyword::IGNOREHEADER,
11812            Keyword::JSON,
11813            Keyword::MANIFEST,
11814            Keyword::MAXFILESIZE,
11815            Keyword::NULL,
11816            Keyword::PARALLEL,
11817            Keyword::PARQUET,
11818            Keyword::PARTITION,
11819            Keyword::REGION,
11820            Keyword::REMOVEQUOTES,
11821            Keyword::ROWGROUPSIZE,
11822            Keyword::STATUPDATE,
11823            Keyword::TIMEFORMAT,
11824            Keyword::TRUNCATECOLUMNS,
11825            Keyword::ZSTD,
11826        ]) {
11827            Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
11828            Some(Keyword::ACCEPTINVCHARS) => {
11829                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
11830                let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11831                    Some(self.parse_literal_string()?)
11832                } else {
11833                    None
11834                };
11835                CopyLegacyOption::AcceptInvChars(ch)
11836            }
11837            Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
11838            Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
11839            Some(Keyword::BINARY) => CopyLegacyOption::Binary,
11840            Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
11841            Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
11842            Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
11843            Some(Keyword::COMPUPDATE) => {
11844                let preset = self.parse_keyword(Keyword::PRESET);
11845                let enabled = match self.parse_one_of_keywords(&[
11846                    Keyword::TRUE,
11847                    Keyword::FALSE,
11848                    Keyword::ON,
11849                    Keyword::OFF,
11850                ]) {
11851                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11852                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11853                    _ => None,
11854                };
11855                CopyLegacyOption::CompUpdate { preset, enabled }
11856            }
11857            Some(Keyword::CREDENTIALS) => {
11858                CopyLegacyOption::Credentials(self.parse_literal_string()?)
11859            }
11860            Some(Keyword::CSV) => CopyLegacyOption::Csv({
11861                let mut opts = vec![];
11862                while let Some(opt) =
11863                    self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
11864                {
11865                    opts.push(opt);
11866                }
11867                opts
11868            }),
11869            Some(Keyword::DATEFORMAT) => {
11870                let _ = self.parse_keyword(Keyword::AS);
11871                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11872                    Some(self.parse_literal_string()?)
11873                } else {
11874                    None
11875                };
11876                CopyLegacyOption::DateFormat(fmt)
11877            }
11878            Some(Keyword::DELIMITER) => {
11879                let _ = self.parse_keyword(Keyword::AS);
11880                CopyLegacyOption::Delimiter(self.parse_literal_char()?)
11881            }
11882            Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
11883            Some(Keyword::ENCRYPTED) => {
11884                let auto = self.parse_keyword(Keyword::AUTO);
11885                CopyLegacyOption::Encrypted { auto }
11886            }
11887            Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
11888            Some(Keyword::EXTENSION) => {
11889                let ext = self.parse_literal_string()?;
11890                CopyLegacyOption::Extension(ext)
11891            }
11892            Some(Keyword::FIXEDWIDTH) => {
11893                let spec = self.parse_literal_string()?;
11894                CopyLegacyOption::FixedWidth(spec)
11895            }
11896            Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
11897            Some(Keyword::HEADER) => CopyLegacyOption::Header,
11898            Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
11899            Some(Keyword::IGNOREHEADER) => {
11900                let _ = self.parse_keyword(Keyword::AS);
11901                let num_rows = self.parse_literal_uint()?;
11902                CopyLegacyOption::IgnoreHeader(num_rows)
11903            }
11904            Some(Keyword::JSON) => {
11905                let _ = self.parse_keyword(Keyword::AS);
11906                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11907                    Some(self.parse_literal_string()?)
11908                } else {
11909                    None
11910                };
11911                CopyLegacyOption::Json(fmt)
11912            }
11913            Some(Keyword::MANIFEST) => {
11914                let verbose = self.parse_keyword(Keyword::VERBOSE);
11915                CopyLegacyOption::Manifest { verbose }
11916            }
11917            Some(Keyword::MAXFILESIZE) => {
11918                let _ = self.parse_keyword(Keyword::AS);
11919                let size = self.parse_number_value()?;
11920                let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11921                    Some(Keyword::MB) => Some(FileSizeUnit::MB),
11922                    Some(Keyword::GB) => Some(FileSizeUnit::GB),
11923                    _ => None,
11924                };
11925                CopyLegacyOption::MaxFileSize(FileSize { size, unit })
11926            }
11927            Some(Keyword::NULL) => {
11928                let _ = self.parse_keyword(Keyword::AS);
11929                CopyLegacyOption::Null(self.parse_literal_string()?)
11930            }
11931            Some(Keyword::PARALLEL) => {
11932                let enabled = match self.parse_one_of_keywords(&[
11933                    Keyword::TRUE,
11934                    Keyword::FALSE,
11935                    Keyword::ON,
11936                    Keyword::OFF,
11937                ]) {
11938                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11939                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11940                    _ => None,
11941                };
11942                CopyLegacyOption::Parallel(enabled)
11943            }
11944            Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
11945            Some(Keyword::PARTITION) => {
11946                self.expect_keyword(Keyword::BY)?;
11947                let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
11948                let include = self.parse_keyword(Keyword::INCLUDE);
11949                CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
11950            }
11951            Some(Keyword::REGION) => {
11952                let _ = self.parse_keyword(Keyword::AS);
11953                let region = self.parse_literal_string()?;
11954                CopyLegacyOption::Region(region)
11955            }
11956            Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
11957            Some(Keyword::ROWGROUPSIZE) => {
11958                let _ = self.parse_keyword(Keyword::AS);
11959                let file_size = self.parse_file_size()?;
11960                CopyLegacyOption::RowGroupSize(file_size)
11961            }
11962            Some(Keyword::STATUPDATE) => {
11963                let enabled = match self.parse_one_of_keywords(&[
11964                    Keyword::TRUE,
11965                    Keyword::FALSE,
11966                    Keyword::ON,
11967                    Keyword::OFF,
11968                ]) {
11969                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11970                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11971                    _ => None,
11972                };
11973                CopyLegacyOption::StatUpdate(enabled)
11974            }
11975            Some(Keyword::TIMEFORMAT) => {
11976                let _ = self.parse_keyword(Keyword::AS);
11977                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11978                    Some(self.parse_literal_string()?)
11979                } else {
11980                    None
11981                };
11982                CopyLegacyOption::TimeFormat(fmt)
11983            }
11984            Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
11985            Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
11986            _ => self.expected_ref("option", self.peek_token_ref())?,
11987        };
11988        Ok(ret)
11989    }
11990
11991    fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
11992        let size = self.parse_number_value()?;
11993        let unit = self.maybe_parse_file_size_unit();
11994        Ok(FileSize { size, unit })
11995    }
11996
11997    fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
11998        match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11999            Some(Keyword::MB) => Some(FileSizeUnit::MB),
12000            Some(Keyword::GB) => Some(FileSizeUnit::GB),
12001            _ => None,
12002        }
12003    }
12004
12005    fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
12006        if self.parse_keyword(Keyword::DEFAULT) {
12007            Ok(IamRoleKind::Default)
12008        } else {
12009            let arn = self.parse_literal_string()?;
12010            Ok(IamRoleKind::Arn(arn))
12011        }
12012    }
12013
12014    fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
12015        let ret = match self.parse_one_of_keywords(&[
12016            Keyword::HEADER,
12017            Keyword::QUOTE,
12018            Keyword::ESCAPE,
12019            Keyword::FORCE,
12020        ]) {
12021            Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
12022            Some(Keyword::QUOTE) => {
12023                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12024                CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
12025            }
12026            Some(Keyword::ESCAPE) => {
12027                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12028                CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
12029            }
12030            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
12031                CopyLegacyCsvOption::ForceNotNull(
12032                    self.parse_comma_separated(|p| p.parse_identifier())?,
12033                )
12034            }
12035            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
12036                CopyLegacyCsvOption::ForceQuote(
12037                    self.parse_comma_separated(|p| p.parse_identifier())?,
12038                )
12039            }
12040            _ => self.expected_ref("csv option", self.peek_token_ref())?,
12041        };
12042        Ok(ret)
12043    }
12044
12045    fn parse_literal_char(&mut self) -> Result<char, ParserError> {
12046        let s = self.parse_literal_string()?;
12047        if s.len() != 1 {
12048            let loc = self
12049                .tokens
12050                .get(self.index - 1)
12051                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
12052            return parser_err!(format!("Expect a char, found {s:?}"), loc);
12053        }
12054        Ok(s.chars().next().unwrap())
12055    }
12056
12057    /// Parse a tab separated values in
12058    /// COPY payload
12059    pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
12060        self.parse_tab_value()
12061    }
12062
12063    /// Parse a single tab-separated value row used by `COPY` payload parsing.
12064    pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
12065        let mut values = vec![];
12066        let mut content = String::new();
12067        while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
12068            match t {
12069                Token::Whitespace(Whitespace::Tab) => {
12070                    values.push(Some(core::mem::take(&mut content)));
12071                }
12072                Token::Whitespace(Whitespace::Newline) => {
12073                    values.push(Some(core::mem::take(&mut content)));
12074                }
12075                Token::Backslash => {
12076                    if self.consume_token(&Token::Period) {
12077                        return values;
12078                    }
12079                    if let Token::Word(w) = self.next_token().token {
12080                        if w.value == "N" {
12081                            values.push(None);
12082                        }
12083                    }
12084                }
12085                _ => {
12086                    content.push_str(&t.to_string());
12087                }
12088            }
12089        }
12090        values
12091    }
12092
12093    /// Parse a literal value (numbers, strings, date/time, booleans)
12094    pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12095        let next_token = self.next_token();
12096        let span = next_token.span;
12097        let ok_value = |value: Value| Ok(value.with_span(span));
12098        match next_token.token {
12099            Token::Word(w) => match w.keyword {
12100                Keyword::TRUE if self.dialect.supports_boolean_literals() => {
12101                    ok_value(Value::Boolean(true))
12102                }
12103                Keyword::FALSE if self.dialect.supports_boolean_literals() => {
12104                    ok_value(Value::Boolean(false))
12105                }
12106                Keyword::NULL => ok_value(Value::Null),
12107                Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
12108                    Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
12109                    Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
12110                    _ => self.expected(
12111                        "A value?",
12112                        TokenWithSpan {
12113                            token: Token::Word(w),
12114                            span,
12115                        },
12116                    )?,
12117                },
12118                _ => self.expected(
12119                    "a concrete value",
12120                    TokenWithSpan {
12121                        token: Token::Word(w),
12122                        span,
12123                    },
12124                ),
12125            },
12126            // The call to n.parse() returns a bigdecimal when the
12127            // bigdecimal feature is enabled, and is otherwise a no-op
12128            // (i.e., it returns the input string).
12129            Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
12130            Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12131                self.maybe_concat_string_literal(s.to_string()),
12132            )),
12133            Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12134                self.maybe_concat_string_literal(s.to_string()),
12135            )),
12136            Token::TripleSingleQuotedString(ref s) => {
12137                ok_value(Value::TripleSingleQuotedString(s.to_string()))
12138            }
12139            Token::TripleDoubleQuotedString(ref s) => {
12140                ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12141            }
12142            Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12143            Token::SingleQuotedByteStringLiteral(ref s) => {
12144                ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12145            }
12146            Token::DoubleQuotedByteStringLiteral(ref s) => {
12147                ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12148            }
12149            Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12150                ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12151            }
12152            Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12153                ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12154            }
12155            Token::SingleQuotedRawStringLiteral(ref s) => {
12156                ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12157            }
12158            Token::DoubleQuotedRawStringLiteral(ref s) => {
12159                ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12160            }
12161            Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12162                ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12163            }
12164            Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12165                ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12166            }
12167            Token::NationalStringLiteral(ref s) => {
12168                ok_value(Value::NationalStringLiteral(s.to_string()))
12169            }
12170            Token::QuoteDelimitedStringLiteral(v) => {
12171                ok_value(Value::QuoteDelimitedStringLiteral(v))
12172            }
12173            Token::NationalQuoteDelimitedStringLiteral(v) => {
12174                ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12175            }
12176            Token::EscapedStringLiteral(ref s) => {
12177                ok_value(Value::EscapedStringLiteral(s.to_string()))
12178            }
12179            Token::UnicodeStringLiteral(ref s) => {
12180                ok_value(Value::UnicodeStringLiteral(s.to_string()))
12181            }
12182            Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12183            Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12184            tok @ Token::Colon | tok @ Token::AtSign => {
12185                // 1. Not calling self.parse_identifier(false)?
12186                //    because only in placeholder we want to check
12187                //    numbers as idfentifies.  This because snowflake
12188                //    allows numbers as placeholders
12189                // 2. Not calling self.next_token() to enforce `tok`
12190                //    be followed immediately by a word/number, ie.
12191                //    without any whitespace in between
12192                let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12193                let ident = match next_token.token {
12194                    Token::Word(w) => Ok(w.into_ident(next_token.span)),
12195                    Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12196                    _ => self.expected("placeholder", next_token),
12197                }?;
12198                Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12199                    .with_span(Span::new(span.start, ident.span.end)))
12200            }
12201            unexpected => self.expected(
12202                "a value",
12203                TokenWithSpan {
12204                    token: unexpected,
12205                    span,
12206                },
12207            ),
12208        }
12209    }
12210
12211    fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12212        if self.dialect.supports_string_literal_concatenation() {
12213            while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12214                self.peek_token_ref().token
12215            {
12216                str.push_str(s);
12217                self.advance_token();
12218            }
12219        } else if self
12220            .dialect
12221            .supports_string_literal_concatenation_with_newline()
12222        {
12223            // We are iterating over tokens including whitespaces, to identify
12224            // string literals separated by newlines so we can concatenate them.
12225            let mut after_newline = false;
12226            loop {
12227                match self.peek_token_no_skip().token {
12228                    Token::Whitespace(Whitespace::Newline) => {
12229                        after_newline = true;
12230                        self.next_token_no_skip();
12231                    }
12232                    Token::Whitespace(_) => {
12233                        self.next_token_no_skip();
12234                    }
12235                    Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12236                        if after_newline =>
12237                    {
12238                        str.push_str(s.clone().as_str());
12239                        self.next_token_no_skip();
12240                        after_newline = false;
12241                    }
12242                    _ => break,
12243                }
12244            }
12245        }
12246
12247        str
12248    }
12249
12250    /// Parse an unsigned numeric literal
12251    pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12252        let value_wrapper = self.parse_value()?;
12253        match &value_wrapper.value {
12254            Value::Number(_, _) => Ok(value_wrapper),
12255            Value::Placeholder(_) => Ok(value_wrapper),
12256            _ => {
12257                self.prev_token();
12258                self.expected_ref("literal number", self.peek_token_ref())
12259            }
12260        }
12261    }
12262
12263    /// Parse a numeric literal as an expression. Returns a [`Expr::UnaryOp`] if the number is signed,
12264    /// otherwise returns a [`Expr::Value`]
12265    pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12266        let next_token = self.next_token();
12267        match next_token.token {
12268            Token::Plus => Ok(Expr::UnaryOp {
12269                op: UnaryOperator::Plus,
12270                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12271            }),
12272            Token::Minus => Ok(Expr::UnaryOp {
12273                op: UnaryOperator::Minus,
12274                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12275            }),
12276            _ => {
12277                self.prev_token();
12278                Ok(Expr::Value(self.parse_number_value()?))
12279            }
12280        }
12281    }
12282
12283    fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12284        let next_token = self.next_token();
12285        let span = next_token.span;
12286        match next_token.token {
12287            Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12288                Value::SingleQuotedString(s.to_string()).with_span(span),
12289            )),
12290            Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12291                Value::DoubleQuotedString(s.to_string()).with_span(span),
12292            )),
12293            Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12294                Value::HexStringLiteral(s.to_string()).with_span(span),
12295            )),
12296            unexpected => self.expected(
12297                "a string value",
12298                TokenWithSpan {
12299                    token: unexpected,
12300                    span,
12301                },
12302            ),
12303        }
12304    }
12305
12306    /// Parse an unsigned literal integer/long
12307    pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12308        let next_token = self.next_token();
12309        match next_token.token {
12310            Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12311            _ => self.expected("literal int", next_token),
12312        }
12313    }
12314
12315    /// Parse the body of a `CREATE FUNCTION` specified as a string.
12316    /// e.g. `CREATE FUNCTION ... AS $$ body $$`.
12317    fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12318        let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12319            let peek_token = parser.peek_token();
12320            let span = peek_token.span;
12321            match peek_token.token {
12322                Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12323                {
12324                    parser.next_token();
12325                    Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12326                }
12327                _ => Ok(Expr::Value(
12328                    Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12329                )),
12330            }
12331        };
12332
12333        Ok(CreateFunctionBody::AsBeforeOptions {
12334            body: parse_string_expr(self)?,
12335            link_symbol: if self.consume_token(&Token::Comma) {
12336                Some(parse_string_expr(self)?)
12337            } else {
12338                None
12339            },
12340        })
12341    }
12342
12343    /// Parse a literal string
12344    pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12345        let next_token = self.next_token();
12346        match next_token.token {
12347            Token::Word(Word {
12348                value,
12349                keyword: Keyword::NoKeyword,
12350                ..
12351            }) => Ok(value),
12352            Token::SingleQuotedString(s) => Ok(s),
12353            Token::DoubleQuotedString(s) => Ok(s),
12354            Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12355                Ok(s)
12356            }
12357            Token::UnicodeStringLiteral(s) => Ok(s),
12358            _ => self.expected("literal string", next_token),
12359        }
12360    }
12361
12362    /// Parse a boolean string
12363    pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12364        match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12365            Some(Keyword::TRUE) => Ok(true),
12366            Some(Keyword::FALSE) => Ok(false),
12367            _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12368        }
12369    }
12370
12371    /// Parse a literal unicode normalization clause
12372    pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12373        let neg = self.parse_keyword(Keyword::NOT);
12374        let normalized_form = self.maybe_parse(|parser| {
12375            match parser.parse_one_of_keywords(&[
12376                Keyword::NFC,
12377                Keyword::NFD,
12378                Keyword::NFKC,
12379                Keyword::NFKD,
12380            ]) {
12381                Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12382                Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12383                Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12384                Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12385                _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12386            }
12387        })?;
12388        if self.parse_keyword(Keyword::NORMALIZED) {
12389            return Ok(Expr::IsNormalized {
12390                expr: Box::new(expr),
12391                form: normalized_form,
12392                negated: neg,
12393            });
12394        }
12395        self.expected_ref("unicode normalization form", self.peek_token_ref())
12396    }
12397
12398    /// Parse parenthesized enum members, used with `ENUM(...)` type definitions.
12399    pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12400        self.expect_token(&Token::LParen)?;
12401        let values = self.parse_comma_separated(|parser| {
12402            let name = parser.parse_literal_string()?;
12403            let e = if parser.consume_token(&Token::Eq) {
12404                let value = parser.parse_number()?;
12405                EnumMember::NamedValue(name, value)
12406            } else {
12407                EnumMember::Name(name)
12408            };
12409            Ok(e)
12410        })?;
12411        self.expect_token(&Token::RParen)?;
12412
12413        Ok(values)
12414    }
12415
12416    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
12417    pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
12418        let (ty, trailing_bracket) = self.parse_data_type_helper()?;
12419        if trailing_bracket.0 {
12420            return parser_err!(
12421                format!("unmatched > after parsing data type {ty}"),
12422                self.peek_token_ref()
12423            );
12424        }
12425
12426        Ok(ty)
12427    }
12428
12429    fn parse_data_type_helper(
12430        &mut self,
12431    ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
12432        let dialect = self.dialect;
12433        self.advance_token();
12434        let next_token = self.get_current_token();
12435        let next_token_index = self.get_current_index();
12436
12437        let mut trailing_bracket: MatchedTrailingBracket = false.into();
12438        let mut data = match &next_token.token {
12439            Token::Word(w) => match w.keyword {
12440                Keyword::BOOLEAN => Ok(DataType::Boolean),
12441                Keyword::BOOL => Ok(DataType::Bool),
12442                Keyword::FLOAT => {
12443                    let precision = self.parse_exact_number_optional_precision_scale()?;
12444
12445                    if self.parse_keyword(Keyword::UNSIGNED) {
12446                        Ok(DataType::FloatUnsigned(precision))
12447                    } else {
12448                        Ok(DataType::Float(precision))
12449                    }
12450                }
12451                Keyword::REAL => {
12452                    if self.parse_keyword(Keyword::UNSIGNED) {
12453                        Ok(DataType::RealUnsigned)
12454                    } else {
12455                        Ok(DataType::Real)
12456                    }
12457                }
12458                Keyword::FLOAT4 => Ok(DataType::Float4),
12459                Keyword::FLOAT32 => Ok(DataType::Float32),
12460                Keyword::FLOAT64 => Ok(DataType::Float64),
12461                Keyword::FLOAT8 => Ok(DataType::Float8),
12462                Keyword::DOUBLE => {
12463                    if self.parse_keyword(Keyword::PRECISION) {
12464                        if self.parse_keyword(Keyword::UNSIGNED) {
12465                            Ok(DataType::DoublePrecisionUnsigned)
12466                        } else {
12467                            Ok(DataType::DoublePrecision)
12468                        }
12469                    } else {
12470                        let precision = self.parse_exact_number_optional_precision_scale()?;
12471
12472                        if self.parse_keyword(Keyword::UNSIGNED) {
12473                            Ok(DataType::DoubleUnsigned(precision))
12474                        } else {
12475                            Ok(DataType::Double(precision))
12476                        }
12477                    }
12478                }
12479                Keyword::TINYINT => {
12480                    let optional_precision = self.parse_optional_precision();
12481                    if self.parse_keyword(Keyword::UNSIGNED) {
12482                        Ok(DataType::TinyIntUnsigned(optional_precision?))
12483                    } else {
12484                        if dialect.supports_data_type_signed_suffix() {
12485                            let _ = self.parse_keyword(Keyword::SIGNED);
12486                        }
12487                        Ok(DataType::TinyInt(optional_precision?))
12488                    }
12489                }
12490                Keyword::INT2 => {
12491                    let optional_precision = self.parse_optional_precision();
12492                    if self.parse_keyword(Keyword::UNSIGNED) {
12493                        Ok(DataType::Int2Unsigned(optional_precision?))
12494                    } else {
12495                        Ok(DataType::Int2(optional_precision?))
12496                    }
12497                }
12498                Keyword::SMALLINT => {
12499                    let optional_precision = self.parse_optional_precision();
12500                    if self.parse_keyword(Keyword::UNSIGNED) {
12501                        Ok(DataType::SmallIntUnsigned(optional_precision?))
12502                    } else {
12503                        if dialect.supports_data_type_signed_suffix() {
12504                            let _ = self.parse_keyword(Keyword::SIGNED);
12505                        }
12506                        Ok(DataType::SmallInt(optional_precision?))
12507                    }
12508                }
12509                Keyword::MEDIUMINT => {
12510                    let optional_precision = self.parse_optional_precision();
12511                    if self.parse_keyword(Keyword::UNSIGNED) {
12512                        Ok(DataType::MediumIntUnsigned(optional_precision?))
12513                    } else {
12514                        if dialect.supports_data_type_signed_suffix() {
12515                            let _ = self.parse_keyword(Keyword::SIGNED);
12516                        }
12517                        Ok(DataType::MediumInt(optional_precision?))
12518                    }
12519                }
12520                Keyword::INT => {
12521                    let optional_precision = self.parse_optional_precision();
12522                    if self.parse_keyword(Keyword::UNSIGNED) {
12523                        Ok(DataType::IntUnsigned(optional_precision?))
12524                    } else {
12525                        if dialect.supports_data_type_signed_suffix() {
12526                            let _ = self.parse_keyword(Keyword::SIGNED);
12527                        }
12528                        Ok(DataType::Int(optional_precision?))
12529                    }
12530                }
12531                Keyword::INT4 => {
12532                    let optional_precision = self.parse_optional_precision();
12533                    if self.parse_keyword(Keyword::UNSIGNED) {
12534                        Ok(DataType::Int4Unsigned(optional_precision?))
12535                    } else {
12536                        Ok(DataType::Int4(optional_precision?))
12537                    }
12538                }
12539                Keyword::INT8 => {
12540                    let optional_precision = self.parse_optional_precision();
12541                    if self.parse_keyword(Keyword::UNSIGNED) {
12542                        Ok(DataType::Int8Unsigned(optional_precision?))
12543                    } else {
12544                        Ok(DataType::Int8(optional_precision?))
12545                    }
12546                }
12547                Keyword::INT16 => Ok(DataType::Int16),
12548                Keyword::INT32 => Ok(DataType::Int32),
12549                Keyword::INT64 => Ok(DataType::Int64),
12550                Keyword::INT128 => Ok(DataType::Int128),
12551                Keyword::INT256 => Ok(DataType::Int256),
12552                Keyword::INTEGER => {
12553                    let optional_precision = self.parse_optional_precision();
12554                    if self.parse_keyword(Keyword::UNSIGNED) {
12555                        Ok(DataType::IntegerUnsigned(optional_precision?))
12556                    } else {
12557                        if dialect.supports_data_type_signed_suffix() {
12558                            let _ = self.parse_keyword(Keyword::SIGNED);
12559                        }
12560                        Ok(DataType::Integer(optional_precision?))
12561                    }
12562                }
12563                Keyword::BIGINT => {
12564                    let optional_precision = self.parse_optional_precision();
12565                    if self.parse_keyword(Keyword::UNSIGNED) {
12566                        Ok(DataType::BigIntUnsigned(optional_precision?))
12567                    } else {
12568                        if dialect.supports_data_type_signed_suffix() {
12569                            let _ = self.parse_keyword(Keyword::SIGNED);
12570                        }
12571                        Ok(DataType::BigInt(optional_precision?))
12572                    }
12573                }
12574                Keyword::HUGEINT => Ok(DataType::HugeInt),
12575                Keyword::UBIGINT => Ok(DataType::UBigInt),
12576                Keyword::UHUGEINT => Ok(DataType::UHugeInt),
12577                Keyword::USMALLINT => Ok(DataType::USmallInt),
12578                Keyword::UTINYINT => Ok(DataType::UTinyInt),
12579                Keyword::UINT8 => Ok(DataType::UInt8),
12580                Keyword::UINT16 => Ok(DataType::UInt16),
12581                Keyword::UINT32 => Ok(DataType::UInt32),
12582                Keyword::UINT64 => Ok(DataType::UInt64),
12583                Keyword::UINT128 => Ok(DataType::UInt128),
12584                Keyword::UINT256 => Ok(DataType::UInt256),
12585                Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
12586                Keyword::NVARCHAR => {
12587                    Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
12588                }
12589                Keyword::CHARACTER => {
12590                    if self.parse_keyword(Keyword::VARYING) {
12591                        Ok(DataType::CharacterVarying(
12592                            self.parse_optional_character_length()?,
12593                        ))
12594                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12595                        Ok(DataType::CharacterLargeObject(
12596                            self.parse_optional_precision()?,
12597                        ))
12598                    } else {
12599                        Ok(DataType::Character(self.parse_optional_character_length()?))
12600                    }
12601                }
12602                Keyword::CHAR => {
12603                    if self.parse_keyword(Keyword::VARYING) {
12604                        Ok(DataType::CharVarying(
12605                            self.parse_optional_character_length()?,
12606                        ))
12607                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12608                        Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
12609                    } else {
12610                        Ok(DataType::Char(self.parse_optional_character_length()?))
12611                    }
12612                }
12613                Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
12614                Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
12615                Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
12616                Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
12617                Keyword::TINYBLOB => Ok(DataType::TinyBlob),
12618                Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
12619                Keyword::LONGBLOB => Ok(DataType::LongBlob),
12620                Keyword::LONG if self.dialect.supports_long_type_as_bigint() => {
12621                    Ok(DataType::BigInt(None))
12622                }
12623                Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
12624                Keyword::BIT => {
12625                    if self.parse_keyword(Keyword::VARYING) {
12626                        Ok(DataType::BitVarying(self.parse_optional_precision()?))
12627                    } else {
12628                        Ok(DataType::Bit(self.parse_optional_precision()?))
12629                    }
12630                }
12631                Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
12632                Keyword::UUID => Ok(DataType::Uuid),
12633                Keyword::DATE => Ok(DataType::Date),
12634                Keyword::DATE32 => Ok(DataType::Date32),
12635                Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
12636                Keyword::DATETIME64 => {
12637                    self.prev_token();
12638                    let (precision, time_zone) = self.parse_datetime_64()?;
12639                    Ok(DataType::Datetime64(precision, time_zone))
12640                }
12641                Keyword::TIMESTAMP => {
12642                    let precision = self.parse_optional_precision()?;
12643                    let tz = if self.parse_keyword(Keyword::WITH) {
12644                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12645                        TimezoneInfo::WithTimeZone
12646                    } else if self.parse_keyword(Keyword::WITHOUT) {
12647                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12648                        TimezoneInfo::WithoutTimeZone
12649                    } else {
12650                        TimezoneInfo::None
12651                    };
12652                    Ok(DataType::Timestamp(precision, tz))
12653                }
12654                Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
12655                    self.parse_optional_precision()?,
12656                    TimezoneInfo::Tz,
12657                )),
12658                Keyword::TIMESTAMP_NTZ => {
12659                    Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
12660                }
12661                Keyword::TIME => {
12662                    let precision = self.parse_optional_precision()?;
12663                    let tz = if self.parse_keyword(Keyword::WITH) {
12664                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12665                        TimezoneInfo::WithTimeZone
12666                    } else if self.parse_keyword(Keyword::WITHOUT) {
12667                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12668                        TimezoneInfo::WithoutTimeZone
12669                    } else {
12670                        TimezoneInfo::None
12671                    };
12672                    Ok(DataType::Time(precision, tz))
12673                }
12674                Keyword::TIMETZ => Ok(DataType::Time(
12675                    self.parse_optional_precision()?,
12676                    TimezoneInfo::Tz,
12677                )),
12678                Keyword::INTERVAL => {
12679                    if self.dialect.supports_interval_options() {
12680                        let fields = self.maybe_parse_optional_interval_fields()?;
12681                        let precision = self.parse_optional_precision()?;
12682                        Ok(DataType::Interval { fields, precision })
12683                    } else {
12684                        Ok(DataType::Interval {
12685                            fields: None,
12686                            precision: None,
12687                        })
12688                    }
12689                }
12690                Keyword::JSON => Ok(DataType::JSON),
12691                Keyword::JSONB => Ok(DataType::JSONB),
12692                Keyword::REGCLASS => Ok(DataType::Regclass),
12693                Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
12694                Keyword::FIXEDSTRING => {
12695                    self.expect_token(&Token::LParen)?;
12696                    let character_length = self.parse_literal_uint()?;
12697                    self.expect_token(&Token::RParen)?;
12698                    Ok(DataType::FixedString(character_length))
12699                }
12700                Keyword::TEXT => {
12701                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12702                        Ok(DataType::Custom(
12703                            ObjectName::from(vec![Ident::new("TEXT")]),
12704                            modifiers,
12705                        ))
12706                    } else {
12707                        Ok(DataType::Text)
12708                    }
12709                }
12710                Keyword::TINYTEXT => Ok(DataType::TinyText),
12711                Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
12712                Keyword::LONGTEXT => Ok(DataType::LongText),
12713                Keyword::BYTEA => Ok(DataType::Bytea),
12714                Keyword::NUMERIC => Ok(DataType::Numeric(
12715                    self.parse_exact_number_optional_precision_scale()?,
12716                )),
12717                Keyword::DECIMAL => {
12718                    let precision = self.parse_exact_number_optional_precision_scale()?;
12719
12720                    if self.parse_keyword(Keyword::UNSIGNED) {
12721                        Ok(DataType::DecimalUnsigned(precision))
12722                    } else {
12723                        Ok(DataType::Decimal(precision))
12724                    }
12725                }
12726                Keyword::DEC => {
12727                    let precision = self.parse_exact_number_optional_precision_scale()?;
12728
12729                    if self.parse_keyword(Keyword::UNSIGNED) {
12730                        Ok(DataType::DecUnsigned(precision))
12731                    } else {
12732                        Ok(DataType::Dec(precision))
12733                    }
12734                }
12735                Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
12736                    self.parse_exact_number_optional_precision_scale()?,
12737                )),
12738                Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
12739                    self.parse_exact_number_optional_precision_scale()?,
12740                )),
12741                Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
12742                Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
12743                Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
12744                Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
12745                Keyword::ARRAY => {
12746                    if self.dialect.supports_array_typedef_without_element_type() {
12747                        Ok(DataType::Array(ArrayElemTypeDef::None))
12748                    } else if dialect_of!(self is ClickHouseDialect) {
12749                        Ok(self.parse_sub_type(|internal_type| {
12750                            DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
12751                        })?)
12752                    } else {
12753                        self.expect_token(&Token::Lt)?;
12754                        let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
12755                        trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12756                        Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
12757                            inside_type,
12758                        ))))
12759                    }
12760                }
12761                Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
12762                    self.prev_token();
12763                    let field_defs = self.parse_duckdb_struct_type_def()?;
12764                    Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
12765                }
12766                Keyword::STRUCT if self.dialect.supports_struct_literal() => {
12767                    self.prev_token();
12768                    let (field_defs, _trailing_bracket) =
12769                        self.parse_struct_type_def(Self::parse_struct_field_def)?;
12770                    trailing_bracket = _trailing_bracket;
12771                    Ok(DataType::Struct(
12772                        field_defs,
12773                        StructBracketKind::AngleBrackets,
12774                    ))
12775                }
12776                Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
12777                    self.prev_token();
12778                    let fields = self.parse_union_type_def()?;
12779                    Ok(DataType::Union(fields))
12780                }
12781                Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12782                    Ok(self.parse_sub_type(DataType::Nullable)?)
12783                }
12784                Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12785                    Ok(self.parse_sub_type(DataType::LowCardinality)?)
12786                }
12787                Keyword::MAP if self.dialect.supports_map_literal_with_angle_brackets() => {
12788                    self.expect_token(&Token::Lt)?;
12789                    let key_data_type = self.parse_data_type()?;
12790                    self.expect_token(&Token::Comma)?;
12791                    let (value_data_type, _trailing_bracket) = self.parse_data_type_helper()?;
12792                    trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12793                    Ok(DataType::Map(
12794                        Box::new(key_data_type),
12795                        Box::new(value_data_type),
12796                    ))
12797                }
12798                Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12799                    self.prev_token();
12800                    let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
12801                    Ok(DataType::Map(
12802                        Box::new(key_data_type),
12803                        Box::new(value_data_type),
12804                    ))
12805                }
12806                Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12807                    self.expect_token(&Token::LParen)?;
12808                    let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
12809                    self.expect_token(&Token::RParen)?;
12810                    Ok(DataType::Nested(field_defs))
12811                }
12812                Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12813                    self.prev_token();
12814                    let field_defs = self.parse_click_house_tuple_def()?;
12815                    Ok(DataType::Tuple(field_defs))
12816                }
12817                Keyword::TRIGGER => Ok(DataType::Trigger),
12818                Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
12819                    let _ = self.parse_keyword(Keyword::TYPE);
12820                    Ok(DataType::AnyType)
12821                }
12822                Keyword::TABLE => {
12823                    // an LParen after the TABLE keyword indicates that table columns are being defined
12824                    // whereas no LParen indicates an anonymous table expression will be returned
12825                    if self.peek_token_ref().token == Token::LParen {
12826                        let columns = self.parse_returns_table_columns()?;
12827                        Ok(DataType::Table(Some(columns)))
12828                    } else {
12829                        Ok(DataType::Table(None))
12830                    }
12831                }
12832                Keyword::SIGNED => {
12833                    if self.parse_keyword(Keyword::INTEGER) {
12834                        Ok(DataType::SignedInteger)
12835                    } else {
12836                        Ok(DataType::Signed)
12837                    }
12838                }
12839                Keyword::UNSIGNED => {
12840                    if self.parse_keyword(Keyword::INTEGER) {
12841                        Ok(DataType::UnsignedInteger)
12842                    } else {
12843                        Ok(DataType::Unsigned)
12844                    }
12845                }
12846                Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12847                    Ok(DataType::TsVector)
12848                }
12849                Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12850                    Ok(DataType::TsQuery)
12851                }
12852                _ => {
12853                    self.prev_token();
12854                    let type_name = self.parse_object_name(false)?;
12855                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12856                        Ok(DataType::Custom(type_name, modifiers))
12857                    } else {
12858                        Ok(DataType::Custom(type_name, vec![]))
12859                    }
12860                }
12861            },
12862            _ => self.expected_at("a data type name", next_token_index),
12863        }?;
12864
12865        if self.dialect.supports_array_typedef_with_brackets() {
12866            while self.consume_token(&Token::LBracket) {
12867                // Parse optional array data type size
12868                let size = self.maybe_parse(|p| p.parse_literal_uint())?;
12869                self.expect_token(&Token::RBracket)?;
12870                data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
12871            }
12872        }
12873        Ok((data, trailing_bracket))
12874    }
12875
12876    fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
12877        self.parse_column_def()
12878    }
12879
12880    fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
12881        self.expect_token(&Token::LParen)?;
12882        let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
12883        self.expect_token(&Token::RParen)?;
12884        Ok(columns)
12885    }
12886
12887    /// Parse a parenthesized, comma-separated list of single-quoted strings.
12888    pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
12889        self.expect_token(&Token::LParen)?;
12890        let mut values = Vec::new();
12891        loop {
12892            let next_token = self.next_token();
12893            match next_token.token {
12894                Token::SingleQuotedString(value) => values.push(value),
12895                _ => self.expected("a string", next_token)?,
12896            }
12897            let next_token = self.next_token();
12898            match next_token.token {
12899                Token::Comma => (),
12900                Token::RParen => break,
12901                _ => self.expected(", or }", next_token)?,
12902            }
12903        }
12904        Ok(values)
12905    }
12906
12907    /// Strictly parse `identifier AS identifier`
12908    pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12909        let ident = self.parse_identifier()?;
12910        self.expect_keyword_is(Keyword::AS)?;
12911        let alias = self.parse_identifier()?;
12912        Ok(IdentWithAlias { ident, alias })
12913    }
12914
12915    /// Parse `identifier [AS] identifier` where the AS keyword is optional
12916    fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12917        let ident = self.parse_identifier()?;
12918        let _after_as = self.parse_keyword(Keyword::AS);
12919        let alias = self.parse_identifier()?;
12920        Ok(IdentWithAlias { ident, alias })
12921    }
12922
12923    /// Parse comma-separated list of parenthesized queries for pipe operators
12924    fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
12925        self.parse_comma_separated(|parser| {
12926            parser.expect_token(&Token::LParen)?;
12927            let query = parser.parse_query()?;
12928            parser.expect_token(&Token::RParen)?;
12929            Ok(*query)
12930        })
12931    }
12932
12933    /// Parse set quantifier for pipe operators that require DISTINCT. E.g. INTERSECT and EXCEPT
12934    fn parse_distinct_required_set_quantifier(
12935        &mut self,
12936        operator_name: &str,
12937    ) -> Result<SetQuantifier, ParserError> {
12938        let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
12939        match quantifier {
12940            SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
12941            _ => Err(ParserError::ParserError(format!(
12942                "{operator_name} pipe operator requires DISTINCT modifier",
12943            ))),
12944        }
12945    }
12946
12947    /// Parse optional identifier alias (with or without AS keyword)
12948    fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12949        if self.parse_keyword(Keyword::AS) {
12950            Ok(Some(self.parse_identifier()?))
12951        } else {
12952            // Check if the next token is an identifier (implicit alias)
12953            self.maybe_parse(|parser| parser.parse_identifier())
12954        }
12955    }
12956
12957    /// Optionally parses an alias for a select list item
12958    fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12959        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12960            parser.dialect.is_select_item_alias(explicit, kw, parser)
12961        }
12962        self.parse_optional_alias_inner(None, validator)
12963    }
12964
12965    /// Optionally parses an alias for a table like in `... FROM generate_series(1, 10) AS t (col)`.
12966    /// In this case, the alias is allowed to optionally name the columns in the table, in
12967    /// addition to the table itself.
12968    pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
12969        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12970            parser.dialect.is_table_factor_alias(explicit, kw, parser)
12971        }
12972        let explicit = self.peek_keyword(Keyword::AS);
12973        match self.parse_optional_alias_inner(None, validator)? {
12974            Some(name) => {
12975                let columns = self.parse_table_alias_column_defs()?;
12976                let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
12977                    Some(self.parse_identifier()?)
12978                } else {
12979                    None
12980                };
12981                Ok(Some(TableAlias {
12982                    explicit,
12983                    name,
12984                    columns,
12985                    at,
12986                }))
12987            }
12988            None => Ok(None),
12989        }
12990    }
12991
12992    fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
12993        let mut hints = vec![];
12994        while let Some(hint_type) =
12995            self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
12996        {
12997            let hint_type = match hint_type {
12998                Keyword::USE => TableIndexHintType::Use,
12999                Keyword::IGNORE => TableIndexHintType::Ignore,
13000                Keyword::FORCE => TableIndexHintType::Force,
13001                _ => {
13002                    return self.expected_ref(
13003                        "expected to match USE/IGNORE/FORCE keyword",
13004                        self.peek_token_ref(),
13005                    )
13006                }
13007            };
13008            let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
13009                Some(Keyword::INDEX) => TableIndexType::Index,
13010                Some(Keyword::KEY) => TableIndexType::Key,
13011                _ => {
13012                    return self
13013                        .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
13014                }
13015            };
13016            let for_clause = if self.parse_keyword(Keyword::FOR) {
13017                let clause = if self.parse_keyword(Keyword::JOIN) {
13018                    TableIndexHintForClause::Join
13019                } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13020                    TableIndexHintForClause::OrderBy
13021                } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13022                    TableIndexHintForClause::GroupBy
13023                } else {
13024                    return self.expected_ref(
13025                        "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
13026                        self.peek_token_ref(),
13027                    );
13028                };
13029                Some(clause)
13030            } else {
13031                None
13032            };
13033
13034            self.expect_token(&Token::LParen)?;
13035            let index_names = if self.peek_token_ref().token != Token::RParen {
13036                self.parse_comma_separated(Parser::parse_identifier)?
13037            } else {
13038                vec![]
13039            };
13040            self.expect_token(&Token::RParen)?;
13041            hints.push(TableIndexHints {
13042                hint_type,
13043                index_type,
13044                for_clause,
13045                index_names,
13046            });
13047        }
13048        Ok(hints)
13049    }
13050
13051    /// Wrapper for parse_optional_alias_inner, left for backwards-compatibility
13052    /// but new flows should use the context-specific methods such as `maybe_parse_select_item_alias`
13053    /// and `maybe_parse_table_alias`.
13054    pub fn parse_optional_alias(
13055        &mut self,
13056        reserved_kwds: &[Keyword],
13057    ) -> Result<Option<Ident>, ParserError> {
13058        fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
13059            false
13060        }
13061        self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13062    }
13063
13064    /// Parses an optional alias after a SQL element such as a select list item
13065    /// or a table name.
13066    ///
13067    /// This method accepts an optional list of reserved keywords or a function
13068    /// to call to validate if a keyword should be parsed as an alias, to allow
13069    /// callers to customize the parsing logic based on their context.
13070    fn parse_optional_alias_inner<F>(
13071        &mut self,
13072        reserved_kwds: Option<&[Keyword]>,
13073        validator: F,
13074    ) -> Result<Option<Ident>, ParserError>
13075    where
13076        F: Fn(bool, &Keyword, &mut Parser) -> bool,
13077    {
13078        let after_as = self.parse_keyword(Keyword::AS);
13079
13080        let next_token = self.next_token();
13081        match next_token.token {
13082            // Accepts a keyword as an alias if the AS keyword explicitly indicate an alias or if the
13083            // caller provided a list of reserved keywords and the keyword is not on that list.
13084            Token::Word(w)
13085                if reserved_kwds.is_some()
13086                    && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
13087            {
13088                Ok(Some(w.into_ident(next_token.span)))
13089            }
13090            // Accepts a keyword as alias based on the caller's context, such as to what SQL element
13091            // this word is a potential alias of using the validator call-back. This allows for
13092            // dialect-specific logic.
13093            Token::Word(w) if validator(after_as, &w.keyword, self) => {
13094                Ok(Some(w.into_ident(next_token.span)))
13095            }
13096            // For backwards-compatibility, we accept quoted strings as aliases regardless of the context.
13097            Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
13098            Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
13099            _ => {
13100                if after_as {
13101                    return self.expected("an identifier after AS", next_token);
13102                }
13103                self.prev_token();
13104                Ok(None) // no alias found
13105            }
13106        }
13107    }
13108
13109    /// Parse an optional `GROUP BY` clause, returning `Some(GroupByExpr)` when present.
13110    pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
13111        if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13112            let expressions = if self.parse_keyword(Keyword::ALL) {
13113                None
13114            } else {
13115                Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
13116            };
13117
13118            let mut modifiers = vec![];
13119            if self.dialect.supports_group_by_with_modifier() {
13120                loop {
13121                    if !self.parse_keyword(Keyword::WITH) {
13122                        break;
13123                    }
13124                    let keyword = self.expect_one_of_keywords(&[
13125                        Keyword::ROLLUP,
13126                        Keyword::CUBE,
13127                        Keyword::TOTALS,
13128                    ])?;
13129                    modifiers.push(match keyword {
13130                        Keyword::ROLLUP => GroupByWithModifier::Rollup,
13131                        Keyword::CUBE => GroupByWithModifier::Cube,
13132                        Keyword::TOTALS => GroupByWithModifier::Totals,
13133                        _ => {
13134                            return parser_err!(
13135                                "BUG: expected to match GroupBy modifier keyword",
13136                                self.peek_token_ref().span.start
13137                            )
13138                        }
13139                    });
13140                }
13141            }
13142            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13143                self.expect_token(&Token::LParen)?;
13144                let result = self.parse_comma_separated(|p| {
13145                    if p.peek_token_ref().token == Token::LParen {
13146                        p.parse_tuple(true, true)
13147                    } else {
13148                        Ok(vec![p.parse_expr()?])
13149                    }
13150                })?;
13151                self.expect_token(&Token::RParen)?;
13152                modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13153                    result,
13154                )));
13155            };
13156            let group_by = match expressions {
13157                None => GroupByExpr::All(modifiers),
13158                Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13159            };
13160            Ok(Some(group_by))
13161        } else {
13162            Ok(None)
13163        }
13164    }
13165
13166    /// Parse an optional `ORDER BY` clause, returning `Some(OrderBy)` when present.
13167    pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13168        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13169            let order_by =
13170                if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13171                    let order_by_options = self.parse_order_by_options()?;
13172                    OrderBy {
13173                        kind: OrderByKind::All(order_by_options),
13174                        interpolate: None,
13175                    }
13176                } else {
13177                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13178                    let interpolate = if self.dialect.supports_interpolate() {
13179                        self.parse_interpolations()?
13180                    } else {
13181                        None
13182                    };
13183                    OrderBy {
13184                        kind: OrderByKind::Expressions(exprs),
13185                        interpolate,
13186                    }
13187                };
13188            Ok(Some(order_by))
13189        } else {
13190            Ok(None)
13191        }
13192    }
13193
13194    fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13195        let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13196            Some(self.parse_offset()?)
13197        } else {
13198            None
13199        };
13200
13201        let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13202            let expr = self.parse_limit()?;
13203
13204            if self.dialect.supports_limit_comma()
13205                && offset.is_none()
13206                && expr.is_some() // ALL not supported with comma
13207                && self.consume_token(&Token::Comma)
13208            {
13209                let offset = expr.ok_or_else(|| {
13210                    ParserError::ParserError(
13211                        "Missing offset for LIMIT <offset>, <limit>".to_string(),
13212                    )
13213                })?;
13214                return Ok(Some(LimitClause::OffsetCommaLimit {
13215                    offset,
13216                    limit: self.parse_expr()?,
13217                }));
13218            }
13219
13220            let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13221                Some(self.parse_comma_separated(Parser::parse_expr)?)
13222            } else {
13223                None
13224            };
13225
13226            (Some(expr), limit_by)
13227        } else {
13228            (None, None)
13229        };
13230
13231        if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13232            offset = Some(self.parse_offset()?);
13233        }
13234
13235        if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13236            Ok(Some(LimitClause::LimitOffset {
13237                limit: limit.unwrap_or_default(),
13238                offset,
13239                limit_by: limit_by.unwrap_or_default(),
13240            }))
13241        } else {
13242            Ok(None)
13243        }
13244    }
13245
13246    /// Parse a table object for insertion
13247    /// e.g. `some_database.some_table` or `FUNCTION some_table_func(...)`
13248    pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13249        if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13250            let fn_name = self.parse_object_name(false)?;
13251            self.parse_function_call(fn_name)
13252                .map(TableObject::TableFunction)
13253        } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13254            self.parse_parenthesized(|p| p.parse_query())
13255                .map(TableObject::TableQuery)
13256        } else {
13257            self.parse_object_name(false).map(TableObject::TableName)
13258        }
13259    }
13260
13261    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13262    /// `foo` or `myschema."table"
13263    ///
13264    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13265    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13266    /// in this context on BigQuery.
13267    pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13268        self.parse_object_name_inner(in_table_clause, false)
13269    }
13270
13271    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13272    /// `foo` or `myschema."table"
13273    ///
13274    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13275    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13276    /// in this context on BigQuery.
13277    ///
13278    /// The `allow_wildcards` parameter indicates whether to allow for wildcards in the object name
13279    /// e.g. *, *.*, `foo`.*, or "foo"."bar"
13280    fn parse_object_name_inner(
13281        &mut self,
13282        in_table_clause: bool,
13283        allow_wildcards: bool,
13284    ) -> Result<ObjectName, ParserError> {
13285        let mut parts = vec![];
13286        if dialect_of!(self is BigQueryDialect) && in_table_clause {
13287            loop {
13288                let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13289                parts.push(ObjectNamePart::Identifier(ident));
13290                if !self.consume_token(&Token::Period) && !end_with_period {
13291                    break;
13292                }
13293            }
13294        } else {
13295            loop {
13296                if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13297                    let span = self.next_token().span;
13298                    parts.push(ObjectNamePart::Identifier(Ident {
13299                        value: Token::Mul.to_string(),
13300                        quote_style: None,
13301                        span,
13302                    }));
13303                } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13304                    let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13305                    parts.push(ObjectNamePart::Identifier(ident));
13306                    if !self.consume_token(&Token::Period) && !end_with_period {
13307                        break;
13308                    }
13309                } else if self.dialect.supports_object_name_double_dot_notation()
13310                    && parts.len() == 1
13311                    && matches!(self.peek_token_ref().token, Token::Period)
13312                {
13313                    // Empty string here means default schema
13314                    parts.push(ObjectNamePart::Identifier(Ident::new("")));
13315                } else {
13316                    let ident = self.parse_identifier()?;
13317                    let part = if self
13318                        .dialect
13319                        .is_identifier_generating_function_name(&ident, &parts)
13320                    {
13321                        self.expect_token(&Token::LParen)?;
13322                        let args: Vec<FunctionArg> =
13323                            self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13324                        self.expect_token(&Token::RParen)?;
13325                        ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13326                    } else {
13327                        ObjectNamePart::Identifier(ident)
13328                    };
13329                    parts.push(part);
13330                }
13331
13332                if !self.consume_token(&Token::Period) {
13333                    break;
13334                }
13335            }
13336        }
13337
13338        // BigQuery accepts any number of quoted identifiers of a table name.
13339        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
13340        if dialect_of!(self is BigQueryDialect)
13341            && parts.iter().any(|part| {
13342                part.as_ident()
13343                    .is_some_and(|ident| ident.value.contains('.'))
13344            })
13345        {
13346            parts = parts
13347                .into_iter()
13348                .flat_map(|part| match part.as_ident() {
13349                    Some(ident) => ident
13350                        .value
13351                        .split('.')
13352                        .map(|value| {
13353                            ObjectNamePart::Identifier(Ident {
13354                                value: value.into(),
13355                                quote_style: ident.quote_style,
13356                                span: ident.span,
13357                            })
13358                        })
13359                        .collect::<Vec<_>>(),
13360                    None => vec![part],
13361                })
13362                .collect()
13363        }
13364
13365        Ok(ObjectName(parts))
13366    }
13367
13368    /// Parse identifiers
13369    pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13370        let mut idents = vec![];
13371        loop {
13372            let token = self.peek_token_ref();
13373            match &token.token {
13374                Token::Word(w) => {
13375                    idents.push(w.to_ident(token.span));
13376                }
13377                Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13378                    break
13379                }
13380                _ => {}
13381            }
13382            self.advance_token();
13383        }
13384        Ok(idents)
13385    }
13386
13387    /// Parse identifiers of form ident1[.identN]*
13388    ///
13389    /// Similar in functionality to [parse_identifiers], with difference
13390    /// being this function is much more strict about parsing a valid multipart identifier, not
13391    /// allowing extraneous tokens to be parsed, otherwise it fails.
13392    ///
13393    /// For example:
13394    ///
13395    /// ```rust
13396    /// use sqlparser::ast::Ident;
13397    /// use sqlparser::dialect::GenericDialect;
13398    /// use sqlparser::parser::Parser;
13399    ///
13400    /// let dialect = GenericDialect {};
13401    /// let expected = vec![Ident::new("one"), Ident::new("two")];
13402    ///
13403    /// // expected usage
13404    /// let sql = "one.two";
13405    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13406    /// let actual = parser.parse_multipart_identifier().unwrap();
13407    /// assert_eq!(&actual, &expected);
13408    ///
13409    /// // parse_identifiers is more loose on what it allows, parsing successfully
13410    /// let sql = "one + two";
13411    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13412    /// let actual = parser.parse_identifiers().unwrap();
13413    /// assert_eq!(&actual, &expected);
13414    ///
13415    /// // expected to strictly fail due to + separator
13416    /// let sql = "one + two";
13417    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13418    /// let actual = parser.parse_multipart_identifier().unwrap_err();
13419    /// assert_eq!(
13420    ///     actual.to_string(),
13421    ///     "sql parser error: Unexpected token in identifier: +"
13422    /// );
13423    /// ```
13424    ///
13425    /// [parse_identifiers]: Parser::parse_identifiers
13426    pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13427        let mut idents = vec![];
13428
13429        // expecting at least one word for identifier
13430        let next_token = self.next_token();
13431        match next_token.token {
13432            Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13433            Token::EOF => {
13434                return Err(ParserError::ParserError(
13435                    "Empty input when parsing identifier".to_string(),
13436                ))?
13437            }
13438            token => {
13439                return Err(ParserError::ParserError(format!(
13440                    "Unexpected token in identifier: {token}"
13441                )))?
13442            }
13443        };
13444
13445        // parse optional next parts if exist
13446        loop {
13447            match self.next_token().token {
13448                // ensure that optional period is succeeded by another identifier
13449                Token::Period => {
13450                    let next_token = self.next_token();
13451                    match next_token.token {
13452                        Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13453                        Token::EOF => {
13454                            return Err(ParserError::ParserError(
13455                                "Trailing period in identifier".to_string(),
13456                            ))?
13457                        }
13458                        token => {
13459                            return Err(ParserError::ParserError(format!(
13460                                "Unexpected token following period in identifier: {token}"
13461                            )))?
13462                        }
13463                    }
13464                }
13465                Token::EOF => break,
13466                token => {
13467                    Err(ParserError::ParserError(format!(
13468                        "Unexpected token in identifier: {token}"
13469                    )))?;
13470                }
13471            }
13472        }
13473
13474        Ok(idents)
13475    }
13476
13477    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
13478    pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
13479        let next_token = self.next_token();
13480        match next_token.token {
13481            Token::Word(w) => Ok(w.into_ident(next_token.span)),
13482            Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
13483            Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
13484            _ => self.expected("identifier", next_token),
13485        }
13486    }
13487
13488    /// On BigQuery, hyphens are permitted in unquoted identifiers inside of a FROM or
13489    /// TABLE clause.
13490    ///
13491    /// The first segment must be an ordinary unquoted identifier, e.g. it must not start
13492    /// with a digit. Subsequent segments are either must either be valid identifiers or
13493    /// integers, e.g. foo-123 is allowed, but foo-123a is not.
13494    ///
13495    /// [BigQuery-lexical](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical)
13496    ///
13497    /// Return a tuple of the identifier and a boolean indicating it ends with a period.
13498    fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
13499        match self.peek_token().token {
13500            Token::Word(w) => {
13501                let quote_style_is_none = w.quote_style.is_none();
13502                let mut requires_whitespace = false;
13503                let mut ident = w.into_ident(self.next_token().span);
13504                if quote_style_is_none {
13505                    while matches!(self.peek_token_no_skip().token, Token::Minus) {
13506                        self.next_token();
13507                        ident.value.push('-');
13508
13509                        let token = self
13510                            .next_token_no_skip()
13511                            .cloned()
13512                            .unwrap_or(TokenWithSpan::wrap(Token::EOF));
13513                        requires_whitespace = match token.token {
13514                            Token::Word(next_word) if next_word.quote_style.is_none() => {
13515                                ident.value.push_str(&next_word.value);
13516                                false
13517                            }
13518                            Token::Number(s, false) => {
13519                                // A number token can represent a decimal value ending with a period, e.g., `Number('123.')`.
13520                                // However, for an [ObjectName], it is part of a hyphenated identifier, e.g., `foo-123.bar`.
13521                                //
13522                                // If a number token is followed by a period, it is part of an [ObjectName].
13523                                // Return the identifier with `true` if the number token is followed by a period, indicating that
13524                                // parsing should continue for the next part of the hyphenated identifier.
13525                                if s.ends_with('.') {
13526                                    let Some(s) = s.split('.').next().filter(|s| {
13527                                        !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
13528                                    }) else {
13529                                        return self.expected(
13530                                            "continuation of hyphenated identifier",
13531                                            TokenWithSpan::new(Token::Number(s, false), token.span),
13532                                        );
13533                                    };
13534                                    ident.value.push_str(s);
13535                                    return Ok((ident, true));
13536                                } else {
13537                                    ident.value.push_str(&s);
13538                                }
13539                                // If next token is period, then it is part of an ObjectName and we don't expect whitespace
13540                                // after the number.
13541                                !matches!(self.peek_token_ref().token, Token::Period)
13542                            }
13543                            _ => {
13544                                return self
13545                                    .expected("continuation of hyphenated identifier", token);
13546                            }
13547                        }
13548                    }
13549
13550                    // If the last segment was a number, we must check that it's followed by whitespace,
13551                    // otherwise foo-123a will be parsed as `foo-123` with the alias `a`.
13552                    if requires_whitespace {
13553                        let token = self.next_token();
13554                        if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
13555                            return self
13556                                .expected("whitespace following hyphenated identifier", token);
13557                        }
13558                    }
13559                }
13560                Ok((ident, false))
13561            }
13562            _ => Ok((self.parse_identifier()?, false)),
13563        }
13564    }
13565
13566    /// Parses a parenthesized, comma-separated list of column definitions within a view.
13567    fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
13568        if self.consume_token(&Token::LParen) {
13569            if self.peek_token_ref().token == Token::RParen {
13570                self.next_token();
13571                Ok(vec![])
13572            } else {
13573                let cols = self.parse_comma_separated_with_trailing_commas(
13574                    Parser::parse_view_column,
13575                    self.dialect.supports_column_definition_trailing_commas(),
13576                    Self::is_reserved_for_column_alias,
13577                )?;
13578                self.expect_token(&Token::RParen)?;
13579                Ok(cols)
13580            }
13581        } else {
13582            Ok(vec![])
13583        }
13584    }
13585
13586    /// Parses a column definition within a view.
13587    fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
13588        let name = self.parse_identifier()?;
13589        let options = self.parse_view_column_options()?;
13590        let data_type = if dialect_of!(self is ClickHouseDialect) {
13591            Some(self.parse_data_type()?)
13592        } else {
13593            None
13594        };
13595        Ok(ViewColumnDef {
13596            name,
13597            data_type,
13598            options,
13599        })
13600    }
13601
13602    fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
13603        let mut options = Vec::new();
13604        loop {
13605            let option = self.parse_optional_column_option()?;
13606            if let Some(option) = option {
13607                options.push(option);
13608            } else {
13609                break;
13610            }
13611        }
13612        if options.is_empty() {
13613            Ok(None)
13614        } else if self.dialect.supports_space_separated_column_options() {
13615            Ok(Some(ColumnOptions::SpaceSeparated(options)))
13616        } else {
13617            Ok(Some(ColumnOptions::CommaSeparated(options)))
13618        }
13619    }
13620
13621    /// Parses a parenthesized comma-separated list of unqualified, possibly quoted identifiers.
13622    /// For example: `(col1, "col 2", ...)`
13623    pub fn parse_parenthesized_column_list(
13624        &mut self,
13625        optional: IsOptional,
13626        allow_empty: bool,
13627    ) -> Result<Vec<Ident>, ParserError> {
13628        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
13629    }
13630
13631    /// Parse a parenthesized list of compound identifiers as expressions.
13632    pub fn parse_parenthesized_compound_identifier_list(
13633        &mut self,
13634        optional: IsOptional,
13635        allow_empty: bool,
13636    ) -> Result<Vec<Expr>, ParserError> {
13637        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13638            Ok(Expr::CompoundIdentifier(
13639                p.parse_period_separated(|p| p.parse_identifier())?,
13640            ))
13641        })
13642    }
13643
13644    /// Parses a parenthesized comma-separated list of index columns, which can be arbitrary
13645    /// expressions with ordering information (and an opclass in some dialects).
13646    fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
13647        self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
13648            p.parse_create_index_expr()
13649        })
13650    }
13651
13652    /// Parses a parenthesized comma-separated list of qualified, possibly quoted identifiers.
13653    /// For example: `(db1.sc1.tbl1.col1, db1.sc1.tbl1."col 2", ...)`
13654    pub fn parse_parenthesized_qualified_column_list(
13655        &mut self,
13656        optional: IsOptional,
13657        allow_empty: bool,
13658    ) -> Result<Vec<ObjectName>, ParserError> {
13659        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13660            p.parse_object_name(true)
13661        })
13662    }
13663
13664    /// Parses a parenthesized comma-separated list of columns using
13665    /// the provided function to parse each element.
13666    fn parse_parenthesized_column_list_inner<F, T>(
13667        &mut self,
13668        optional: IsOptional,
13669        allow_empty: bool,
13670        mut f: F,
13671    ) -> Result<Vec<T>, ParserError>
13672    where
13673        F: FnMut(&mut Parser) -> Result<T, ParserError>,
13674    {
13675        if self.consume_token(&Token::LParen) {
13676            if allow_empty && self.peek_token_ref().token == Token::RParen {
13677                self.next_token();
13678                Ok(vec![])
13679            } else {
13680                let cols = self.parse_comma_separated(|p| f(p))?;
13681                self.expect_token(&Token::RParen)?;
13682                Ok(cols)
13683            }
13684        } else if optional == Optional {
13685            Ok(vec![])
13686        } else {
13687            self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
13688        }
13689    }
13690
13691    /// Parses a parenthesized comma-separated list of table alias column definitions.
13692    fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
13693        if self.consume_token(&Token::LParen) {
13694            let cols = self.parse_comma_separated(|p| {
13695                let name = p.parse_identifier()?;
13696                let data_type = p.maybe_parse(|p| p.parse_data_type())?;
13697                Ok(TableAliasColumnDef { name, data_type })
13698            })?;
13699            self.expect_token(&Token::RParen)?;
13700            Ok(cols)
13701        } else {
13702            Ok(vec![])
13703        }
13704    }
13705
13706    /// Parse an unsigned precision value enclosed in parentheses, e.g. `(10)`.
13707    pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
13708        self.expect_token(&Token::LParen)?;
13709        let n = self.parse_literal_uint()?;
13710        self.expect_token(&Token::RParen)?;
13711        Ok(n)
13712    }
13713
13714    /// Parse an optional precision `(n)` and return it as `Some(n)` when present.
13715    pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
13716        if self.consume_token(&Token::LParen) {
13717            let n = self.parse_literal_uint()?;
13718            self.expect_token(&Token::RParen)?;
13719            Ok(Some(n))
13720        } else {
13721            Ok(None)
13722        }
13723    }
13724
13725    fn maybe_parse_optional_interval_fields(
13726        &mut self,
13727    ) -> Result<Option<IntervalFields>, ParserError> {
13728        match self.parse_one_of_keywords(&[
13729            // Can be followed by `TO` option
13730            Keyword::YEAR,
13731            Keyword::DAY,
13732            Keyword::HOUR,
13733            Keyword::MINUTE,
13734            // No `TO` option
13735            Keyword::MONTH,
13736            Keyword::SECOND,
13737        ]) {
13738            Some(Keyword::YEAR) => {
13739                if self.peek_keyword(Keyword::TO) {
13740                    self.expect_keyword(Keyword::TO)?;
13741                    self.expect_keyword(Keyword::MONTH)?;
13742                    Ok(Some(IntervalFields::YearToMonth))
13743                } else {
13744                    Ok(Some(IntervalFields::Year))
13745                }
13746            }
13747            Some(Keyword::DAY) => {
13748                if self.peek_keyword(Keyword::TO) {
13749                    self.expect_keyword(Keyword::TO)?;
13750                    match self.expect_one_of_keywords(&[
13751                        Keyword::HOUR,
13752                        Keyword::MINUTE,
13753                        Keyword::SECOND,
13754                    ])? {
13755                        Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
13756                        Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
13757                        Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
13758                        _ => {
13759                            self.prev_token();
13760                            self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
13761                        }
13762                    }
13763                } else {
13764                    Ok(Some(IntervalFields::Day))
13765                }
13766            }
13767            Some(Keyword::HOUR) => {
13768                if self.peek_keyword(Keyword::TO) {
13769                    self.expect_keyword(Keyword::TO)?;
13770                    match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
13771                        Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
13772                        Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
13773                        _ => {
13774                            self.prev_token();
13775                            self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
13776                        }
13777                    }
13778                } else {
13779                    Ok(Some(IntervalFields::Hour))
13780                }
13781            }
13782            Some(Keyword::MINUTE) => {
13783                if self.peek_keyword(Keyword::TO) {
13784                    self.expect_keyword(Keyword::TO)?;
13785                    self.expect_keyword(Keyword::SECOND)?;
13786                    Ok(Some(IntervalFields::MinuteToSecond))
13787                } else {
13788                    Ok(Some(IntervalFields::Minute))
13789                }
13790            }
13791            Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
13792            Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
13793            Some(_) => {
13794                self.prev_token();
13795                self.expected_ref(
13796                    "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
13797                    self.peek_token_ref(),
13798                )
13799            }
13800            None => Ok(None),
13801        }
13802    }
13803
13804    /// Parse datetime64 [1]
13805    /// Syntax
13806    /// ```sql
13807    /// DateTime64(precision[, timezone])
13808    /// ```
13809    ///
13810    /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/datetime64
13811    pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
13812        self.expect_keyword_is(Keyword::DATETIME64)?;
13813        self.expect_token(&Token::LParen)?;
13814        let precision = self.parse_literal_uint()?;
13815        let time_zone = if self.consume_token(&Token::Comma) {
13816            Some(self.parse_literal_string()?)
13817        } else {
13818            None
13819        };
13820        self.expect_token(&Token::RParen)?;
13821        Ok((precision, time_zone))
13822    }
13823
13824    /// Parse an optional character length specification `(n | MAX [CHARACTERS|OCTETS])`.
13825    pub fn parse_optional_character_length(
13826        &mut self,
13827    ) -> Result<Option<CharacterLength>, ParserError> {
13828        if self.consume_token(&Token::LParen) {
13829            let character_length = self.parse_character_length()?;
13830            self.expect_token(&Token::RParen)?;
13831            Ok(Some(character_length))
13832        } else {
13833            Ok(None)
13834        }
13835    }
13836
13837    /// Parse an optional binary length specification like `(n)`.
13838    pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
13839        if self.consume_token(&Token::LParen) {
13840            let binary_length = self.parse_binary_length()?;
13841            self.expect_token(&Token::RParen)?;
13842            Ok(Some(binary_length))
13843        } else {
13844            Ok(None)
13845        }
13846    }
13847
13848    /// Parse a character length, handling `MAX` or integer lengths with optional units.
13849    pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
13850        if self.parse_keyword(Keyword::MAX) {
13851            return Ok(CharacterLength::Max);
13852        }
13853        let length = self.parse_literal_uint()?;
13854        let unit = if self.parse_keyword(Keyword::CHARACTERS) {
13855            Some(CharLengthUnits::Characters)
13856        } else if self.parse_keyword(Keyword::OCTETS) {
13857            Some(CharLengthUnits::Octets)
13858        } else {
13859            None
13860        };
13861        Ok(CharacterLength::IntegerLength { length, unit })
13862    }
13863
13864    /// Parse a binary length specification, returning `BinaryLength`.
13865    pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
13866        if self.parse_keyword(Keyword::MAX) {
13867            return Ok(BinaryLength::Max);
13868        }
13869        let length = self.parse_literal_uint()?;
13870        Ok(BinaryLength::IntegerLength { length })
13871    }
13872
13873    /// Parse an optional `(precision[, scale])` and return `(Option<precision>, Option<scale>)`.
13874    pub fn parse_optional_precision_scale(
13875        &mut self,
13876    ) -> Result<(Option<u64>, Option<u64>), ParserError> {
13877        if self.consume_token(&Token::LParen) {
13878            let n = self.parse_literal_uint()?;
13879            let scale = if self.consume_token(&Token::Comma) {
13880                Some(self.parse_literal_uint()?)
13881            } else {
13882                None
13883            };
13884            self.expect_token(&Token::RParen)?;
13885            Ok((Some(n), scale))
13886        } else {
13887            Ok((None, None))
13888        }
13889    }
13890
13891    /// Parse exact-number precision/scale info like `(precision[, scale])` for decimal types.
13892    pub fn parse_exact_number_optional_precision_scale(
13893        &mut self,
13894    ) -> Result<ExactNumberInfo, ParserError> {
13895        if self.consume_token(&Token::LParen) {
13896            let precision = self.parse_literal_uint()?;
13897            let scale = if self.consume_token(&Token::Comma) {
13898                Some(self.parse_signed_integer()?)
13899            } else {
13900                None
13901            };
13902
13903            self.expect_token(&Token::RParen)?;
13904
13905            match scale {
13906                None => Ok(ExactNumberInfo::Precision(precision)),
13907                Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
13908            }
13909        } else {
13910            Ok(ExactNumberInfo::None)
13911        }
13912    }
13913
13914    /// Parse an optionally signed integer literal.
13915    fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
13916        let is_negative = self.consume_token(&Token::Minus);
13917
13918        if !is_negative {
13919            let _ = self.consume_token(&Token::Plus);
13920        }
13921
13922        let current_token = self.peek_token_ref();
13923        match &current_token.token {
13924            Token::Number(s, _) => {
13925                let s = s.clone();
13926                let span_start = current_token.span.start;
13927                self.advance_token();
13928                let value = Self::parse::<i64>(s, span_start)?;
13929                Ok(if is_negative { -value } else { value })
13930            }
13931            _ => self.expected_ref("number", current_token),
13932        }
13933    }
13934
13935    /// Parse optional type modifiers appearing in parentheses e.g. `(UNSIGNED, ZEROFILL)`.
13936    pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
13937        if self.consume_token(&Token::LParen) {
13938            let mut modifiers = Vec::new();
13939            loop {
13940                let next_token = self.next_token();
13941                match next_token.token {
13942                    Token::Word(w) => modifiers.push(w.to_string()),
13943                    Token::Number(n, _) => modifiers.push(n),
13944                    Token::SingleQuotedString(s) => modifiers.push(s),
13945
13946                    Token::Comma => {
13947                        continue;
13948                    }
13949                    Token::RParen => {
13950                        break;
13951                    }
13952                    _ => self.expected("type modifiers", next_token)?,
13953                }
13954            }
13955
13956            Ok(Some(modifiers))
13957        } else {
13958            Ok(None)
13959        }
13960    }
13961
13962    /// Parse a parenthesized sub data type
13963    fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
13964    where
13965        F: FnOnce(Box<DataType>) -> DataType,
13966    {
13967        self.expect_token(&Token::LParen)?;
13968        let inside_type = self.parse_data_type()?;
13969        self.expect_token(&Token::RParen)?;
13970        Ok(parent_type(inside_type.into()))
13971    }
13972
13973    /// Parse a DELETE statement, returning a `Box`ed SetExpr
13974    ///
13975    /// This is used to reduce the size of the stack frames in debug builds
13976    fn parse_delete_setexpr_boxed(
13977        &mut self,
13978        delete_token: TokenWithSpan,
13979    ) -> Result<Box<SetExpr>, ParserError> {
13980        Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
13981    }
13982
13983    /// Parse a `DELETE` statement and return `Statement::Delete`.
13984    pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
13985        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
13986        let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
13987            // `FROM` keyword is optional in BigQuery SQL.
13988            // https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#delete_statement
13989            if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
13990                (vec![], false)
13991            } else {
13992                let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
13993                self.expect_keyword_is(Keyword::FROM)?;
13994                (tables, true)
13995            }
13996        } else {
13997            (vec![], true)
13998        };
13999
14000        let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
14001
14002        let output = self.maybe_parse_output_clause()?;
14003
14004        let using = if self.parse_keyword(Keyword::USING) {
14005            Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
14006        } else {
14007            None
14008        };
14009        let selection = if self.parse_keyword(Keyword::WHERE) {
14010            Some(self.parse_expr()?)
14011        } else {
14012            None
14013        };
14014        let returning = if self.parse_keyword(Keyword::RETURNING) {
14015            Some(self.parse_comma_separated(Parser::parse_select_item)?)
14016        } else {
14017            None
14018        };
14019        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14020            self.parse_comma_separated(Parser::parse_order_by_expr)?
14021        } else {
14022            vec![]
14023        };
14024        let limit = if self.parse_keyword(Keyword::LIMIT) {
14025            self.parse_limit()?
14026        } else {
14027            None
14028        };
14029
14030        Ok(Statement::Delete(Delete {
14031            delete_token: delete_token.into(),
14032            optimizer_hints,
14033            tables,
14034            from: if with_from_keyword {
14035                FromTable::WithFromKeyword(from)
14036            } else {
14037                FromTable::WithoutKeyword(from)
14038            },
14039            using,
14040            selection,
14041            returning,
14042            output,
14043            order_by,
14044            limit,
14045        }))
14046    }
14047
14048    /// Parse a `KILL` statement, optionally specifying `CONNECTION`, `QUERY`, or `MUTATION`.
14049    /// KILL [CONNECTION | QUERY | MUTATION] processlist_id
14050    pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
14051        let modifier_keyword =
14052            self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
14053
14054        let id = self.parse_literal_uint()?;
14055
14056        let modifier = match modifier_keyword {
14057            Some(Keyword::CONNECTION) => Some(KillType::Connection),
14058            Some(Keyword::QUERY) => Some(KillType::Query),
14059            Some(Keyword::MUTATION) => {
14060                if dialect_of!(self is ClickHouseDialect | GenericDialect) {
14061                    Some(KillType::Mutation)
14062                } else {
14063                    self.expected_ref(
14064                        "Unsupported type for KILL, allowed: CONNECTION | QUERY",
14065                        self.peek_token_ref(),
14066                    )?
14067                }
14068            }
14069            _ => None,
14070        };
14071
14072        Ok(Statement::Kill { modifier, id })
14073    }
14074
14075    /// Parse an `EXPLAIN` statement, handling dialect-specific options and modifiers.
14076    pub fn parse_explain(
14077        &mut self,
14078        describe_alias: DescribeAlias,
14079    ) -> Result<Statement, ParserError> {
14080        let mut analyze = false;
14081        let mut verbose = false;
14082        let mut query_plan = false;
14083        let mut estimate = false;
14084        let mut format = None;
14085        let mut options = None;
14086
14087        // Note: DuckDB is compatible with PostgreSQL syntax for this statement,
14088        // although not all features may be implemented.
14089        if describe_alias == DescribeAlias::Explain
14090            && self.dialect.supports_explain_with_utility_options()
14091            && self.peek_token_ref().token == Token::LParen
14092        {
14093            options = Some(self.parse_utility_options()?)
14094        } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
14095            query_plan = true;
14096        } else if self.parse_keyword(Keyword::ESTIMATE) {
14097            estimate = true;
14098        } else {
14099            analyze = self.parse_keyword(Keyword::ANALYZE);
14100            verbose = self.parse_keyword(Keyword::VERBOSE);
14101            if self.parse_keyword(Keyword::FORMAT) {
14102                format = Some(self.parse_analyze_format_kind()?);
14103            }
14104        }
14105
14106        match self.maybe_parse(|parser| parser.parse_statement())? {
14107            Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
14108                ParserError::ParserError("Explain must be root of the plan".to_string()),
14109            ),
14110            Some(statement) => Ok(Statement::Explain {
14111                describe_alias,
14112                analyze,
14113                verbose,
14114                query_plan,
14115                estimate,
14116                statement: Box::new(statement),
14117                format,
14118                options,
14119            }),
14120            _ => {
14121                let hive_format =
14122                    match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
14123                        Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
14124                        Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
14125                        _ => None,
14126                    };
14127
14128                let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
14129                    // only allow to use TABLE keyword for DESC|DESCRIBE statement
14130                    self.parse_keyword(Keyword::TABLE)
14131                } else {
14132                    false
14133                };
14134
14135                let table_name = self.parse_object_name(false)?;
14136                Ok(Statement::ExplainTable {
14137                    describe_alias,
14138                    hive_format,
14139                    has_table_keyword,
14140                    table_name,
14141                })
14142            }
14143        }
14144    }
14145
14146    /// Parse a query expression, i.e. a `SELECT` statement optionally
14147    /// preceded with some `WITH` CTE declarations and optionally followed
14148    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
14149    /// expect the initial keyword to be already consumed
14150    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14151    pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14152        let _guard = self.recursion_counter.try_decrease()?;
14153        let with = if self.parse_keyword(Keyword::WITH) {
14154            let with_token = self.get_current_token();
14155            Some(With {
14156                with_token: with_token.clone().into(),
14157                recursive: self.parse_keyword(Keyword::RECURSIVE),
14158                cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14159            })
14160        } else {
14161            None
14162        };
14163        if self.parse_keyword(Keyword::INSERT) {
14164            Ok(Query {
14165                with,
14166                body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14167                order_by: None,
14168                limit_clause: None,
14169                fetch: None,
14170                locks: vec![],
14171                for_clause: None,
14172                settings: None,
14173                format_clause: None,
14174                pipe_operators: vec![],
14175            }
14176            .into())
14177        } else if self.parse_keyword(Keyword::UPDATE) {
14178            Ok(Query {
14179                with,
14180                body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14181                order_by: None,
14182                limit_clause: None,
14183                fetch: None,
14184                locks: vec![],
14185                for_clause: None,
14186                settings: None,
14187                format_clause: None,
14188                pipe_operators: vec![],
14189            }
14190            .into())
14191        } else if self.parse_keyword(Keyword::DELETE) {
14192            Ok(Query {
14193                with,
14194                body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14195                limit_clause: None,
14196                order_by: None,
14197                fetch: None,
14198                locks: vec![],
14199                for_clause: None,
14200                settings: None,
14201                format_clause: None,
14202                pipe_operators: vec![],
14203            }
14204            .into())
14205        } else if self.parse_keyword(Keyword::MERGE) {
14206            Ok(Query {
14207                with,
14208                body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14209                limit_clause: None,
14210                order_by: None,
14211                fetch: None,
14212                locks: vec![],
14213                for_clause: None,
14214                settings: None,
14215                format_clause: None,
14216                pipe_operators: vec![],
14217            }
14218            .into())
14219        } else {
14220            let body = self.parse_query_body(self.dialect.prec_unknown())?;
14221
14222            let order_by = self.parse_optional_order_by()?;
14223
14224            let limit_clause = self.parse_optional_limit_clause()?;
14225
14226            let settings = self.parse_settings()?;
14227
14228            let fetch = if self.parse_keyword(Keyword::FETCH) {
14229                Some(self.parse_fetch()?)
14230            } else {
14231                None
14232            };
14233
14234            let mut for_clause = None;
14235            let mut locks = Vec::new();
14236            while self.parse_keyword(Keyword::FOR) {
14237                if let Some(parsed_for_clause) = self.parse_for_clause()? {
14238                    for_clause = Some(parsed_for_clause);
14239                    break;
14240                } else {
14241                    locks.push(self.parse_lock()?);
14242                }
14243            }
14244            let format_clause =
14245                if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14246                    if self.parse_keyword(Keyword::NULL) {
14247                        Some(FormatClause::Null)
14248                    } else {
14249                        let ident = self.parse_identifier()?;
14250                        Some(FormatClause::Identifier(ident))
14251                    }
14252                } else {
14253                    None
14254                };
14255
14256            let pipe_operators = if self.dialect.supports_pipe_operator() {
14257                self.parse_pipe_operators()?
14258            } else {
14259                Vec::new()
14260            };
14261
14262            Ok(Query {
14263                with,
14264                body,
14265                order_by,
14266                limit_clause,
14267                fetch,
14268                locks,
14269                for_clause,
14270                settings,
14271                format_clause,
14272                pipe_operators,
14273            }
14274            .into())
14275        }
14276    }
14277
14278    fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14279        let mut pipe_operators = Vec::new();
14280
14281        while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14282            let kw = self.expect_one_of_keywords(&[
14283                Keyword::SELECT,
14284                Keyword::EXTEND,
14285                Keyword::SET,
14286                Keyword::DROP,
14287                Keyword::AS,
14288                Keyword::WHERE,
14289                Keyword::LIMIT,
14290                Keyword::AGGREGATE,
14291                Keyword::ORDER,
14292                Keyword::TABLESAMPLE,
14293                Keyword::RENAME,
14294                Keyword::UNION,
14295                Keyword::INTERSECT,
14296                Keyword::EXCEPT,
14297                Keyword::CALL,
14298                Keyword::PIVOT,
14299                Keyword::UNPIVOT,
14300                Keyword::JOIN,
14301                Keyword::INNER,
14302                Keyword::LEFT,
14303                Keyword::RIGHT,
14304                Keyword::FULL,
14305                Keyword::CROSS,
14306            ])?;
14307            match kw {
14308                Keyword::SELECT => {
14309                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14310                    pipe_operators.push(PipeOperator::Select { exprs })
14311                }
14312                Keyword::EXTEND => {
14313                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14314                    pipe_operators.push(PipeOperator::Extend { exprs })
14315                }
14316                Keyword::SET => {
14317                    let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14318                    pipe_operators.push(PipeOperator::Set { assignments })
14319                }
14320                Keyword::DROP => {
14321                    let columns = self.parse_identifiers()?;
14322                    pipe_operators.push(PipeOperator::Drop { columns })
14323                }
14324                Keyword::AS => {
14325                    let alias = self.parse_identifier()?;
14326                    pipe_operators.push(PipeOperator::As { alias })
14327                }
14328                Keyword::WHERE => {
14329                    let expr = self.parse_expr()?;
14330                    pipe_operators.push(PipeOperator::Where { expr })
14331                }
14332                Keyword::LIMIT => {
14333                    let expr = self.parse_expr()?;
14334                    let offset = if self.parse_keyword(Keyword::OFFSET) {
14335                        Some(self.parse_expr()?)
14336                    } else {
14337                        None
14338                    };
14339                    pipe_operators.push(PipeOperator::Limit { expr, offset })
14340                }
14341                Keyword::AGGREGATE => {
14342                    let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14343                        vec![]
14344                    } else {
14345                        self.parse_comma_separated(|parser| {
14346                            parser.parse_expr_with_alias_and_order_by()
14347                        })?
14348                    };
14349
14350                    let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14351                        self.parse_comma_separated(|parser| {
14352                            parser.parse_expr_with_alias_and_order_by()
14353                        })?
14354                    } else {
14355                        vec![]
14356                    };
14357
14358                    pipe_operators.push(PipeOperator::Aggregate {
14359                        full_table_exprs,
14360                        group_by_expr,
14361                    })
14362                }
14363                Keyword::ORDER => {
14364                    self.expect_one_of_keywords(&[Keyword::BY])?;
14365                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14366                    pipe_operators.push(PipeOperator::OrderBy { exprs })
14367                }
14368                Keyword::TABLESAMPLE => {
14369                    let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14370                    pipe_operators.push(PipeOperator::TableSample { sample });
14371                }
14372                Keyword::RENAME => {
14373                    let mappings =
14374                        self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14375                    pipe_operators.push(PipeOperator::Rename { mappings });
14376                }
14377                Keyword::UNION => {
14378                    let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14379                    let queries = self.parse_pipe_operator_queries()?;
14380                    pipe_operators.push(PipeOperator::Union {
14381                        set_quantifier,
14382                        queries,
14383                    });
14384                }
14385                Keyword::INTERSECT => {
14386                    let set_quantifier =
14387                        self.parse_distinct_required_set_quantifier("INTERSECT")?;
14388                    let queries = self.parse_pipe_operator_queries()?;
14389                    pipe_operators.push(PipeOperator::Intersect {
14390                        set_quantifier,
14391                        queries,
14392                    });
14393                }
14394                Keyword::EXCEPT => {
14395                    let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14396                    let queries = self.parse_pipe_operator_queries()?;
14397                    pipe_operators.push(PipeOperator::Except {
14398                        set_quantifier,
14399                        queries,
14400                    });
14401                }
14402                Keyword::CALL => {
14403                    let function_name = self.parse_object_name(false)?;
14404                    let function_expr = self.parse_function(function_name)?;
14405                    if let Expr::Function(function) = function_expr {
14406                        let alias = self.parse_identifier_optional_alias()?;
14407                        pipe_operators.push(PipeOperator::Call { function, alias });
14408                    } else {
14409                        return Err(ParserError::ParserError(
14410                            "Expected function call after CALL".to_string(),
14411                        ));
14412                    }
14413                }
14414                Keyword::PIVOT => {
14415                    self.expect_token(&Token::LParen)?;
14416                    let aggregate_functions =
14417                        self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14418                    self.expect_keyword_is(Keyword::FOR)?;
14419                    let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14420                    self.expect_keyword_is(Keyword::IN)?;
14421
14422                    self.expect_token(&Token::LParen)?;
14423                    let value_source = if self.parse_keyword(Keyword::ANY) {
14424                        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14425                            self.parse_comma_separated(Parser::parse_order_by_expr)?
14426                        } else {
14427                            vec![]
14428                        };
14429                        PivotValueSource::Any(order_by)
14430                    } else if self.peek_sub_query() {
14431                        PivotValueSource::Subquery(self.parse_query()?)
14432                    } else {
14433                        PivotValueSource::List(
14434                            self.parse_comma_separated(Self::parse_expr_with_alias)?,
14435                        )
14436                    };
14437                    self.expect_token(&Token::RParen)?;
14438                    self.expect_token(&Token::RParen)?;
14439
14440                    let alias = self.parse_identifier_optional_alias()?;
14441
14442                    pipe_operators.push(PipeOperator::Pivot {
14443                        aggregate_functions,
14444                        value_column,
14445                        value_source,
14446                        alias,
14447                    });
14448                }
14449                Keyword::UNPIVOT => {
14450                    self.expect_token(&Token::LParen)?;
14451                    let value_column = self.parse_identifier()?;
14452                    self.expect_keyword(Keyword::FOR)?;
14453                    let name_column = self.parse_identifier()?;
14454                    self.expect_keyword(Keyword::IN)?;
14455
14456                    self.expect_token(&Token::LParen)?;
14457                    let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
14458                    self.expect_token(&Token::RParen)?;
14459
14460                    self.expect_token(&Token::RParen)?;
14461
14462                    let alias = self.parse_identifier_optional_alias()?;
14463
14464                    pipe_operators.push(PipeOperator::Unpivot {
14465                        value_column,
14466                        name_column,
14467                        unpivot_columns,
14468                        alias,
14469                    });
14470                }
14471                Keyword::JOIN
14472                | Keyword::INNER
14473                | Keyword::LEFT
14474                | Keyword::RIGHT
14475                | Keyword::FULL
14476                | Keyword::CROSS => {
14477                    self.prev_token();
14478                    let mut joins = self.parse_joins()?;
14479                    if joins.len() != 1 {
14480                        return Err(ParserError::ParserError(
14481                            "Join pipe operator must have a single join".to_string(),
14482                        ));
14483                    }
14484                    let join = joins.swap_remove(0);
14485                    pipe_operators.push(PipeOperator::Join(join))
14486                }
14487                unhandled => {
14488                    return Err(ParserError::ParserError(format!(
14489                    "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
14490                )))
14491                }
14492            }
14493        }
14494        Ok(pipe_operators)
14495    }
14496
14497    fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
14498        let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
14499        {
14500            let key_values = self.parse_comma_separated(|p| {
14501                let key = p.parse_identifier()?;
14502                p.expect_token(&Token::Eq)?;
14503                let value = p.parse_expr()?;
14504                Ok(Setting { key, value })
14505            })?;
14506            Some(key_values)
14507        } else {
14508            None
14509        };
14510        Ok(settings)
14511    }
14512
14513    /// Parse a mssql `FOR [XML | JSON | BROWSE]` clause
14514    pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
14515        if self.parse_keyword(Keyword::XML) {
14516            Ok(Some(self.parse_for_xml()?))
14517        } else if self.parse_keyword(Keyword::JSON) {
14518            Ok(Some(self.parse_for_json()?))
14519        } else if self.parse_keyword(Keyword::BROWSE) {
14520            Ok(Some(ForClause::Browse))
14521        } else {
14522            Ok(None)
14523        }
14524    }
14525
14526    /// Parse a mssql `FOR XML` clause
14527    pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
14528        let for_xml = if self.parse_keyword(Keyword::RAW) {
14529            let mut element_name = None;
14530            if self.peek_token_ref().token == Token::LParen {
14531                self.expect_token(&Token::LParen)?;
14532                element_name = Some(self.parse_literal_string()?);
14533                self.expect_token(&Token::RParen)?;
14534            }
14535            ForXml::Raw(element_name)
14536        } else if self.parse_keyword(Keyword::AUTO) {
14537            ForXml::Auto
14538        } else if self.parse_keyword(Keyword::EXPLICIT) {
14539            ForXml::Explicit
14540        } else if self.parse_keyword(Keyword::PATH) {
14541            let mut element_name = None;
14542            if self.peek_token_ref().token == Token::LParen {
14543                self.expect_token(&Token::LParen)?;
14544                element_name = Some(self.parse_literal_string()?);
14545                self.expect_token(&Token::RParen)?;
14546            }
14547            ForXml::Path(element_name)
14548        } else {
14549            return Err(ParserError::ParserError(
14550                "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
14551            ));
14552        };
14553        let mut elements = false;
14554        let mut binary_base64 = false;
14555        let mut root = None;
14556        let mut r#type = false;
14557        while self.peek_token_ref().token == Token::Comma {
14558            self.next_token();
14559            if self.parse_keyword(Keyword::ELEMENTS) {
14560                elements = true;
14561            } else if self.parse_keyword(Keyword::BINARY) {
14562                self.expect_keyword_is(Keyword::BASE64)?;
14563                binary_base64 = true;
14564            } else if self.parse_keyword(Keyword::ROOT) {
14565                self.expect_token(&Token::LParen)?;
14566                root = Some(self.parse_literal_string()?);
14567                self.expect_token(&Token::RParen)?;
14568            } else if self.parse_keyword(Keyword::TYPE) {
14569                r#type = true;
14570            }
14571        }
14572        Ok(ForClause::Xml {
14573            for_xml,
14574            elements,
14575            binary_base64,
14576            root,
14577            r#type,
14578        })
14579    }
14580
14581    /// Parse a mssql `FOR JSON` clause
14582    pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
14583        let for_json = if self.parse_keyword(Keyword::AUTO) {
14584            ForJson::Auto
14585        } else if self.parse_keyword(Keyword::PATH) {
14586            ForJson::Path
14587        } else {
14588            return Err(ParserError::ParserError(
14589                "Expected FOR JSON [AUTO | PATH ]".to_string(),
14590            ));
14591        };
14592        let mut root = None;
14593        let mut include_null_values = false;
14594        let mut without_array_wrapper = false;
14595        while self.peek_token_ref().token == Token::Comma {
14596            self.next_token();
14597            if self.parse_keyword(Keyword::ROOT) {
14598                self.expect_token(&Token::LParen)?;
14599                root = Some(self.parse_literal_string()?);
14600                self.expect_token(&Token::RParen)?;
14601            } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
14602                include_null_values = true;
14603            } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
14604                without_array_wrapper = true;
14605            }
14606        }
14607        Ok(ForClause::Json {
14608            for_json,
14609            root,
14610            include_null_values,
14611            without_array_wrapper,
14612        })
14613    }
14614
14615    /// Parse a CTE (`alias [( col1, col2, ... )] [AS] (subquery)`)
14616    pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
14617        let name = self.parse_identifier()?;
14618
14619        let as_optional = self.dialect.supports_cte_without_as();
14620
14621        // If AS is optional, first try to parse `name (query)` directly
14622        if as_optional && !self.peek_keyword(Keyword::AS) {
14623            if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
14624                p.expect_token(&Token::LParen)?;
14625                let query = p.parse_query()?;
14626                let closing_paren_token = p.expect_token(&Token::RParen)?;
14627                Ok((query, closing_paren_token))
14628            })? {
14629                let mut cte = Cte {
14630                    alias: TableAlias {
14631                        explicit: false,
14632                        name,
14633                        columns: vec![],
14634                        at: None,
14635                    },
14636                    query,
14637                    from: None,
14638                    materialized: None,
14639                    closing_paren_token: closing_paren_token.into(),
14640                };
14641                if self.parse_keyword(Keyword::FROM) {
14642                    cte.from = Some(self.parse_identifier()?);
14643                }
14644                return Ok(cte);
14645            }
14646        }
14647
14648        // Determine column definitions and consume AS
14649        let columns = if self.parse_keyword(Keyword::AS) {
14650            vec![]
14651        } else {
14652            let columns = self.parse_table_alias_column_defs()?;
14653            if as_optional {
14654                let _ = self.parse_keyword(Keyword::AS);
14655            } else {
14656                self.expect_keyword_is(Keyword::AS)?;
14657            }
14658            columns
14659        };
14660
14661        let mut is_materialized = None;
14662        if dialect_of!(self is PostgreSqlDialect) {
14663            if self.parse_keyword(Keyword::MATERIALIZED) {
14664                is_materialized = Some(CteAsMaterialized::Materialized);
14665            } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
14666                is_materialized = Some(CteAsMaterialized::NotMaterialized);
14667            }
14668        }
14669
14670        self.expect_token(&Token::LParen)?;
14671        let query = self.parse_query()?;
14672        let closing_paren_token = self.expect_token(&Token::RParen)?;
14673
14674        let mut cte = Cte {
14675            alias: TableAlias {
14676                explicit: false,
14677                name,
14678                columns,
14679                at: None,
14680            },
14681            query,
14682            from: None,
14683            materialized: is_materialized,
14684            closing_paren_token: closing_paren_token.into(),
14685        };
14686        if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
14687            cte.from = Some(self.parse_identifier()?);
14688        }
14689        Ok(cte)
14690    }
14691
14692    /// Parse a "query body", which is an expression with roughly the
14693    /// following grammar:
14694    /// ```sql
14695    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
14696    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
14697    ///   subquery ::= query_body [ order_by_limit ]
14698    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
14699    /// ```
14700    pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
14701        // We parse the expression using a Pratt parser, as in `parse_expr()`.
14702        // Start by parsing a restricted SELECT or a `(subquery)`:
14703        let expr = if self.peek_keyword(Keyword::SELECT)
14704            || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
14705        {
14706            SetExpr::Select(self.parse_select().map(Box::new)?)
14707        } else if self.consume_token(&Token::LParen) {
14708            // CTEs are not allowed here, but the parser currently accepts them
14709            let subquery = self.parse_query()?;
14710            self.expect_token(&Token::RParen)?;
14711            SetExpr::Query(subquery)
14712        } else if self.parse_keyword(Keyword::VALUES) {
14713            let is_mysql = dialect_of!(self is MySqlDialect);
14714            SetExpr::Values(self.parse_values(is_mysql, false)?)
14715        } else if self.parse_keyword(Keyword::VALUE) {
14716            let is_mysql = dialect_of!(self is MySqlDialect);
14717            SetExpr::Values(self.parse_values(is_mysql, true)?)
14718        } else if self.parse_keyword(Keyword::TABLE) {
14719            SetExpr::Table(Box::new(self.parse_as_table()?))
14720        } else {
14721            return self.expected_ref(
14722                "SELECT, VALUES, or a subquery in the query body",
14723                self.peek_token_ref(),
14724            );
14725        };
14726
14727        self.parse_remaining_set_exprs(expr, precedence)
14728    }
14729
14730    /// Parse any extra set expressions that may be present in a query body
14731    ///
14732    /// (this is its own function to reduce required stack size in debug builds)
14733    fn parse_remaining_set_exprs(
14734        &mut self,
14735        mut expr: SetExpr,
14736        precedence: u8,
14737    ) -> Result<Box<SetExpr>, ParserError> {
14738        loop {
14739            // The query can be optionally followed by a set operator:
14740            let op = self.parse_set_operator(&self.peek_token().token);
14741            let next_precedence = match op {
14742                // UNION and EXCEPT have the same binding power and evaluate left-to-right
14743                Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
14744                    10
14745                }
14746                // INTERSECT has higher precedence than UNION/EXCEPT
14747                Some(SetOperator::Intersect) => 20,
14748                // Unexpected token or EOF => stop parsing the query body
14749                None => break,
14750            };
14751            if precedence >= next_precedence {
14752                break;
14753            }
14754            self.next_token(); // skip past the set operator
14755            let set_quantifier = self.parse_set_quantifier(&op);
14756            expr = SetExpr::SetOperation {
14757                left: Box::new(expr),
14758                op: op.unwrap(),
14759                set_quantifier,
14760                right: self.parse_query_body(next_precedence)?,
14761            };
14762        }
14763
14764        Ok(expr.into())
14765    }
14766
14767    /// Parse a set operator token into its `SetOperator` variant.
14768    pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
14769        match token {
14770            Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
14771            Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
14772            Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
14773            Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
14774            _ => None,
14775        }
14776    }
14777
14778    /// Parse a set quantifier (e.g., `ALL`, `DISTINCT BY NAME`) for the given set operator.
14779    pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
14780        match op {
14781            Some(
14782                SetOperator::Except
14783                | SetOperator::Intersect
14784                | SetOperator::Union
14785                | SetOperator::Minus,
14786            ) => {
14787                if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
14788                    SetQuantifier::DistinctByName
14789                } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14790                    SetQuantifier::ByName
14791                } else if self.parse_keyword(Keyword::ALL) {
14792                    if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14793                        SetQuantifier::AllByName
14794                    } else {
14795                        SetQuantifier::All
14796                    }
14797                } else if self.parse_keyword(Keyword::DISTINCT) {
14798                    SetQuantifier::Distinct
14799                } else {
14800                    SetQuantifier::None
14801                }
14802            }
14803            _ => SetQuantifier::None,
14804        }
14805    }
14806
14807    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`)
14808    pub fn parse_select(&mut self) -> Result<Select, ParserError> {
14809        let mut from_first = None;
14810
14811        if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
14812            let from_token = self.expect_keyword(Keyword::FROM)?;
14813            let from = self.parse_table_with_joins()?;
14814            if !self.peek_keyword(Keyword::SELECT) {
14815                return Ok(Select {
14816                    select_token: AttachedToken(from_token),
14817                    optimizer_hints: vec![],
14818                    distinct: None,
14819                    select_modifiers: None,
14820                    top: None,
14821                    top_before_distinct: false,
14822                    projection: vec![],
14823                    exclude: None,
14824                    into: None,
14825                    from,
14826                    lateral_views: vec![],
14827                    prewhere: None,
14828                    selection: None,
14829                    group_by: GroupByExpr::Expressions(vec![], vec![]),
14830                    cluster_by: vec![],
14831                    distribute_by: vec![],
14832                    sort_by: vec![],
14833                    having: None,
14834                    named_window: vec![],
14835                    window_before_qualify: false,
14836                    qualify: None,
14837                    value_table_mode: None,
14838                    connect_by: vec![],
14839                    flavor: SelectFlavor::FromFirstNoSelect,
14840                });
14841            }
14842            from_first = Some(from);
14843        }
14844
14845        let select_token = self.expect_keyword(Keyword::SELECT)?;
14846        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14847        let value_table_mode = self.parse_value_table_mode()?;
14848
14849        let (select_modifiers, distinct_select_modifier) =
14850            if self.dialect.supports_select_modifiers() {
14851                self.parse_select_modifiers()?
14852            } else {
14853                (None, None)
14854            };
14855
14856        let mut top_before_distinct = false;
14857        let mut top = None;
14858        if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14859            top = Some(self.parse_top()?);
14860            top_before_distinct = true;
14861        }
14862
14863        let distinct = if distinct_select_modifier.is_some() {
14864            distinct_select_modifier
14865        } else {
14866            self.parse_all_or_distinct()?
14867        };
14868
14869        if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14870            top = Some(self.parse_top()?);
14871        }
14872
14873        let projection =
14874            if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
14875                vec![]
14876            } else {
14877                self.parse_projection()?
14878            };
14879
14880        let exclude = if self.dialect.supports_select_exclude() {
14881            self.parse_optional_select_item_exclude()?
14882        } else {
14883            None
14884        };
14885
14886        let into = if self.parse_keyword(Keyword::INTO) {
14887            Some(self.parse_select_into()?)
14888        } else {
14889            None
14890        };
14891
14892        // Note that for keywords to be properly handled here, they need to be
14893        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
14894        // otherwise they may be parsed as an alias as part of the `projection`
14895        // or `from`.
14896
14897        let (from, from_first) = if let Some(from) = from_first.take() {
14898            (from, true)
14899        } else if self.parse_keyword(Keyword::FROM) {
14900            (self.parse_table_with_joins()?, false)
14901        } else {
14902            (vec![], false)
14903        };
14904
14905        let mut lateral_views = vec![];
14906        loop {
14907            if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
14908                let outer = self.parse_keyword(Keyword::OUTER);
14909                let lateral_view = self.parse_expr()?;
14910                let lateral_view_name = self.parse_object_name(false)?;
14911                let lateral_col_alias = self
14912                    .parse_comma_separated(|parser| {
14913                        parser.parse_optional_alias(&[
14914                            Keyword::WHERE,
14915                            Keyword::GROUP,
14916                            Keyword::CLUSTER,
14917                            Keyword::HAVING,
14918                            Keyword::LATERAL,
14919                        ]) // This couldn't possibly be a bad idea
14920                    })?
14921                    .into_iter()
14922                    .flatten()
14923                    .collect();
14924
14925                lateral_views.push(LateralView {
14926                    lateral_view,
14927                    lateral_view_name,
14928                    lateral_col_alias,
14929                    outer,
14930                });
14931            } else {
14932                break;
14933            }
14934        }
14935
14936        let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
14937        {
14938            Some(self.parse_expr()?)
14939        } else {
14940            None
14941        };
14942
14943        let selection = if self.parse_keyword(Keyword::WHERE) {
14944            Some(self.parse_expr()?)
14945        } else {
14946            None
14947        };
14948
14949        let connect_by = self.maybe_parse_connect_by()?;
14950
14951        let group_by = self
14952            .parse_optional_group_by()?
14953            .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
14954
14955        let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
14956            self.parse_comma_separated(Parser::parse_expr)?
14957        } else {
14958            vec![]
14959        };
14960
14961        let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
14962            self.parse_comma_separated(Parser::parse_expr)?
14963        } else {
14964            vec![]
14965        };
14966
14967        let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
14968            self.parse_comma_separated(Parser::parse_order_by_expr)?
14969        } else {
14970            vec![]
14971        };
14972
14973        let having = if self.parse_keyword(Keyword::HAVING) {
14974            Some(self.parse_expr()?)
14975        } else {
14976            None
14977        };
14978
14979        // Accept QUALIFY and WINDOW in any order and flag accordingly.
14980        let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
14981        {
14982            let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
14983            if self.parse_keyword(Keyword::QUALIFY) {
14984                (named_windows, Some(self.parse_expr()?), true)
14985            } else {
14986                (named_windows, None, true)
14987            }
14988        } else if self.parse_keyword(Keyword::QUALIFY) {
14989            let qualify = Some(self.parse_expr()?);
14990            if self.parse_keyword(Keyword::WINDOW) {
14991                (
14992                    self.parse_comma_separated(Parser::parse_named_window)?,
14993                    qualify,
14994                    false,
14995                )
14996            } else {
14997                (Default::default(), qualify, false)
14998            }
14999        } else {
15000            Default::default()
15001        };
15002
15003        Ok(Select {
15004            select_token: AttachedToken(select_token),
15005            optimizer_hints,
15006            distinct,
15007            select_modifiers,
15008            top,
15009            top_before_distinct,
15010            projection,
15011            exclude,
15012            into,
15013            from,
15014            lateral_views,
15015            prewhere,
15016            selection,
15017            group_by,
15018            cluster_by,
15019            distribute_by,
15020            sort_by,
15021            having,
15022            named_window: named_windows,
15023            window_before_qualify,
15024            qualify,
15025            value_table_mode,
15026            connect_by,
15027            flavor: if from_first {
15028                SelectFlavor::FromFirst
15029            } else {
15030                SelectFlavor::Standard
15031            },
15032        })
15033    }
15034
15035    /// Parses optimizer hints at the current token position.
15036    ///
15037    /// Collects all `/*prefix+...*/` and `--prefix+...` patterns.
15038    /// The `prefix` is any run of ASCII alphanumeric characters between the
15039    /// comment marker and `+` (e.g. `""` for `/*+...*/`, `"abc"` for `/*abc+...*/`).
15040    ///
15041    /// [MySQL](https://dev.mysql.com/doc/refman/8.4/en/optimizer-hints.html#optimizer-hints-overview)
15042    /// [Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Comments.html#GUID-D316D545-89E2-4D54-977F-FC97815CD62E)
15043    fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
15044        let supports_hints = self.dialect.supports_comment_optimizer_hint();
15045        if !supports_hints {
15046            return Ok(vec![]);
15047        }
15048        let mut hints = vec![];
15049        loop {
15050            let t = self.peek_nth_token_no_skip_ref(0);
15051            let Token::Whitespace(ws) = &t.token else {
15052                break;
15053            };
15054            match ws {
15055                Whitespace::SingleLineComment { comment, prefix } => {
15056                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15057                        hints.push(OptimizerHint {
15058                            prefix: hint_prefix,
15059                            text,
15060                            style: OptimizerHintStyle::SingleLine {
15061                                prefix: prefix.clone(),
15062                            },
15063                        });
15064                    }
15065                    self.next_token_no_skip();
15066                }
15067                Whitespace::MultiLineComment(comment) => {
15068                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15069                        hints.push(OptimizerHint {
15070                            prefix: hint_prefix,
15071                            text,
15072                            style: OptimizerHintStyle::MultiLine,
15073                        });
15074                    }
15075                    self.next_token_no_skip();
15076                }
15077                Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
15078                    self.next_token_no_skip();
15079                }
15080            }
15081        }
15082        Ok(hints)
15083    }
15084
15085    /// Checks if a comment's content starts with `[ASCII-alphanumeric]*+`
15086    /// and returns `(prefix, text_after_plus)` if so.
15087    fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
15088        let (before_plus, text) = comment.split_once('+')?;
15089        if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
15090            Some((before_plus.to_string(), text.to_string()))
15091        } else {
15092            None
15093        }
15094    }
15095
15096    /// Parses MySQL SELECT modifiers and DISTINCT/ALL in any order.
15097    ///
15098    /// Manual testing shows odifiers can appear in any order, and modifiers other than DISTINCT/ALL
15099    /// can be repeated.
15100    ///
15101    /// <https://dev.mysql.com/doc/refman/8.4/en/select.html>
15102    fn parse_select_modifiers(
15103        &mut self,
15104    ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
15105        let mut modifiers = SelectModifiers::default();
15106        let mut distinct = None;
15107
15108        let keywords = &[
15109            Keyword::ALL,
15110            Keyword::DISTINCT,
15111            Keyword::DISTINCTROW,
15112            Keyword::HIGH_PRIORITY,
15113            Keyword::STRAIGHT_JOIN,
15114            Keyword::SQL_SMALL_RESULT,
15115            Keyword::SQL_BIG_RESULT,
15116            Keyword::SQL_BUFFER_RESULT,
15117            Keyword::SQL_NO_CACHE,
15118            Keyword::SQL_CALC_FOUND_ROWS,
15119        ];
15120
15121        while let Some(keyword) = self.parse_one_of_keywords(keywords) {
15122            match keyword {
15123                Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
15124                    self.prev_token();
15125                    distinct = self.parse_all_or_distinct()?;
15126                }
15127                // DISTINCTROW is a MySQL-specific legacy (but not deprecated) alias for DISTINCT
15128                Keyword::DISTINCTROW if distinct.is_none() => {
15129                    distinct = Some(Distinct::Distinct);
15130                }
15131                Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15132                Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15133                Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15134                Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15135                Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15136                Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15137                Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15138                _ => {
15139                    self.prev_token();
15140                    return self.expected_ref(
15141                        "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15142                        self.peek_token_ref(),
15143                    );
15144                }
15145            }
15146        }
15147
15148        // Avoid polluting the AST with `Some(SelectModifiers::default())` empty value unless there
15149        // actually were some modifiers set.
15150        let select_modifiers = if modifiers.is_any_set() {
15151            Some(modifiers)
15152        } else {
15153            None
15154        };
15155        Ok((select_modifiers, distinct))
15156    }
15157
15158    fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15159        if !dialect_of!(self is BigQueryDialect) {
15160            return Ok(None);
15161        }
15162
15163        let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15164            Some(ValueTableMode::DistinctAsValue)
15165        } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15166            Some(ValueTableMode::DistinctAsStruct)
15167        } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15168            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15169        {
15170            Some(ValueTableMode::AsValue)
15171        } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15172            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15173        {
15174            Some(ValueTableMode::AsStruct)
15175        } else if self.parse_keyword(Keyword::AS) {
15176            self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15177        } else {
15178            None
15179        };
15180
15181        Ok(mode)
15182    }
15183
15184    /// Invoke `f` after first setting the parser's `ParserState` to `state`.
15185    ///
15186    /// Upon return, restores the parser's state to what it started at.
15187    fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15188    where
15189        F: FnMut(&mut Parser) -> Result<T, ParserError>,
15190    {
15191        let current_state = self.state;
15192        self.state = state;
15193        let res = f(self);
15194        self.state = current_state;
15195        res
15196    }
15197
15198    /// Parse a `CONNECT BY` clause (Oracle-style hierarchical query support).
15199    pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15200        let mut clauses = Vec::with_capacity(2);
15201        loop {
15202            if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15203                clauses.push(ConnectByKind::StartWith {
15204                    start_token: self.token_at(idx).clone().into(),
15205                    condition: self.parse_expr()?.into(),
15206                });
15207            } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15208            {
15209                clauses.push(ConnectByKind::ConnectBy {
15210                    connect_token: self.token_at(idx).clone().into(),
15211                    nocycle: self.parse_keyword(Keyword::NOCYCLE),
15212                    relationships: self.with_state(ParserState::ConnectBy, |parser| {
15213                        parser.parse_comma_separated(Parser::parse_expr)
15214                    })?,
15215                });
15216            } else {
15217                break;
15218            }
15219        }
15220        Ok(clauses)
15221    }
15222
15223    /// Parse `CREATE TABLE x AS TABLE y`
15224    pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15225        let token1 = self.next_token();
15226        let token2 = self.next_token();
15227        let token3 = self.next_token();
15228
15229        let table_name;
15230        let schema_name;
15231        if token2 == Token::Period {
15232            match token1.token {
15233                Token::Word(w) => {
15234                    schema_name = w.value;
15235                }
15236                _ => {
15237                    return self.expected("Schema name", token1);
15238                }
15239            }
15240            match token3.token {
15241                Token::Word(w) => {
15242                    table_name = w.value;
15243                }
15244                _ => {
15245                    return self.expected("Table name", token3);
15246                }
15247            }
15248            Ok(Table {
15249                table_name: Some(table_name),
15250                schema_name: Some(schema_name),
15251            })
15252        } else {
15253            match token1.token {
15254                Token::Word(w) => {
15255                    table_name = w.value;
15256                }
15257                _ => {
15258                    return self.expected("Table name", token1);
15259                }
15260            }
15261            Ok(Table {
15262                table_name: Some(table_name),
15263                schema_name: None,
15264            })
15265        }
15266    }
15267
15268    /// Parse a `SET ROLE` statement. Expects SET to be consumed already.
15269    fn parse_set_role(
15270        &mut self,
15271        modifier: Option<ContextModifier>,
15272    ) -> Result<Statement, ParserError> {
15273        self.expect_keyword_is(Keyword::ROLE)?;
15274
15275        let role_name = if self.parse_keyword(Keyword::NONE) {
15276            None
15277        } else {
15278            Some(self.parse_identifier()?)
15279        };
15280        Ok(Statement::Set(Set::SetRole {
15281            context_modifier: modifier,
15282            role_name,
15283        }))
15284    }
15285
15286    fn parse_set_values(
15287        &mut self,
15288        parenthesized_assignment: bool,
15289    ) -> Result<Vec<Expr>, ParserError> {
15290        let mut values = vec![];
15291
15292        if parenthesized_assignment {
15293            self.expect_token(&Token::LParen)?;
15294        }
15295
15296        loop {
15297            let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15298                expr
15299            } else if let Ok(expr) = self.parse_expr() {
15300                expr
15301            } else {
15302                self.expected_ref("variable value", self.peek_token_ref())?
15303            };
15304
15305            values.push(value);
15306            if self.consume_token(&Token::Comma) {
15307                continue;
15308            }
15309
15310            if parenthesized_assignment {
15311                self.expect_token(&Token::RParen)?;
15312            }
15313            return Ok(values);
15314        }
15315    }
15316
15317    fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15318        let modifier =
15319            self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15320
15321        Self::keyword_to_modifier(modifier)
15322    }
15323
15324    /// Parse a single SET statement assignment `var = expr`.
15325    fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15326        let scope = self.parse_context_modifier();
15327
15328        let name = if self.dialect.supports_parenthesized_set_variables()
15329            && self.consume_token(&Token::LParen)
15330        {
15331            // Parenthesized assignments are handled in the `parse_set` function after
15332            // trying to parse list of assignments using this function.
15333            // If a dialect supports both, and we find a LParen, we early exit from this function.
15334            self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15335        } else {
15336            self.parse_object_name(false)?
15337        };
15338
15339        if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15340            return self.expected_ref("assignment operator", self.peek_token_ref());
15341        }
15342
15343        let value = self.parse_expr()?;
15344
15345        Ok(SetAssignment { scope, name, value })
15346    }
15347
15348    fn parse_set(&mut self) -> Result<Statement, ParserError> {
15349        let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15350
15351        // Modifier is either HIVEVAR: or a ContextModifier (LOCAL, SESSION, etc), not both
15352        let scope = if !hivevar {
15353            self.parse_context_modifier()
15354        } else {
15355            None
15356        };
15357
15358        if hivevar {
15359            self.expect_token(&Token::Colon)?;
15360        }
15361
15362        if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15363            return Ok(set_role_stmt);
15364        }
15365
15366        // Handle special cases first
15367        if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15368            || self.parse_keyword(Keyword::TIMEZONE)
15369        {
15370            if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15371                return Ok(Set::SingleAssignment {
15372                    scope,
15373                    hivevar,
15374                    variable: ObjectName::from(vec!["TIMEZONE".into()]),
15375                    values: self.parse_set_values(false)?,
15376                }
15377                .into());
15378            } else {
15379                // A shorthand alias for SET TIME ZONE that doesn't require
15380                // the assignment operator. It's originally PostgreSQL specific,
15381                // but we allow it for all the dialects
15382                return Ok(Set::SetTimeZone {
15383                    local: scope == Some(ContextModifier::Local),
15384                    value: self.parse_expr()?,
15385                }
15386                .into());
15387            }
15388        } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15389            if self.parse_keyword(Keyword::DEFAULT) {
15390                return Ok(Set::SetNamesDefault {}.into());
15391            }
15392            let charset_name = self.parse_identifier()?;
15393            let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15394                Some(self.parse_literal_string()?)
15395            } else {
15396                None
15397            };
15398
15399            return Ok(Set::SetNames {
15400                charset_name,
15401                collation_name,
15402            }
15403            .into());
15404        } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15405            self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15406            return Ok(Set::SetTransaction {
15407                modes: self.parse_transaction_modes()?,
15408                snapshot: None,
15409                session: true,
15410            }
15411            .into());
15412        } else if self.parse_keyword(Keyword::TRANSACTION) {
15413            if self.parse_keyword(Keyword::SNAPSHOT) {
15414                let snapshot_id = self.parse_value()?;
15415                return Ok(Set::SetTransaction {
15416                    modes: vec![],
15417                    snapshot: Some(snapshot_id),
15418                    session: false,
15419                }
15420                .into());
15421            }
15422            return Ok(Set::SetTransaction {
15423                modes: self.parse_transaction_modes()?,
15424                snapshot: None,
15425                session: false,
15426            }
15427            .into());
15428        } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15429            let scope = match scope {
15430                Some(s) => s,
15431                None => {
15432                    return self.expected_at(
15433                        "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15434                        self.get_current_index(),
15435                    )
15436                }
15437            };
15438            let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
15439                SetSessionAuthorizationParamKind::Default
15440            } else {
15441                let value = self.parse_identifier()?;
15442                SetSessionAuthorizationParamKind::User(value)
15443            };
15444            return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
15445                scope,
15446                kind: auth_value,
15447            })
15448            .into());
15449        }
15450
15451        if self.dialect.supports_comma_separated_set_assignments() {
15452            if scope.is_some() {
15453                self.prev_token();
15454            }
15455
15456            if let Some(assignments) = self
15457                .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
15458            {
15459                return if assignments.len() > 1 {
15460                    Ok(Set::MultipleAssignments { assignments }.into())
15461                } else {
15462                    let SetAssignment { scope, name, value } =
15463                        assignments.into_iter().next().ok_or_else(|| {
15464                            ParserError::ParserError("Expected at least one assignment".to_string())
15465                        })?;
15466
15467                    Ok(Set::SingleAssignment {
15468                        scope,
15469                        hivevar,
15470                        variable: name,
15471                        values: vec![value],
15472                    }
15473                    .into())
15474                };
15475            }
15476        }
15477
15478        let variables = if self.dialect.supports_parenthesized_set_variables()
15479            && self.consume_token(&Token::LParen)
15480        {
15481            let vars = OneOrManyWithParens::Many(
15482                self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
15483                    .into_iter()
15484                    .map(|ident| ObjectName::from(vec![ident]))
15485                    .collect(),
15486            );
15487            self.expect_token(&Token::RParen)?;
15488            vars
15489        } else {
15490            OneOrManyWithParens::One(self.parse_object_name(false)?)
15491        };
15492
15493        if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15494            let stmt = match variables {
15495                OneOrManyWithParens::One(var) => Set::SingleAssignment {
15496                    scope,
15497                    hivevar,
15498                    variable: var,
15499                    values: self.parse_set_values(false)?,
15500                },
15501                OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
15502                    variables: vars,
15503                    values: self.parse_set_values(true)?,
15504                },
15505            };
15506
15507            return Ok(stmt.into());
15508        }
15509
15510        if self.dialect.supports_set_stmt_without_operator() {
15511            self.prev_token();
15512            return self.parse_set_session_params();
15513        };
15514
15515        self.expected_ref("equals sign or TO", self.peek_token_ref())
15516    }
15517
15518    /// Parse session parameter assignments after `SET` when no `=` or `TO` is present.
15519    pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
15520        if self.parse_keyword(Keyword::STATISTICS) {
15521            let topic = match self.parse_one_of_keywords(&[
15522                Keyword::IO,
15523                Keyword::PROFILE,
15524                Keyword::TIME,
15525                Keyword::XML,
15526            ]) {
15527                Some(Keyword::IO) => SessionParamStatsTopic::IO,
15528                Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
15529                Some(Keyword::TIME) => SessionParamStatsTopic::Time,
15530                Some(Keyword::XML) => SessionParamStatsTopic::Xml,
15531                _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
15532            };
15533            let value = self.parse_session_param_value()?;
15534            Ok(
15535                Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
15536                    topic,
15537                    value,
15538                }))
15539                .into(),
15540            )
15541        } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
15542            let obj = self.parse_object_name(false)?;
15543            let value = self.parse_session_param_value()?;
15544            Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
15545                SetSessionParamIdentityInsert { obj, value },
15546            ))
15547            .into())
15548        } else if self.parse_keyword(Keyword::OFFSETS) {
15549            let keywords = self.parse_comma_separated(|parser| {
15550                let next_token = parser.next_token();
15551                match &next_token.token {
15552                    Token::Word(w) => Ok(w.to_string()),
15553                    _ => parser.expected("SQL keyword", next_token),
15554                }
15555            })?;
15556            let value = self.parse_session_param_value()?;
15557            Ok(
15558                Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
15559                    keywords,
15560                    value,
15561                }))
15562                .into(),
15563            )
15564        } else {
15565            let names = self.parse_comma_separated(|parser| {
15566                let next_token = parser.next_token();
15567                match next_token.token {
15568                    Token::Word(w) => Ok(w.to_string()),
15569                    _ => parser.expected("Session param name", next_token),
15570                }
15571            })?;
15572            let value = self.parse_expr()?.to_string();
15573            Ok(
15574                Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
15575                    names,
15576                    value,
15577                }))
15578                .into(),
15579            )
15580        }
15581    }
15582
15583    fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
15584        if self.parse_keyword(Keyword::ON) {
15585            Ok(SessionParamValue::On)
15586        } else if self.parse_keyword(Keyword::OFF) {
15587            Ok(SessionParamValue::Off)
15588        } else {
15589            self.expected_ref("ON or OFF", self.peek_token_ref())
15590        }
15591    }
15592
15593    /// Parse a `SHOW` statement and dispatch to specific SHOW handlers.
15594    pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
15595        let terse = self.parse_keyword(Keyword::TERSE);
15596        let extended = self.parse_keyword(Keyword::EXTENDED);
15597        let full = self.parse_keyword(Keyword::FULL);
15598        let session = self.parse_keyword(Keyword::SESSION);
15599        let global = self.parse_keyword(Keyword::GLOBAL);
15600        let external = self.parse_keyword(Keyword::EXTERNAL);
15601        if self
15602            .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
15603            .is_some()
15604        {
15605            Ok(self.parse_show_columns(extended, full)?)
15606        } else if self.parse_keyword(Keyword::TABLES) {
15607            Ok(self.parse_show_tables(terse, extended, full, external)?)
15608        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
15609            Ok(self.parse_show_views(terse, true)?)
15610        } else if self.parse_keyword(Keyword::VIEWS) {
15611            Ok(self.parse_show_views(terse, false)?)
15612        } else if self.parse_keyword(Keyword::FUNCTIONS) {
15613            Ok(self.parse_show_functions()?)
15614        } else if self.parse_keyword(Keyword::PROCESSLIST) {
15615            Ok(Statement::ShowProcessList { full })
15616        } else if extended || full {
15617            Err(ParserError::ParserError(
15618                "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
15619            ))
15620        } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
15621            Ok(self.parse_show_create()?)
15622        } else if self.parse_keyword(Keyword::COLLATION) {
15623            Ok(self.parse_show_collation()?)
15624        } else if self.parse_keyword(Keyword::VARIABLES)
15625            && dialect_of!(self is MySqlDialect | GenericDialect)
15626        {
15627            Ok(Statement::ShowVariables {
15628                filter: self.parse_show_statement_filter()?,
15629                session,
15630                global,
15631            })
15632        } else if self.parse_keyword(Keyword::STATUS)
15633            && dialect_of!(self is MySqlDialect | GenericDialect)
15634        {
15635            Ok(Statement::ShowStatus {
15636                filter: self.parse_show_statement_filter()?,
15637                session,
15638                global,
15639            })
15640        } else if self.parse_keyword(Keyword::CATALOGS) {
15641            self.parse_show_catalogs(terse)
15642        } else if self.parse_keyword(Keyword::DATABASES) {
15643            self.parse_show_databases(terse)
15644        } else if self.parse_keyword(Keyword::SCHEMAS) {
15645            self.parse_show_schemas(terse)
15646        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
15647            self.parse_show_charset(false)
15648        } else if self.parse_keyword(Keyword::CHARSET) {
15649            self.parse_show_charset(true)
15650        } else {
15651            Ok(Statement::ShowVariable {
15652                variable: self.parse_identifiers()?,
15653            })
15654        }
15655    }
15656
15657    fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
15658        // parse one of keywords
15659        Ok(Statement::ShowCharset(ShowCharset {
15660            is_shorthand,
15661            filter: self.parse_show_statement_filter()?,
15662        }))
15663    }
15664
15665    fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
15666        let history = self.parse_keyword(Keyword::HISTORY);
15667        let show_options = self.parse_show_stmt_options()?;
15668        Ok(Statement::ShowCatalogs {
15669            terse,
15670            history,
15671            show_options,
15672        })
15673    }
15674
15675    fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
15676        let history = self.parse_keyword(Keyword::HISTORY);
15677        let show_options = self.parse_show_stmt_options()?;
15678        Ok(Statement::ShowDatabases {
15679            terse,
15680            history,
15681            show_options,
15682        })
15683    }
15684
15685    fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
15686        let history = self.parse_keyword(Keyword::HISTORY);
15687        let show_options = self.parse_show_stmt_options()?;
15688        Ok(Statement::ShowSchemas {
15689            terse,
15690            history,
15691            show_options,
15692        })
15693    }
15694
15695    /// Parse `SHOW CREATE <object>` returning the corresponding `ShowCreate` statement.
15696    pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
15697        let obj_type = match self.expect_one_of_keywords(&[
15698            Keyword::TABLE,
15699            Keyword::TRIGGER,
15700            Keyword::FUNCTION,
15701            Keyword::PROCEDURE,
15702            Keyword::EVENT,
15703            Keyword::VIEW,
15704        ])? {
15705            Keyword::TABLE => Ok(ShowCreateObject::Table),
15706            Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
15707            Keyword::FUNCTION => Ok(ShowCreateObject::Function),
15708            Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
15709            Keyword::EVENT => Ok(ShowCreateObject::Event),
15710            Keyword::VIEW => Ok(ShowCreateObject::View),
15711            keyword => Err(ParserError::ParserError(format!(
15712                "Unable to map keyword to ShowCreateObject: {keyword:?}"
15713            ))),
15714        }?;
15715
15716        let obj_name = self.parse_object_name(false)?;
15717
15718        Ok(Statement::ShowCreate { obj_type, obj_name })
15719    }
15720
15721    /// Parse `SHOW COLUMNS`/`SHOW FIELDS` and return a `ShowColumns` statement.
15722    pub fn parse_show_columns(
15723        &mut self,
15724        extended: bool,
15725        full: bool,
15726    ) -> Result<Statement, ParserError> {
15727        let show_options = self.parse_show_stmt_options()?;
15728        Ok(Statement::ShowColumns {
15729            extended,
15730            full,
15731            show_options,
15732        })
15733    }
15734
15735    fn parse_show_tables(
15736        &mut self,
15737        terse: bool,
15738        extended: bool,
15739        full: bool,
15740        external: bool,
15741    ) -> Result<Statement, ParserError> {
15742        let history = !external && self.parse_keyword(Keyword::HISTORY);
15743        let show_options = self.parse_show_stmt_options()?;
15744        Ok(Statement::ShowTables {
15745            terse,
15746            history,
15747            extended,
15748            full,
15749            external,
15750            show_options,
15751        })
15752    }
15753
15754    fn parse_show_views(
15755        &mut self,
15756        terse: bool,
15757        materialized: bool,
15758    ) -> Result<Statement, ParserError> {
15759        let show_options = self.parse_show_stmt_options()?;
15760        Ok(Statement::ShowViews {
15761            materialized,
15762            terse,
15763            show_options,
15764        })
15765    }
15766
15767    /// Parse `SHOW FUNCTIONS` and optional filter.
15768    pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
15769        let filter = self.parse_show_statement_filter()?;
15770        Ok(Statement::ShowFunctions { filter })
15771    }
15772
15773    /// Parse `SHOW COLLATION` and optional filter.
15774    pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
15775        let filter = self.parse_show_statement_filter()?;
15776        Ok(Statement::ShowCollation { filter })
15777    }
15778
15779    /// Parse an optional filter used by `SHOW` statements (LIKE, ILIKE, WHERE, or literal).
15780    pub fn parse_show_statement_filter(
15781        &mut self,
15782    ) -> Result<Option<ShowStatementFilter>, ParserError> {
15783        if self.parse_keyword(Keyword::LIKE) {
15784            Ok(Some(ShowStatementFilter::Like(
15785                self.parse_literal_string()?,
15786            )))
15787        } else if self.parse_keyword(Keyword::ILIKE) {
15788            Ok(Some(ShowStatementFilter::ILike(
15789                self.parse_literal_string()?,
15790            )))
15791        } else if self.parse_keyword(Keyword::WHERE) {
15792            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
15793        } else {
15794            self.maybe_parse(|parser| -> Result<String, ParserError> {
15795                parser.parse_literal_string()
15796            })?
15797            .map_or(Ok(None), |filter| {
15798                Ok(Some(ShowStatementFilter::NoKeyword(filter)))
15799            })
15800        }
15801    }
15802
15803    /// Parse a `USE` statement (database/catalog/schema/warehouse/role selection).
15804    pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
15805        // Determine which keywords are recognized by the current dialect
15806        let parsed_keyword = if dialect_of!(self is HiveDialect) {
15807            // HiveDialect accepts USE DEFAULT; statement without any db specified
15808            if self.parse_keyword(Keyword::DEFAULT) {
15809                return Ok(Statement::Use(Use::Default));
15810            }
15811            None // HiveDialect doesn't expect any other specific keyword after `USE`
15812        } else if dialect_of!(self is DatabricksDialect) {
15813            self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
15814        } else if dialect_of!(self is SnowflakeDialect) {
15815            self.parse_one_of_keywords(&[
15816                Keyword::DATABASE,
15817                Keyword::SCHEMA,
15818                Keyword::WAREHOUSE,
15819                Keyword::ROLE,
15820                Keyword::SECONDARY,
15821            ])
15822        } else {
15823            None // No specific keywords for other dialects, including GenericDialect
15824        };
15825
15826        let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
15827            self.parse_secondary_roles()?
15828        } else {
15829            let obj_name = self.parse_object_name(false)?;
15830            match parsed_keyword {
15831                Some(Keyword::CATALOG) => Use::Catalog(obj_name),
15832                Some(Keyword::DATABASE) => Use::Database(obj_name),
15833                Some(Keyword::SCHEMA) => Use::Schema(obj_name),
15834                Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
15835                Some(Keyword::ROLE) => Use::Role(obj_name),
15836                _ => Use::Object(obj_name),
15837            }
15838        };
15839
15840        Ok(Statement::Use(result))
15841    }
15842
15843    fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
15844        self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
15845        if self.parse_keyword(Keyword::NONE) {
15846            Ok(Use::SecondaryRoles(SecondaryRoles::None))
15847        } else if self.parse_keyword(Keyword::ALL) {
15848            Ok(Use::SecondaryRoles(SecondaryRoles::All))
15849        } else {
15850            let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
15851            Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
15852        }
15853    }
15854
15855    /// Parse a table factor followed by any join clauses, returning `TableWithJoins`.
15856    pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
15857        let relation = self.parse_table_factor()?;
15858        // Note that for keywords to be properly handled here, they need to be
15859        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
15860        // a table alias.
15861        let joins = self.parse_joins()?;
15862        Ok(TableWithJoins { relation, joins })
15863    }
15864
15865    fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
15866        let mut joins = vec![];
15867        loop {
15868            let global = self.parse_keyword(Keyword::GLOBAL);
15869            let join = if self.parse_keyword(Keyword::CROSS) {
15870                let join_operator = if self.parse_keyword(Keyword::JOIN) {
15871                    JoinOperator::CrossJoin(JoinConstraint::None)
15872                } else if self.parse_keyword(Keyword::APPLY) {
15873                    // MSSQL extension, similar to CROSS JOIN LATERAL
15874                    JoinOperator::CrossApply
15875                } else {
15876                    return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
15877                };
15878                let relation = self.parse_table_factor()?;
15879                let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
15880                    && self.dialect.supports_cross_join_constraint()
15881                {
15882                    let constraint = self.parse_join_constraint(false)?;
15883                    JoinOperator::CrossJoin(constraint)
15884                } else {
15885                    join_operator
15886                };
15887                Join {
15888                    relation,
15889                    global,
15890                    join_operator,
15891                }
15892            } else if self.parse_keyword(Keyword::OUTER) {
15893                // MSSQL extension, similar to LEFT JOIN LATERAL .. ON 1=1
15894                self.expect_keyword_is(Keyword::APPLY)?;
15895                Join {
15896                    relation: self.parse_table_factor()?,
15897                    global,
15898                    join_operator: JoinOperator::OuterApply,
15899                }
15900            } else if self.parse_keyword(Keyword::ASOF) {
15901                self.expect_keyword_is(Keyword::JOIN)?;
15902                let relation = self.parse_table_factor()?;
15903                self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
15904                let match_condition = self.parse_parenthesized(Self::parse_expr)?;
15905                Join {
15906                    relation,
15907                    global,
15908                    join_operator: JoinOperator::AsOf {
15909                        match_condition,
15910                        constraint: self.parse_join_constraint(false)?,
15911                    },
15912                }
15913            } else if self.dialect.supports_array_join_syntax()
15914                && self.parse_keywords(&[Keyword::INNER, Keyword::ARRAY, Keyword::JOIN])
15915            {
15916                // ClickHouse: INNER ARRAY JOIN
15917                Join {
15918                    relation: self.parse_table_factor()?,
15919                    global,
15920                    join_operator: JoinOperator::InnerArrayJoin,
15921                }
15922            } else if self.dialect.supports_array_join_syntax()
15923                && self.parse_keywords(&[Keyword::LEFT, Keyword::ARRAY, Keyword::JOIN])
15924            {
15925                // ClickHouse: LEFT ARRAY JOIN
15926                Join {
15927                    relation: self.parse_table_factor()?,
15928                    global,
15929                    join_operator: JoinOperator::LeftArrayJoin,
15930                }
15931            } else if self.dialect.supports_array_join_syntax()
15932                && self.parse_keywords(&[Keyword::ARRAY, Keyword::JOIN])
15933            {
15934                // ClickHouse: ARRAY JOIN
15935                Join {
15936                    relation: self.parse_table_factor()?,
15937                    global,
15938                    join_operator: JoinOperator::ArrayJoin,
15939                }
15940            } else {
15941                let natural = self.parse_keyword(Keyword::NATURAL);
15942                let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
15943                    w.keyword
15944                } else {
15945                    Keyword::NoKeyword
15946                };
15947
15948                let join_operator_type = match peek_keyword {
15949                    Keyword::INNER | Keyword::JOIN => {
15950                        let inner = self.parse_keyword(Keyword::INNER); // [ INNER ]
15951                        self.expect_keyword_is(Keyword::JOIN)?;
15952                        if inner {
15953                            JoinOperator::Inner
15954                        } else {
15955                            JoinOperator::Join
15956                        }
15957                    }
15958                    kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
15959                        let _ = self.next_token(); // consume LEFT/RIGHT
15960                        let is_left = kw == Keyword::LEFT;
15961                        let join_type = self.parse_one_of_keywords(&[
15962                            Keyword::OUTER,
15963                            Keyword::SEMI,
15964                            Keyword::ANTI,
15965                            Keyword::JOIN,
15966                        ]);
15967                        match join_type {
15968                            Some(Keyword::OUTER) => {
15969                                self.expect_keyword_is(Keyword::JOIN)?;
15970                                if is_left {
15971                                    JoinOperator::LeftOuter
15972                                } else {
15973                                    JoinOperator::RightOuter
15974                                }
15975                            }
15976                            Some(Keyword::SEMI) => {
15977                                self.expect_keyword_is(Keyword::JOIN)?;
15978                                if is_left {
15979                                    JoinOperator::LeftSemi
15980                                } else {
15981                                    JoinOperator::RightSemi
15982                                }
15983                            }
15984                            Some(Keyword::ANTI) => {
15985                                self.expect_keyword_is(Keyword::JOIN)?;
15986                                if is_left {
15987                                    JoinOperator::LeftAnti
15988                                } else {
15989                                    JoinOperator::RightAnti
15990                                }
15991                            }
15992                            Some(Keyword::JOIN) => {
15993                                if is_left {
15994                                    JoinOperator::Left
15995                                } else {
15996                                    JoinOperator::Right
15997                                }
15998                            }
15999                            _ => {
16000                                return Err(ParserError::ParserError(format!(
16001                                    "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
16002                                )))
16003                            }
16004                        }
16005                    }
16006                    Keyword::ANTI => {
16007                        let _ = self.next_token(); // consume ANTI
16008                        self.expect_keyword_is(Keyword::JOIN)?;
16009                        JoinOperator::Anti
16010                    }
16011                    Keyword::SEMI => {
16012                        let _ = self.next_token(); // consume SEMI
16013                        self.expect_keyword_is(Keyword::JOIN)?;
16014                        JoinOperator::Semi
16015                    }
16016                    Keyword::FULL => {
16017                        let _ = self.next_token(); // consume FULL
16018                        let _ = self.parse_keyword(Keyword::OUTER); // [ OUTER ]
16019                        self.expect_keyword_is(Keyword::JOIN)?;
16020                        JoinOperator::FullOuter
16021                    }
16022                    Keyword::OUTER => {
16023                        return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
16024                    }
16025                    Keyword::STRAIGHT_JOIN => {
16026                        let _ = self.next_token(); // consume STRAIGHT_JOIN
16027                        JoinOperator::StraightJoin
16028                    }
16029                    _ if natural => {
16030                        return self
16031                            .expected_ref("a join type after NATURAL", self.peek_token_ref());
16032                    }
16033                    _ => break,
16034                };
16035                let mut relation = self.parse_table_factor()?;
16036
16037                if !self
16038                    .dialect
16039                    .supports_left_associative_joins_without_parens()
16040                    && self.peek_parens_less_nested_join()
16041                {
16042                    let joins = self.parse_joins()?;
16043                    relation = TableFactor::NestedJoin {
16044                        table_with_joins: Box::new(TableWithJoins { relation, joins }),
16045                        alias: None,
16046                    };
16047                }
16048
16049                let join_constraint = self.parse_join_constraint(natural)?;
16050                Join {
16051                    relation,
16052                    global,
16053                    join_operator: join_operator_type(join_constraint),
16054                }
16055            };
16056            joins.push(join);
16057        }
16058        Ok(joins)
16059    }
16060
16061    fn peek_parens_less_nested_join(&self) -> bool {
16062        matches!(
16063            self.peek_token_ref().token,
16064            Token::Word(Word {
16065                keyword: Keyword::JOIN
16066                    | Keyword::INNER
16067                    | Keyword::LEFT
16068                    | Keyword::RIGHT
16069                    | Keyword::FULL,
16070                ..
16071            })
16072        )
16073    }
16074
16075    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
16076    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
16077    pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16078        let _guard = self.recursion_counter.try_decrease()?;
16079        if self.parse_keyword(Keyword::LATERAL) {
16080            // LATERAL must always be followed by a subquery or table function.
16081            if self.consume_token(&Token::LParen) {
16082                self.parse_derived_table_factor(Lateral)
16083            } else {
16084                let name = self.parse_object_name(false)?;
16085                self.expect_token(&Token::LParen)?;
16086                let args = self.parse_optional_args()?;
16087                let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16088                let alias = self.maybe_parse_table_alias()?;
16089                Ok(TableFactor::Function {
16090                    lateral: true,
16091                    name,
16092                    args,
16093                    with_ordinality,
16094                    alias,
16095                })
16096            }
16097        } else if self.parse_keyword(Keyword::TABLE) {
16098            // parse table function (SELECT * FROM TABLE (<expr>) [ AS <alias> ])
16099            self.expect_token(&Token::LParen)?;
16100            let expr = self.parse_expr()?;
16101            self.expect_token(&Token::RParen)?;
16102            let alias = self.maybe_parse_table_alias()?;
16103            Ok(TableFactor::TableFunction { expr, alias })
16104        } else if self.consume_token(&Token::LParen) {
16105            // A left paren introduces either a derived table (i.e., a subquery)
16106            // or a nested join. It's nearly impossible to determine ahead of
16107            // time which it is... so we just try to parse both.
16108            //
16109            // Here's an example that demonstrates the complexity:
16110            //                     /-------------------------------------------------------\
16111            //                     | /-----------------------------------\                 |
16112            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
16113            //                   ^ ^ ^ ^
16114            //                   | | | |
16115            //                   | | | |
16116            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
16117            //                   | | (3) starts a derived table (subquery)
16118            //                   | (2) starts a nested join
16119            //                   (1) an additional set of parens around a nested join
16120            //
16121
16122            // If the recently consumed '(' starts a derived table, the call to
16123            // `parse_derived_table_factor` below will return success after parsing the
16124            // subquery, followed by the closing ')', and the alias of the derived table.
16125            // In the example above this is case (3).
16126            if let Some(mut table) =
16127                self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))?
16128            {
16129                while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
16130                {
16131                    table = match kw {
16132                        Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16133                        Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16134                        unexpected_keyword => return Err(ParserError::ParserError(
16135                            format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16136                        )),
16137                    }
16138                }
16139                return Ok(table);
16140            }
16141
16142            // A parsing error from `parse_derived_table_factor` indicates that the '(' we've
16143            // recently consumed does not start a derived table (cases 1, 2, or 4).
16144            // `maybe_parse` will ignore such an error and rewind to be after the opening '('.
16145
16146            // Inside the parentheses we expect to find an (A) table factor
16147            // followed by some joins or (B) another level of nesting.
16148            let mut table_and_joins = self.parse_table_and_joins()?;
16149
16150            #[allow(clippy::if_same_then_else)]
16151            if !table_and_joins.joins.is_empty() {
16152                self.expect_token(&Token::RParen)?;
16153                let alias = self.maybe_parse_table_alias()?;
16154                Ok(TableFactor::NestedJoin {
16155                    table_with_joins: Box::new(table_and_joins),
16156                    alias,
16157                }) // (A)
16158            } else if let TableFactor::NestedJoin {
16159                table_with_joins: _,
16160                alias: _,
16161            } = &table_and_joins.relation
16162            {
16163                // (B): `table_and_joins` (what we found inside the parentheses)
16164                // is a nested join `(foo JOIN bar)`, not followed by other joins.
16165                self.expect_token(&Token::RParen)?;
16166                let alias = self.maybe_parse_table_alias()?;
16167                Ok(TableFactor::NestedJoin {
16168                    table_with_joins: Box::new(table_and_joins),
16169                    alias,
16170                })
16171            } else if self.dialect.supports_parens_around_table_factor() {
16172                // Dialect-specific behavior: Snowflake diverges from the
16173                // standard and from most of the other implementations by
16174                // allowing extra parentheses not only around a join (B), but
16175                // around lone table names (e.g. `FROM (mytable [AS alias])`)
16176                // and around derived tables (e.g. `FROM ((SELECT ...)
16177                // [AS alias])`) as well.
16178                self.expect_token(&Token::RParen)?;
16179
16180                if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16181                    // Snowflake also allows specifying an alias *after* parens
16182                    // e.g. `FROM (mytable) AS alias`
16183                    match &mut table_and_joins.relation {
16184                        TableFactor::Derived { alias, .. }
16185                        | TableFactor::Table { alias, .. }
16186                        | TableFactor::Function { alias, .. }
16187                        | TableFactor::UNNEST { alias, .. }
16188                        | TableFactor::JsonTable { alias, .. }
16189                        | TableFactor::XmlTable { alias, .. }
16190                        | TableFactor::OpenJsonTable { alias, .. }
16191                        | TableFactor::TableFunction { alias, .. }
16192                        | TableFactor::Pivot { alias, .. }
16193                        | TableFactor::Unpivot { alias, .. }
16194                        | TableFactor::MatchRecognize { alias, .. }
16195                        | TableFactor::SemanticView { alias, .. }
16196                        | TableFactor::NestedJoin { alias, .. } => {
16197                            // but not `FROM (mytable AS alias1) AS alias2`.
16198                            if let Some(inner_alias) = alias {
16199                                return Err(ParserError::ParserError(format!(
16200                                    "duplicate alias {inner_alias}"
16201                                )));
16202                            }
16203                            // Act as if the alias was specified normally next
16204                            // to the table name: `(mytable) AS alias` ->
16205                            // `(mytable AS alias)`
16206                            alias.replace(outer_alias);
16207                        }
16208                    };
16209                }
16210                // Do not store the extra set of parens in the AST
16211                Ok(table_and_joins.relation)
16212            } else {
16213                // The SQL spec prohibits derived tables and bare tables from
16214                // appearing alone in parentheses (e.g. `FROM (mytable)`)
16215                self.expected_ref("joined table", self.peek_token_ref())
16216            }
16217        } else if self.dialect.supports_values_as_table_factor()
16218            && matches!(
16219                self.peek_tokens(),
16220                [
16221                    Token::Word(Word {
16222                        keyword: Keyword::VALUES,
16223                        ..
16224                    }),
16225                    Token::LParen
16226                ]
16227            )
16228        {
16229            self.expect_keyword_is(Keyword::VALUES)?;
16230
16231            // Snowflake and Databricks allow syntax like below:
16232            // SELECT * FROM VALUES (1, 'a'), (2, 'b') AS t (col1, col2)
16233            // where there are no parentheses around the VALUES clause.
16234            let values = SetExpr::Values(self.parse_values(false, false)?);
16235            let alias = self.maybe_parse_table_alias()?;
16236            Ok(TableFactor::Derived {
16237                lateral: false,
16238                subquery: Box::new(Query {
16239                    with: None,
16240                    body: Box::new(values),
16241                    order_by: None,
16242                    limit_clause: None,
16243                    fetch: None,
16244                    locks: vec![],
16245                    for_clause: None,
16246                    settings: None,
16247                    format_clause: None,
16248                    pipe_operators: vec![],
16249                }),
16250                alias,
16251                sample: None,
16252            })
16253        } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16254            && self.parse_keyword(Keyword::UNNEST)
16255        {
16256            self.expect_token(&Token::LParen)?;
16257            let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16258            self.expect_token(&Token::RParen)?;
16259
16260            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16261            let alias = match self.maybe_parse_table_alias() {
16262                Ok(Some(alias)) => Some(alias),
16263                Ok(None) => None,
16264                Err(e) => return Err(e),
16265            };
16266
16267            let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16268                Ok(()) => true,
16269                Err(_) => false,
16270            };
16271
16272            let with_offset_alias = if with_offset {
16273                match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16274                    Ok(Some(alias)) => Some(alias),
16275                    Ok(None) => None,
16276                    Err(e) => return Err(e),
16277                }
16278            } else {
16279                None
16280            };
16281
16282            Ok(TableFactor::UNNEST {
16283                alias,
16284                array_exprs,
16285                with_offset,
16286                with_offset_alias,
16287                with_ordinality,
16288            })
16289        } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16290            let json_expr = self.parse_expr()?;
16291            self.expect_token(&Token::Comma)?;
16292            let json_path = self.parse_value()?;
16293            self.expect_keyword_is(Keyword::COLUMNS)?;
16294            self.expect_token(&Token::LParen)?;
16295            let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16296            self.expect_token(&Token::RParen)?;
16297            self.expect_token(&Token::RParen)?;
16298            let alias = self.maybe_parse_table_alias()?;
16299            Ok(TableFactor::JsonTable {
16300                json_expr,
16301                json_path,
16302                columns,
16303                alias,
16304            })
16305        } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16306            self.prev_token();
16307            self.parse_open_json_table_factor()
16308        } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16309            self.prev_token();
16310            self.parse_xml_table_factor()
16311        } else if self.dialect.supports_semantic_view_table_factor()
16312            && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16313        {
16314            self.parse_semantic_view_table_factor()
16315        } else if self.peek_token_ref().token == Token::AtSign {
16316            // Stage reference: @mystage or @namespace.stage (e.g. Snowflake)
16317            self.parse_snowflake_stage_table_factor()
16318        } else {
16319            let name = self.parse_object_name(true)?;
16320
16321            let json_path = match &self.peek_token_ref().token {
16322                Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16323                _ => None,
16324            };
16325
16326            let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16327                && self.parse_keyword(Keyword::PARTITION)
16328            {
16329                self.parse_parenthesized_identifiers()?
16330            } else {
16331                vec![]
16332            };
16333
16334            // Parse potential version qualifier
16335            let version = self.maybe_parse_table_version()?;
16336
16337            // Postgres, MSSQL, ClickHouse: table-valued functions:
16338            let args = if self.consume_token(&Token::LParen) {
16339                Some(self.parse_table_function_args()?)
16340            } else {
16341                None
16342            };
16343
16344            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16345
16346            let mut sample = None;
16347            if self.dialect.supports_table_sample_before_alias() {
16348                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16349                    sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16350                }
16351            }
16352
16353            let alias = self.maybe_parse_table_alias()?;
16354
16355            // MYSQL-specific table hints:
16356            let index_hints = if self.dialect.supports_table_hints() {
16357                self.maybe_parse(|p| p.parse_table_index_hints())?
16358                    .unwrap_or(vec![])
16359            } else {
16360                vec![]
16361            };
16362
16363            // MSSQL-specific table hints:
16364            let mut with_hints = vec![];
16365            if self.parse_keyword(Keyword::WITH) {
16366                if self.consume_token(&Token::LParen) {
16367                    with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16368                    self.expect_token(&Token::RParen)?;
16369                } else {
16370                    // rewind, as WITH may belong to the next statement's CTE
16371                    self.prev_token();
16372                }
16373            };
16374
16375            if !self.dialect.supports_table_sample_before_alias() {
16376                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16377                    sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16378                }
16379            }
16380
16381            let mut table = TableFactor::Table {
16382                name,
16383                alias,
16384                args,
16385                with_hints,
16386                version,
16387                partitions,
16388                with_ordinality,
16389                json_path,
16390                sample,
16391                index_hints,
16392            };
16393
16394            while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16395                table = match kw {
16396                    Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16397                    Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16398                    unexpected_keyword => return Err(ParserError::ParserError(
16399                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16400                    )),
16401                }
16402            }
16403
16404            if self.dialect.supports_match_recognize()
16405                && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16406            {
16407                table = self.parse_match_recognize(table)?;
16408            }
16409
16410            Ok(table)
16411        }
16412    }
16413
16414    /// Parse a Snowflake stage reference as a table factor.
16415    /// Handles syntax like: `@mystage1 (file_format => 'myformat', pattern => '...')`
16416    ///
16417    /// See: <https://docs.snowflake.com/en/user-guide/querying-stage>
16418    fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16419        // Parse the stage name starting with @
16420        let name = crate::dialect::parse_snowflake_stage_name(self)?;
16421
16422        // Parse optional stage options like (file_format => 'myformat', pattern => '...')
16423        let args = if self.consume_token(&Token::LParen) {
16424            Some(self.parse_table_function_args()?)
16425        } else {
16426            None
16427        };
16428
16429        let alias = self.maybe_parse_table_alias()?;
16430
16431        Ok(TableFactor::Table {
16432            name,
16433            alias,
16434            args,
16435            with_hints: vec![],
16436            version: None,
16437            partitions: vec![],
16438            with_ordinality: false,
16439            json_path: None,
16440            sample: None,
16441            index_hints: vec![],
16442        })
16443    }
16444
16445    fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16446        let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16447            TableSampleModifier::TableSample
16448        } else if self.parse_keyword(Keyword::SAMPLE) {
16449            TableSampleModifier::Sample
16450        } else {
16451            return Ok(None);
16452        };
16453        self.parse_table_sample(modifier).map(Some)
16454    }
16455
16456    fn parse_table_sample(
16457        &mut self,
16458        modifier: TableSampleModifier,
16459    ) -> Result<Box<TableSample>, ParserError> {
16460        let name = match self.parse_one_of_keywords(&[
16461            Keyword::BERNOULLI,
16462            Keyword::ROW,
16463            Keyword::SYSTEM,
16464            Keyword::BLOCK,
16465        ]) {
16466            Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
16467            Some(Keyword::ROW) => Some(TableSampleMethod::Row),
16468            Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
16469            Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
16470            _ => None,
16471        };
16472
16473        let parenthesized = self.consume_token(&Token::LParen);
16474
16475        let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
16476            let selected_bucket = self.parse_number_value()?;
16477            self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
16478            let total = self.parse_number_value()?;
16479            let on = if self.parse_keyword(Keyword::ON) {
16480                Some(self.parse_expr()?)
16481            } else {
16482                None
16483            };
16484            (
16485                None,
16486                Some(TableSampleBucket {
16487                    bucket: selected_bucket,
16488                    total,
16489                    on,
16490                }),
16491            )
16492        } else {
16493            let value = match self.maybe_parse(|p| p.parse_expr())? {
16494                Some(num) => num,
16495                None => {
16496                    let next_token = self.next_token();
16497                    if let Token::Word(w) = next_token.token {
16498                        Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
16499                    } else {
16500                        return parser_err!(
16501                            "Expecting number or byte length e.g. 100M",
16502                            self.peek_token_ref().span.start
16503                        );
16504                    }
16505                }
16506            };
16507            let unit = if self.parse_keyword(Keyword::ROWS) {
16508                Some(TableSampleUnit::Rows)
16509            } else if self.parse_keyword(Keyword::PERCENT) {
16510                Some(TableSampleUnit::Percent)
16511            } else {
16512                None
16513            };
16514            (
16515                Some(TableSampleQuantity {
16516                    parenthesized,
16517                    value,
16518                    unit,
16519                }),
16520                None,
16521            )
16522        };
16523        if parenthesized {
16524            self.expect_token(&Token::RParen)?;
16525        }
16526
16527        let seed = if self.parse_keyword(Keyword::REPEATABLE) {
16528            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
16529        } else if self.parse_keyword(Keyword::SEED) {
16530            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
16531        } else {
16532            None
16533        };
16534
16535        let offset = if self.parse_keyword(Keyword::OFFSET) {
16536            Some(self.parse_expr()?)
16537        } else {
16538            None
16539        };
16540
16541        Ok(Box::new(TableSample {
16542            modifier,
16543            name,
16544            quantity,
16545            seed,
16546            bucket,
16547            offset,
16548        }))
16549    }
16550
16551    fn parse_table_sample_seed(
16552        &mut self,
16553        modifier: TableSampleSeedModifier,
16554    ) -> Result<TableSampleSeed, ParserError> {
16555        self.expect_token(&Token::LParen)?;
16556        let value = self.parse_number_value()?;
16557        self.expect_token(&Token::RParen)?;
16558        Ok(TableSampleSeed { modifier, value })
16559    }
16560
16561    /// Parses `OPENJSON( jsonExpression [ , path ] )  [ <with_clause> ]` clause,
16562    /// assuming the `OPENJSON` keyword was already consumed.
16563    fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16564        self.expect_token(&Token::LParen)?;
16565        let json_expr = self.parse_expr()?;
16566        let json_path = if self.consume_token(&Token::Comma) {
16567            Some(self.parse_value()?)
16568        } else {
16569            None
16570        };
16571        self.expect_token(&Token::RParen)?;
16572        let columns = if self.parse_keyword(Keyword::WITH) {
16573            self.expect_token(&Token::LParen)?;
16574            let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
16575            self.expect_token(&Token::RParen)?;
16576            columns
16577        } else {
16578            Vec::new()
16579        };
16580        let alias = self.maybe_parse_table_alias()?;
16581        Ok(TableFactor::OpenJsonTable {
16582            json_expr,
16583            json_path,
16584            columns,
16585            alias,
16586        })
16587    }
16588
16589    fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16590        self.expect_token(&Token::LParen)?;
16591        let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
16592            self.expect_token(&Token::LParen)?;
16593            let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
16594            self.expect_token(&Token::RParen)?;
16595            self.expect_token(&Token::Comma)?;
16596            namespaces
16597        } else {
16598            vec![]
16599        };
16600        let row_expression = self.parse_expr()?;
16601        let passing = self.parse_xml_passing_clause()?;
16602        self.expect_keyword_is(Keyword::COLUMNS)?;
16603        let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
16604        self.expect_token(&Token::RParen)?;
16605        let alias = self.maybe_parse_table_alias()?;
16606        Ok(TableFactor::XmlTable {
16607            namespaces,
16608            row_expression,
16609            passing,
16610            columns,
16611            alias,
16612        })
16613    }
16614
16615    fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
16616        let uri = self.parse_expr()?;
16617        self.expect_keyword_is(Keyword::AS)?;
16618        let name = self.parse_identifier()?;
16619        Ok(XmlNamespaceDefinition { uri, name })
16620    }
16621
16622    fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
16623        let name = self.parse_identifier()?;
16624
16625        let option = if self.parse_keyword(Keyword::FOR) {
16626            self.expect_keyword(Keyword::ORDINALITY)?;
16627            XmlTableColumnOption::ForOrdinality
16628        } else {
16629            let r#type = self.parse_data_type()?;
16630            let mut path = None;
16631            let mut default = None;
16632
16633            if self.parse_keyword(Keyword::PATH) {
16634                path = Some(self.parse_expr()?);
16635            }
16636
16637            if self.parse_keyword(Keyword::DEFAULT) {
16638                default = Some(self.parse_expr()?);
16639            }
16640
16641            let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
16642            if !not_null {
16643                // NULL is the default but can be specified explicitly
16644                let _ = self.parse_keyword(Keyword::NULL);
16645            }
16646
16647            XmlTableColumnOption::NamedInfo {
16648                r#type,
16649                path,
16650                default,
16651                nullable: !not_null,
16652            }
16653        };
16654        Ok(XmlTableColumn { name, option })
16655    }
16656
16657    fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
16658        let mut arguments = vec![];
16659        if self.parse_keyword(Keyword::PASSING) {
16660            loop {
16661                let by_value =
16662                    self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
16663                let expr = self.parse_expr()?;
16664                let alias = if self.parse_keyword(Keyword::AS) {
16665                    Some(self.parse_identifier()?)
16666                } else {
16667                    None
16668                };
16669                arguments.push(XmlPassingArgument {
16670                    expr,
16671                    alias,
16672                    by_value,
16673                });
16674                if !self.consume_token(&Token::Comma) {
16675                    break;
16676                }
16677            }
16678        }
16679        Ok(XmlPassingClause { arguments })
16680    }
16681
16682    /// Parse a [TableFactor::SemanticView]
16683    fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16684        self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
16685        self.expect_token(&Token::LParen)?;
16686
16687        let name = self.parse_object_name(true)?;
16688
16689        // Parse DIMENSIONS, METRICS, FACTS and WHERE clauses in flexible order
16690        let mut dimensions = Vec::new();
16691        let mut metrics = Vec::new();
16692        let mut facts = Vec::new();
16693        let mut where_clause = None;
16694
16695        while self.peek_token_ref().token != Token::RParen {
16696            if self.parse_keyword(Keyword::DIMENSIONS) {
16697                if !dimensions.is_empty() {
16698                    return Err(ParserError::ParserError(
16699                        "DIMENSIONS clause can only be specified once".to_string(),
16700                    ));
16701                }
16702                dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16703            } else if self.parse_keyword(Keyword::METRICS) {
16704                if !metrics.is_empty() {
16705                    return Err(ParserError::ParserError(
16706                        "METRICS clause can only be specified once".to_string(),
16707                    ));
16708                }
16709                metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16710            } else if self.parse_keyword(Keyword::FACTS) {
16711                if !facts.is_empty() {
16712                    return Err(ParserError::ParserError(
16713                        "FACTS clause can only be specified once".to_string(),
16714                    ));
16715                }
16716                facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16717            } else if self.parse_keyword(Keyword::WHERE) {
16718                if where_clause.is_some() {
16719                    return Err(ParserError::ParserError(
16720                        "WHERE clause can only be specified once".to_string(),
16721                    ));
16722                }
16723                where_clause = Some(self.parse_expr()?);
16724            } else {
16725                let tok = self.peek_token_ref();
16726                parser_err!(
16727                    format!(
16728                        "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
16729                        tok.token
16730                    ),
16731                    tok.span.start
16732                )?;
16733            }
16734        }
16735
16736        self.expect_token(&Token::RParen)?;
16737
16738        let alias = self.maybe_parse_table_alias()?;
16739
16740        Ok(TableFactor::SemanticView {
16741            name,
16742            dimensions,
16743            metrics,
16744            facts,
16745            where_clause,
16746            alias,
16747        })
16748    }
16749
16750    fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
16751        self.expect_token(&Token::LParen)?;
16752
16753        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
16754            self.parse_comma_separated(Parser::parse_expr)?
16755        } else {
16756            vec![]
16757        };
16758
16759        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
16760            self.parse_comma_separated(Parser::parse_order_by_expr)?
16761        } else {
16762            vec![]
16763        };
16764
16765        let measures = if self.parse_keyword(Keyword::MEASURES) {
16766            self.parse_comma_separated(|p| {
16767                let expr = p.parse_expr()?;
16768                let _ = p.parse_keyword(Keyword::AS);
16769                let alias = p.parse_identifier()?;
16770                Ok(Measure { expr, alias })
16771            })?
16772        } else {
16773            vec![]
16774        };
16775
16776        let rows_per_match =
16777            if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
16778                Some(RowsPerMatch::OneRow)
16779            } else if self.parse_keywords(&[
16780                Keyword::ALL,
16781                Keyword::ROWS,
16782                Keyword::PER,
16783                Keyword::MATCH,
16784            ]) {
16785                Some(RowsPerMatch::AllRows(
16786                    if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
16787                        Some(EmptyMatchesMode::Show)
16788                    } else if self.parse_keywords(&[
16789                        Keyword::OMIT,
16790                        Keyword::EMPTY,
16791                        Keyword::MATCHES,
16792                    ]) {
16793                        Some(EmptyMatchesMode::Omit)
16794                    } else if self.parse_keywords(&[
16795                        Keyword::WITH,
16796                        Keyword::UNMATCHED,
16797                        Keyword::ROWS,
16798                    ]) {
16799                        Some(EmptyMatchesMode::WithUnmatched)
16800                    } else {
16801                        None
16802                    },
16803                ))
16804            } else {
16805                None
16806            };
16807
16808        let after_match_skip =
16809            if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
16810                if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
16811                    Some(AfterMatchSkip::PastLastRow)
16812                } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
16813                    Some(AfterMatchSkip::ToNextRow)
16814                } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
16815                    Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
16816                } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
16817                    Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
16818                } else {
16819                    let found = self.next_token();
16820                    return self.expected("after match skip option", found);
16821                }
16822            } else {
16823                None
16824            };
16825
16826        self.expect_keyword_is(Keyword::PATTERN)?;
16827        let pattern = self.parse_parenthesized(Self::parse_pattern)?;
16828
16829        self.expect_keyword_is(Keyword::DEFINE)?;
16830
16831        let symbols = self.parse_comma_separated(|p| {
16832            let symbol = p.parse_identifier()?;
16833            p.expect_keyword_is(Keyword::AS)?;
16834            let definition = p.parse_expr()?;
16835            Ok(SymbolDefinition { symbol, definition })
16836        })?;
16837
16838        self.expect_token(&Token::RParen)?;
16839
16840        let alias = self.maybe_parse_table_alias()?;
16841
16842        Ok(TableFactor::MatchRecognize {
16843            table: Box::new(table),
16844            partition_by,
16845            order_by,
16846            measures,
16847            rows_per_match,
16848            after_match_skip,
16849            pattern,
16850            symbols,
16851            alias,
16852        })
16853    }
16854
16855    fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16856        match self.next_token().token {
16857            Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
16858            Token::Placeholder(s) if s == "$" => {
16859                Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
16860            }
16861            Token::LBrace => {
16862                self.expect_token(&Token::Minus)?;
16863                let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
16864                self.expect_token(&Token::Minus)?;
16865                self.expect_token(&Token::RBrace)?;
16866                Ok(MatchRecognizePattern::Exclude(symbol))
16867            }
16868            Token::Word(Word {
16869                value,
16870                quote_style: None,
16871                ..
16872            }) if value == "PERMUTE" => {
16873                self.expect_token(&Token::LParen)?;
16874                let symbols = self.parse_comma_separated(|p| {
16875                    p.parse_identifier().map(MatchRecognizeSymbol::Named)
16876                })?;
16877                self.expect_token(&Token::RParen)?;
16878                Ok(MatchRecognizePattern::Permute(symbols))
16879            }
16880            Token::LParen => {
16881                let pattern = self.parse_pattern()?;
16882                self.expect_token(&Token::RParen)?;
16883                Ok(MatchRecognizePattern::Group(Box::new(pattern)))
16884            }
16885            _ => {
16886                self.prev_token();
16887                self.parse_identifier()
16888                    .map(MatchRecognizeSymbol::Named)
16889                    .map(MatchRecognizePattern::Symbol)
16890            }
16891        }
16892    }
16893
16894    fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16895        let mut pattern = self.parse_base_pattern()?;
16896        loop {
16897            let token = self.next_token();
16898            let quantifier = match token.token {
16899                Token::Mul => RepetitionQuantifier::ZeroOrMore,
16900                Token::Plus => RepetitionQuantifier::OneOrMore,
16901                Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
16902                Token::LBrace => {
16903                    // quantifier is a range like {n} or {n,} or {,m} or {n,m}
16904                    let token = self.next_token();
16905                    match token.token {
16906                        Token::Comma => {
16907                            let next_token = self.next_token();
16908                            let Token::Number(n, _) = next_token.token else {
16909                                return self.expected("literal number", next_token);
16910                            };
16911                            self.expect_token(&Token::RBrace)?;
16912                            RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
16913                        }
16914                        Token::Number(n, _) if self.consume_token(&Token::Comma) => {
16915                            let next_token = self.next_token();
16916                            match next_token.token {
16917                                Token::Number(m, _) => {
16918                                    self.expect_token(&Token::RBrace)?;
16919                                    RepetitionQuantifier::Range(
16920                                        Self::parse(n, token.span.start)?,
16921                                        Self::parse(m, token.span.start)?,
16922                                    )
16923                                }
16924                                Token::RBrace => {
16925                                    RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
16926                                }
16927                                _ => {
16928                                    return self.expected("} or upper bound", next_token);
16929                                }
16930                            }
16931                        }
16932                        Token::Number(n, _) => {
16933                            self.expect_token(&Token::RBrace)?;
16934                            RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
16935                        }
16936                        _ => return self.expected("quantifier range", token),
16937                    }
16938                }
16939                _ => {
16940                    self.prev_token();
16941                    break;
16942                }
16943            };
16944            pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
16945        }
16946        Ok(pattern)
16947    }
16948
16949    fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16950        let mut patterns = vec![self.parse_repetition_pattern()?];
16951        while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
16952            patterns.push(self.parse_repetition_pattern()?);
16953        }
16954        match <[MatchRecognizePattern; 1]>::try_from(patterns) {
16955            Ok([pattern]) => Ok(pattern),
16956            Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
16957        }
16958    }
16959
16960    fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16961        let pattern = self.parse_concat_pattern()?;
16962        if self.consume_token(&Token::Pipe) {
16963            match self.parse_pattern()? {
16964                // flatten nested alternations
16965                MatchRecognizePattern::Alternation(mut patterns) => {
16966                    patterns.insert(0, pattern);
16967                    Ok(MatchRecognizePattern::Alternation(patterns))
16968                }
16969                next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
16970            }
16971        } else {
16972            Ok(pattern)
16973        }
16974    }
16975
16976    /// Parses a the timestamp version specifier (i.e. query historical data)
16977    pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
16978        if self.dialect.supports_table_versioning() {
16979            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
16980            {
16981                let expr = self.parse_expr()?;
16982                return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
16983            } else if self.peek_keyword(Keyword::CHANGES) {
16984                return self.parse_table_version_changes().map(Some);
16985            } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
16986                let func_name = self.parse_object_name(true)?;
16987                let func = self.parse_function(func_name)?;
16988                return Ok(Some(TableVersion::Function(func)));
16989            } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
16990                let expr = self.parse_expr()?;
16991                return Ok(Some(TableVersion::TimestampAsOf(expr)));
16992            } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
16993                let expr = Expr::Value(self.parse_number_value()?);
16994                return Ok(Some(TableVersion::VersionAsOf(expr)));
16995            }
16996        }
16997        Ok(None)
16998    }
16999
17000    /// Parses the Snowflake `CHANGES` clause for change tracking queries.
17001    ///
17002    /// Syntax:
17003    /// ```sql
17004    /// CHANGES (INFORMATION => DEFAULT)
17005    ///   AT (TIMESTAMP => <expr>)
17006    ///   [END (TIMESTAMP => <expr>)]
17007    /// ```
17008    ///
17009    /// <https://docs.snowflake.com/en/sql-reference/constructs/changes>
17010    fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
17011        let changes_name = self.parse_object_name(true)?;
17012        let changes = self.parse_function(changes_name)?;
17013        let at_name = self.parse_object_name(true)?;
17014        let at = self.parse_function(at_name)?;
17015        let end = if self.peek_keyword(Keyword::END) {
17016            let end_name = self.parse_object_name(true)?;
17017            Some(self.parse_function(end_name)?)
17018        } else {
17019            None
17020        };
17021        Ok(TableVersion::Changes { changes, at, end })
17022    }
17023
17024    /// Parses MySQL's JSON_TABLE column definition.
17025    /// For example: `id INT EXISTS PATH '$' DEFAULT '0' ON EMPTY ERROR ON ERROR`
17026    pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
17027        if self.parse_keyword(Keyword::NESTED) {
17028            let _has_path_keyword = self.parse_keyword(Keyword::PATH);
17029            let path = self.parse_value()?;
17030            self.expect_keyword_is(Keyword::COLUMNS)?;
17031            let columns = self.parse_parenthesized(|p| {
17032                p.parse_comma_separated(Self::parse_json_table_column_def)
17033            })?;
17034            return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
17035                path,
17036                columns,
17037            }));
17038        }
17039        let name = self.parse_identifier()?;
17040        if self.parse_keyword(Keyword::FOR) {
17041            self.expect_keyword_is(Keyword::ORDINALITY)?;
17042            return Ok(JsonTableColumn::ForOrdinality(name));
17043        }
17044        let r#type = self.parse_data_type()?;
17045        let exists = self.parse_keyword(Keyword::EXISTS);
17046        self.expect_keyword_is(Keyword::PATH)?;
17047        let path = self.parse_value()?;
17048        let mut on_empty = None;
17049        let mut on_error = None;
17050        while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
17051            if self.parse_keyword(Keyword::EMPTY) {
17052                on_empty = Some(error_handling);
17053            } else {
17054                self.expect_keyword_is(Keyword::ERROR)?;
17055                on_error = Some(error_handling);
17056            }
17057        }
17058        Ok(JsonTableColumn::Named(JsonTableNamedColumn {
17059            name,
17060            r#type,
17061            path,
17062            exists,
17063            on_empty,
17064            on_error,
17065        }))
17066    }
17067
17068    /// Parses MSSQL's `OPENJSON WITH` column definition.
17069    ///
17070    /// ```sql
17071    /// colName type [ column_path ] [ AS JSON ]
17072    /// ```
17073    ///
17074    /// Reference: <https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver16#syntax>
17075    pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
17076        let name = self.parse_identifier()?;
17077        let r#type = self.parse_data_type()?;
17078        let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
17079            self.next_token();
17080            Some(path)
17081        } else {
17082            None
17083        };
17084        let as_json = self.parse_keyword(Keyword::AS);
17085        if as_json {
17086            self.expect_keyword_is(Keyword::JSON)?;
17087        }
17088        Ok(OpenJsonTableColumn {
17089            name,
17090            r#type,
17091            path,
17092            as_json,
17093        })
17094    }
17095
17096    fn parse_json_table_column_error_handling(
17097        &mut self,
17098    ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
17099        let res = if self.parse_keyword(Keyword::NULL) {
17100            JsonTableColumnErrorHandling::Null
17101        } else if self.parse_keyword(Keyword::ERROR) {
17102            JsonTableColumnErrorHandling::Error
17103        } else if self.parse_keyword(Keyword::DEFAULT) {
17104            JsonTableColumnErrorHandling::Default(self.parse_value()?)
17105        } else {
17106            return Ok(None);
17107        };
17108        self.expect_keyword_is(Keyword::ON)?;
17109        Ok(Some(res))
17110    }
17111
17112    /// Parse a derived table factor (a parenthesized subquery), handling optional LATERAL.
17113    pub fn parse_derived_table_factor(
17114        &mut self,
17115        lateral: IsLateral,
17116    ) -> Result<TableFactor, ParserError> {
17117        let subquery = self.parse_query()?;
17118        self.expect_token(&Token::RParen)?;
17119        let alias = self.maybe_parse_table_alias()?;
17120
17121        // Parse optional SAMPLE clause after alias
17122        let sample = self
17123            .maybe_parse_table_sample()?
17124            .map(TableSampleKind::AfterTableAlias);
17125
17126        Ok(TableFactor::Derived {
17127            lateral: match lateral {
17128                Lateral => true,
17129                NotLateral => false,
17130            },
17131            subquery,
17132            alias,
17133            sample,
17134        })
17135    }
17136
17137    /// Parses an expression with an optional alias
17138    ///
17139    /// Examples:
17140    ///
17141    /// ```sql
17142    /// SUM(price) AS total_price
17143    /// ```
17144    /// ```sql
17145    /// SUM(price)
17146    /// ```
17147    ///
17148    /// Example
17149    /// ```
17150    /// # use sqlparser::parser::{Parser, ParserError};
17151    /// # use sqlparser::dialect::GenericDialect;
17152    /// # fn main() ->Result<(), ParserError> {
17153    /// let sql = r#"SUM("a") as "b""#;
17154    /// let mut parser = Parser::new(&GenericDialect).try_with_sql(sql)?;
17155    /// let expr_with_alias = parser.parse_expr_with_alias()?;
17156    /// assert_eq!(Some("b".to_string()), expr_with_alias.alias.map(|x|x.value));
17157    /// # Ok(())
17158    /// # }
17159    pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17160        let expr = self.parse_expr()?;
17161        let alias = if self.parse_keyword(Keyword::AS) {
17162            Some(self.parse_identifier()?)
17163        } else {
17164            None
17165        };
17166
17167        Ok(ExprWithAlias { expr, alias })
17168    }
17169
17170    /// Parse an expression followed by an optional alias; Unlike
17171    /// [Self::parse_expr_with_alias] the "AS" keyword between the expression
17172    /// and the alias is optional.
17173    fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17174        let expr = self.parse_expr()?;
17175        let alias = self.parse_identifier_optional_alias()?;
17176        Ok(ExprWithAlias { expr, alias })
17177    }
17178
17179    /// Parses a plain function call with an optional alias for the `PIVOT` clause
17180    fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17181        let function_name = match self.next_token().token {
17182            Token::Word(w) => Ok(w.value),
17183            _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17184        }?;
17185        let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17186        let alias = {
17187            fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17188                // ~ for a PIVOT aggregate function the alias must not be a "FOR"; in any dialect
17189                kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17190            }
17191            self.parse_optional_alias_inner(None, validator)?
17192        };
17193        Ok(ExprWithAlias { expr, alias })
17194    }
17195
17196    /// Parse a PIVOT table factor (ClickHouse/Oracle style pivot), returning a TableFactor.
17197    pub fn parse_pivot_table_factor(
17198        &mut self,
17199        table: TableFactor,
17200    ) -> Result<TableFactor, ParserError> {
17201        self.expect_token(&Token::LParen)?;
17202        let aggregate_functions =
17203            self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17204        self.expect_keyword_is(Keyword::FOR)?;
17205        let value_column = if self.peek_token_ref().token == Token::LParen {
17206            self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17207                p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17208            })?
17209        } else {
17210            vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17211        };
17212        self.expect_keyword_is(Keyword::IN)?;
17213
17214        self.expect_token(&Token::LParen)?;
17215        let value_source = if self.parse_keyword(Keyword::ANY) {
17216            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17217                self.parse_comma_separated(Parser::parse_order_by_expr)?
17218            } else {
17219                vec![]
17220            };
17221            PivotValueSource::Any(order_by)
17222        } else if self.peek_sub_query() {
17223            PivotValueSource::Subquery(self.parse_query()?)
17224        } else {
17225            PivotValueSource::List(
17226                self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17227            )
17228        };
17229        self.expect_token(&Token::RParen)?;
17230
17231        let default_on_null =
17232            if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17233                self.expect_token(&Token::LParen)?;
17234                let expr = self.parse_expr()?;
17235                self.expect_token(&Token::RParen)?;
17236                Some(expr)
17237            } else {
17238                None
17239            };
17240
17241        self.expect_token(&Token::RParen)?;
17242        let alias = self.maybe_parse_table_alias()?;
17243        Ok(TableFactor::Pivot {
17244            table: Box::new(table),
17245            aggregate_functions,
17246            value_column,
17247            value_source,
17248            default_on_null,
17249            alias,
17250        })
17251    }
17252
17253    /// Parse an UNPIVOT table factor, returning a TableFactor.
17254    pub fn parse_unpivot_table_factor(
17255        &mut self,
17256        table: TableFactor,
17257    ) -> Result<TableFactor, ParserError> {
17258        let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17259            self.expect_keyword_is(Keyword::NULLS)?;
17260            Some(NullInclusion::IncludeNulls)
17261        } else if self.parse_keyword(Keyword::EXCLUDE) {
17262            self.expect_keyword_is(Keyword::NULLS)?;
17263            Some(NullInclusion::ExcludeNulls)
17264        } else {
17265            None
17266        };
17267        self.expect_token(&Token::LParen)?;
17268        let value = self.parse_expr()?;
17269        self.expect_keyword_is(Keyword::FOR)?;
17270        let name = self.parse_identifier()?;
17271        self.expect_keyword_is(Keyword::IN)?;
17272        let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17273            p.parse_expr_with_alias()
17274        })?;
17275        self.expect_token(&Token::RParen)?;
17276        let alias = self.maybe_parse_table_alias()?;
17277        Ok(TableFactor::Unpivot {
17278            table: Box::new(table),
17279            value,
17280            null_inclusion,
17281            name,
17282            columns,
17283            alias,
17284        })
17285    }
17286
17287    /// Parse a JOIN constraint (`NATURAL`, `ON <expr>`, `USING (...)`, or no constraint).
17288    pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17289        if natural {
17290            Ok(JoinConstraint::Natural)
17291        } else if self.parse_keyword(Keyword::ON) {
17292            let constraint = self.parse_expr()?;
17293            Ok(JoinConstraint::On(constraint))
17294        } else if self.parse_keyword(Keyword::USING) {
17295            let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17296            Ok(JoinConstraint::Using(columns))
17297        } else {
17298            Ok(JoinConstraint::None)
17299            //self.expected_ref("ON, or USING after JOIN", self.peek_token_ref())
17300        }
17301    }
17302
17303    /// Parse a GRANT statement.
17304    pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17305        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17306
17307        self.expect_keyword_is(Keyword::TO)?;
17308        let grantees = self.parse_grantees()?;
17309
17310        let with_grant_option =
17311            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17312
17313        let current_grants =
17314            if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17315                Some(CurrentGrantsKind::CopyCurrentGrants)
17316            } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17317                Some(CurrentGrantsKind::RevokeCurrentGrants)
17318            } else {
17319                None
17320            };
17321
17322        let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17323            Some(self.parse_identifier()?)
17324        } else {
17325            None
17326        };
17327
17328        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17329            Some(self.parse_identifier()?)
17330        } else {
17331            None
17332        };
17333
17334        Ok(Grant {
17335            privileges,
17336            objects,
17337            grantees,
17338            with_grant_option,
17339            as_grantor,
17340            granted_by,
17341            current_grants,
17342        })
17343    }
17344
17345    fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17346        let mut values = vec![];
17347        let mut grantee_type = GranteesType::None;
17348        loop {
17349            let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17350                GranteesType::Role
17351            } else if self.parse_keyword(Keyword::USER) {
17352                GranteesType::User
17353            } else if self.parse_keyword(Keyword::SHARE) {
17354                GranteesType::Share
17355            } else if self.parse_keyword(Keyword::GROUP) {
17356                GranteesType::Group
17357            } else if self.parse_keyword(Keyword::PUBLIC) {
17358                GranteesType::Public
17359            } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17360                GranteesType::DatabaseRole
17361            } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17362                GranteesType::ApplicationRole
17363            } else if self.parse_keyword(Keyword::APPLICATION) {
17364                GranteesType::Application
17365            } else {
17366                grantee_type.clone() // keep from previous iteraton, if not specified
17367            };
17368
17369            if self
17370                .dialect
17371                .get_reserved_grantees_types()
17372                .contains(&new_grantee_type)
17373            {
17374                self.prev_token();
17375            } else {
17376                grantee_type = new_grantee_type;
17377            }
17378
17379            let grantee = if grantee_type == GranteesType::Public {
17380                Grantee {
17381                    grantee_type: grantee_type.clone(),
17382                    name: None,
17383                }
17384            } else {
17385                let mut name = self.parse_grantee_name()?;
17386                if self.consume_token(&Token::Colon) {
17387                    // Redshift supports namespace prefix for external users and groups:
17388                    // <Namespace>:<GroupName> or <Namespace>:<UserName>
17389                    // https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html
17390                    let ident = self.parse_identifier()?;
17391                    if let GranteeName::ObjectName(namespace) = name {
17392                        name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17393                            format!("{namespace}:{ident}"),
17394                        )]));
17395                    };
17396                }
17397                Grantee {
17398                    grantee_type: grantee_type.clone(),
17399                    name: Some(name),
17400                }
17401            };
17402
17403            values.push(grantee);
17404
17405            if !self.consume_token(&Token::Comma) {
17406                break;
17407            }
17408        }
17409
17410        Ok(values)
17411    }
17412
17413    /// Parse privileges and optional target objects for GRANT/DENY/REVOKE statements.
17414    pub fn parse_grant_deny_revoke_privileges_objects(
17415        &mut self,
17416    ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17417        let privileges = if self.parse_keyword(Keyword::ALL) {
17418            Privileges::All {
17419                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17420            }
17421        } else {
17422            let actions = self.parse_actions_list()?;
17423            Privileges::Actions(actions)
17424        };
17425
17426        let objects = if self.parse_keyword(Keyword::ON) {
17427            if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17428                Some(GrantObjects::AllTablesInSchema {
17429                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17430                })
17431            } else if self.parse_keywords(&[
17432                Keyword::ALL,
17433                Keyword::EXTERNAL,
17434                Keyword::TABLES,
17435                Keyword::IN,
17436                Keyword::SCHEMA,
17437            ]) {
17438                Some(GrantObjects::AllExternalTablesInSchema {
17439                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17440                })
17441            } else if self.parse_keywords(&[
17442                Keyword::ALL,
17443                Keyword::VIEWS,
17444                Keyword::IN,
17445                Keyword::SCHEMA,
17446            ]) {
17447                Some(GrantObjects::AllViewsInSchema {
17448                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17449                })
17450            } else if self.parse_keywords(&[
17451                Keyword::ALL,
17452                Keyword::MATERIALIZED,
17453                Keyword::VIEWS,
17454                Keyword::IN,
17455                Keyword::SCHEMA,
17456            ]) {
17457                Some(GrantObjects::AllMaterializedViewsInSchema {
17458                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17459                })
17460            } else if self.parse_keywords(&[
17461                Keyword::ALL,
17462                Keyword::FUNCTIONS,
17463                Keyword::IN,
17464                Keyword::SCHEMA,
17465            ]) {
17466                Some(GrantObjects::AllFunctionsInSchema {
17467                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17468                })
17469            } else if self.parse_keywords(&[
17470                Keyword::FUTURE,
17471                Keyword::SCHEMAS,
17472                Keyword::IN,
17473                Keyword::DATABASE,
17474            ]) {
17475                Some(GrantObjects::FutureSchemasInDatabase {
17476                    databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17477                })
17478            } else if self.parse_keywords(&[
17479                Keyword::FUTURE,
17480                Keyword::TABLES,
17481                Keyword::IN,
17482                Keyword::SCHEMA,
17483            ]) {
17484                Some(GrantObjects::FutureTablesInSchema {
17485                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17486                })
17487            } else if self.parse_keywords(&[
17488                Keyword::FUTURE,
17489                Keyword::EXTERNAL,
17490                Keyword::TABLES,
17491                Keyword::IN,
17492                Keyword::SCHEMA,
17493            ]) {
17494                Some(GrantObjects::FutureExternalTablesInSchema {
17495                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17496                })
17497            } else if self.parse_keywords(&[
17498                Keyword::FUTURE,
17499                Keyword::VIEWS,
17500                Keyword::IN,
17501                Keyword::SCHEMA,
17502            ]) {
17503                Some(GrantObjects::FutureViewsInSchema {
17504                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17505                })
17506            } else if self.parse_keywords(&[
17507                Keyword::FUTURE,
17508                Keyword::MATERIALIZED,
17509                Keyword::VIEWS,
17510                Keyword::IN,
17511                Keyword::SCHEMA,
17512            ]) {
17513                Some(GrantObjects::FutureMaterializedViewsInSchema {
17514                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17515                })
17516            } else if self.parse_keywords(&[
17517                Keyword::ALL,
17518                Keyword::SEQUENCES,
17519                Keyword::IN,
17520                Keyword::SCHEMA,
17521            ]) {
17522                Some(GrantObjects::AllSequencesInSchema {
17523                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17524                })
17525            } else if self.parse_keywords(&[
17526                Keyword::FUTURE,
17527                Keyword::SEQUENCES,
17528                Keyword::IN,
17529                Keyword::SCHEMA,
17530            ]) {
17531                Some(GrantObjects::FutureSequencesInSchema {
17532                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17533                })
17534            } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
17535                Some(GrantObjects::ResourceMonitors(
17536                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17537                ))
17538            } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17539                Some(GrantObjects::ComputePools(
17540                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17541                ))
17542            } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17543                Some(GrantObjects::FailoverGroup(
17544                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17545                ))
17546            } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17547                Some(GrantObjects::ReplicationGroup(
17548                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17549                ))
17550            } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17551                Some(GrantObjects::ExternalVolumes(
17552                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17553                ))
17554            } else {
17555                let object_type = self.parse_one_of_keywords(&[
17556                    Keyword::SEQUENCE,
17557                    Keyword::DATABASE,
17558                    Keyword::SCHEMA,
17559                    Keyword::TABLE,
17560                    Keyword::VIEW,
17561                    Keyword::WAREHOUSE,
17562                    Keyword::INTEGRATION,
17563                    Keyword::VIEW,
17564                    Keyword::WAREHOUSE,
17565                    Keyword::INTEGRATION,
17566                    Keyword::USER,
17567                    Keyword::CONNECTION,
17568                    Keyword::PROCEDURE,
17569                    Keyword::FUNCTION,
17570                ]);
17571                let objects =
17572                    self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
17573                match object_type {
17574                    Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
17575                    Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
17576                    Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
17577                    Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
17578                    Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
17579                    Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
17580                    Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
17581                    Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
17582                    kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
17583                        if let Some(name) = objects?.first() {
17584                            self.parse_grant_procedure_or_function(name, &kw)?
17585                        } else {
17586                            self.expected_ref("procedure or function name", self.peek_token_ref())?
17587                        }
17588                    }
17589                    Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
17590                    Some(unexpected_keyword) => return Err(ParserError::ParserError(
17591                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
17592                    )),
17593                }
17594            }
17595        } else {
17596            None
17597        };
17598
17599        Ok((privileges, objects))
17600    }
17601
17602    fn parse_grant_procedure_or_function(
17603        &mut self,
17604        name: &ObjectName,
17605        kw: &Option<Keyword>,
17606    ) -> Result<Option<GrantObjects>, ParserError> {
17607        let arg_types = if self.consume_token(&Token::LParen) {
17608            let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
17609            self.expect_token(&Token::RParen)?;
17610            list
17611        } else {
17612            vec![]
17613        };
17614        match kw {
17615            Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
17616                name: name.clone(),
17617                arg_types,
17618            })),
17619            Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
17620                name: name.clone(),
17621                arg_types,
17622            })),
17623            _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
17624        }
17625    }
17626
17627    /// Parse a single grantable permission/action (used within GRANT statements).
17628    pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
17629        fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
17630            let columns = parser.parse_parenthesized_column_list(Optional, false)?;
17631            if columns.is_empty() {
17632                Ok(None)
17633            } else {
17634                Ok(Some(columns))
17635            }
17636        }
17637
17638        // Multi-word privileges
17639        if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
17640            Ok(Action::ImportedPrivileges)
17641        } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
17642            Ok(Action::AddSearchOptimization)
17643        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
17644            Ok(Action::AttachListing)
17645        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
17646            Ok(Action::AttachPolicy)
17647        } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
17648            Ok(Action::BindServiceEndpoint)
17649        } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17650            let role = self.parse_object_name(false)?;
17651            Ok(Action::DatabaseRole { role })
17652        } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
17653            Ok(Action::EvolveSchema)
17654        } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
17655            Ok(Action::ImportShare)
17656        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
17657            Ok(Action::ManageVersions)
17658        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
17659            Ok(Action::ManageReleases)
17660        } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
17661            Ok(Action::OverrideShareRestrictions)
17662        } else if self.parse_keywords(&[
17663            Keyword::PURCHASE,
17664            Keyword::DATA,
17665            Keyword::EXCHANGE,
17666            Keyword::LISTING,
17667        ]) {
17668            Ok(Action::PurchaseDataExchangeListing)
17669        } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
17670            Ok(Action::ResolveAll)
17671        } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
17672            Ok(Action::ReadSession)
17673
17674        // Single-word privileges
17675        } else if self.parse_keyword(Keyword::APPLY) {
17676            let apply_type = self.parse_action_apply_type()?;
17677            Ok(Action::Apply { apply_type })
17678        } else if self.parse_keyword(Keyword::APPLYBUDGET) {
17679            Ok(Action::ApplyBudget)
17680        } else if self.parse_keyword(Keyword::AUDIT) {
17681            Ok(Action::Audit)
17682        } else if self.parse_keyword(Keyword::CONNECT) {
17683            Ok(Action::Connect)
17684        } else if self.parse_keyword(Keyword::CREATE) {
17685            let obj_type = self.maybe_parse_action_create_object_type();
17686            Ok(Action::Create { obj_type })
17687        } else if self.parse_keyword(Keyword::DELETE) {
17688            Ok(Action::Delete)
17689        } else if self.parse_keyword(Keyword::EXEC) {
17690            let obj_type = self.maybe_parse_action_execute_obj_type();
17691            Ok(Action::Exec { obj_type })
17692        } else if self.parse_keyword(Keyword::EXECUTE) {
17693            let obj_type = self.maybe_parse_action_execute_obj_type();
17694            Ok(Action::Execute { obj_type })
17695        } else if self.parse_keyword(Keyword::FAILOVER) {
17696            Ok(Action::Failover)
17697        } else if self.parse_keyword(Keyword::INSERT) {
17698            Ok(Action::Insert {
17699                columns: parse_columns(self)?,
17700            })
17701        } else if self.parse_keyword(Keyword::MANAGE) {
17702            let manage_type = self.parse_action_manage_type()?;
17703            Ok(Action::Manage { manage_type })
17704        } else if self.parse_keyword(Keyword::MODIFY) {
17705            let modify_type = self.parse_action_modify_type();
17706            Ok(Action::Modify { modify_type })
17707        } else if self.parse_keyword(Keyword::MONITOR) {
17708            let monitor_type = self.parse_action_monitor_type();
17709            Ok(Action::Monitor { monitor_type })
17710        } else if self.parse_keyword(Keyword::OPERATE) {
17711            Ok(Action::Operate)
17712        } else if self.parse_keyword(Keyword::REFERENCES) {
17713            Ok(Action::References {
17714                columns: parse_columns(self)?,
17715            })
17716        } else if self.parse_keyword(Keyword::READ) {
17717            Ok(Action::Read)
17718        } else if self.parse_keyword(Keyword::REPLICATE) {
17719            Ok(Action::Replicate)
17720        } else if self.parse_keyword(Keyword::ROLE) {
17721            let role = self.parse_object_name(false)?;
17722            Ok(Action::Role { role })
17723        } else if self.parse_keyword(Keyword::SELECT) {
17724            Ok(Action::Select {
17725                columns: parse_columns(self)?,
17726            })
17727        } else if self.parse_keyword(Keyword::TEMPORARY) {
17728            Ok(Action::Temporary)
17729        } else if self.parse_keyword(Keyword::TRIGGER) {
17730            Ok(Action::Trigger)
17731        } else if self.parse_keyword(Keyword::TRUNCATE) {
17732            Ok(Action::Truncate)
17733        } else if self.parse_keyword(Keyword::UPDATE) {
17734            Ok(Action::Update {
17735                columns: parse_columns(self)?,
17736            })
17737        } else if self.parse_keyword(Keyword::USAGE) {
17738            Ok(Action::Usage)
17739        } else if self.parse_keyword(Keyword::OWNERSHIP) {
17740            Ok(Action::Ownership)
17741        } else if self.parse_keyword(Keyword::DROP) {
17742            Ok(Action::Drop)
17743        } else {
17744            self.expected_ref("a privilege keyword", self.peek_token_ref())?
17745        }
17746    }
17747
17748    fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
17749        // Multi-word object types
17750        if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
17751            Some(ActionCreateObjectType::ApplicationPackage)
17752        } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17753            Some(ActionCreateObjectType::ComputePool)
17754        } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
17755            Some(ActionCreateObjectType::DataExchangeListing)
17756        } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17757            Some(ActionCreateObjectType::ExternalVolume)
17758        } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17759            Some(ActionCreateObjectType::FailoverGroup)
17760        } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
17761            Some(ActionCreateObjectType::NetworkPolicy)
17762        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
17763            Some(ActionCreateObjectType::OrganiationListing)
17764        } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17765            Some(ActionCreateObjectType::ReplicationGroup)
17766        }
17767        // Single-word object types
17768        else if self.parse_keyword(Keyword::ACCOUNT) {
17769            Some(ActionCreateObjectType::Account)
17770        } else if self.parse_keyword(Keyword::APPLICATION) {
17771            Some(ActionCreateObjectType::Application)
17772        } else if self.parse_keyword(Keyword::DATABASE) {
17773            Some(ActionCreateObjectType::Database)
17774        } else if self.parse_keyword(Keyword::INTEGRATION) {
17775            Some(ActionCreateObjectType::Integration)
17776        } else if self.parse_keyword(Keyword::ROLE) {
17777            Some(ActionCreateObjectType::Role)
17778        } else if self.parse_keyword(Keyword::SCHEMA) {
17779            Some(ActionCreateObjectType::Schema)
17780        } else if self.parse_keyword(Keyword::SHARE) {
17781            Some(ActionCreateObjectType::Share)
17782        } else if self.parse_keyword(Keyword::USER) {
17783            Some(ActionCreateObjectType::User)
17784        } else if self.parse_keyword(Keyword::WAREHOUSE) {
17785            Some(ActionCreateObjectType::Warehouse)
17786        } else {
17787            None
17788        }
17789    }
17790
17791    fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
17792        if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
17793            Ok(ActionApplyType::AggregationPolicy)
17794        } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
17795            Ok(ActionApplyType::AuthenticationPolicy)
17796        } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
17797            Ok(ActionApplyType::JoinPolicy)
17798        } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
17799            Ok(ActionApplyType::MaskingPolicy)
17800        } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
17801            Ok(ActionApplyType::PackagesPolicy)
17802        } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
17803            Ok(ActionApplyType::PasswordPolicy)
17804        } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
17805            Ok(ActionApplyType::ProjectionPolicy)
17806        } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
17807            Ok(ActionApplyType::RowAccessPolicy)
17808        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
17809            Ok(ActionApplyType::SessionPolicy)
17810        } else if self.parse_keyword(Keyword::TAG) {
17811            Ok(ActionApplyType::Tag)
17812        } else {
17813            self.expected_ref("GRANT APPLY type", self.peek_token_ref())
17814        }
17815    }
17816
17817    fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
17818        if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
17819            Some(ActionExecuteObjectType::DataMetricFunction)
17820        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
17821            Some(ActionExecuteObjectType::ManagedAlert)
17822        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
17823            Some(ActionExecuteObjectType::ManagedTask)
17824        } else if self.parse_keyword(Keyword::ALERT) {
17825            Some(ActionExecuteObjectType::Alert)
17826        } else if self.parse_keyword(Keyword::TASK) {
17827            Some(ActionExecuteObjectType::Task)
17828        } else {
17829            None
17830        }
17831    }
17832
17833    fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
17834        if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
17835            Ok(ActionManageType::AccountSupportCases)
17836        } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
17837            Ok(ActionManageType::EventSharing)
17838        } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
17839            Ok(ActionManageType::ListingAutoFulfillment)
17840        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
17841            Ok(ActionManageType::OrganizationSupportCases)
17842        } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
17843            Ok(ActionManageType::UserSupportCases)
17844        } else if self.parse_keyword(Keyword::GRANTS) {
17845            Ok(ActionManageType::Grants)
17846        } else if self.parse_keyword(Keyword::WAREHOUSES) {
17847            Ok(ActionManageType::Warehouses)
17848        } else {
17849            self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
17850        }
17851    }
17852
17853    fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
17854        if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
17855            Some(ActionModifyType::LogLevel)
17856        } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
17857            Some(ActionModifyType::TraceLevel)
17858        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
17859            Some(ActionModifyType::SessionLogLevel)
17860        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
17861            Some(ActionModifyType::SessionTraceLevel)
17862        } else {
17863            None
17864        }
17865    }
17866
17867    fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
17868        if self.parse_keyword(Keyword::EXECUTION) {
17869            Some(ActionMonitorType::Execution)
17870        } else if self.parse_keyword(Keyword::SECURITY) {
17871            Some(ActionMonitorType::Security)
17872        } else if self.parse_keyword(Keyword::USAGE) {
17873            Some(ActionMonitorType::Usage)
17874        } else {
17875            None
17876        }
17877    }
17878
17879    /// Parse a grantee name, possibly with a host qualifier (user@host).
17880    pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
17881        let mut name = self.parse_object_name(false)?;
17882        if self.dialect.supports_user_host_grantee()
17883            && name.0.len() == 1
17884            && name.0[0].as_ident().is_some()
17885            && self.consume_token(&Token::AtSign)
17886        {
17887            let user = name.0.pop().unwrap().as_ident().unwrap().clone();
17888            let host = self.parse_identifier()?;
17889            Ok(GranteeName::UserHost { user, host })
17890        } else {
17891            Ok(GranteeName::ObjectName(name))
17892        }
17893    }
17894
17895    /// Parse [`Statement::Deny`]
17896    pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
17897        self.expect_keyword(Keyword::DENY)?;
17898
17899        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17900        let objects = match objects {
17901            Some(o) => o,
17902            None => {
17903                return parser_err!(
17904                    "DENY statements must specify an object",
17905                    self.peek_token_ref().span.start
17906                )
17907            }
17908        };
17909
17910        self.expect_keyword_is(Keyword::TO)?;
17911        let grantees = self.parse_grantees()?;
17912        let cascade = self.parse_cascade_option();
17913        let granted_by = if self.parse_keywords(&[Keyword::AS]) {
17914            Some(self.parse_identifier()?)
17915        } else {
17916            None
17917        };
17918
17919        Ok(Statement::Deny(DenyStatement {
17920            privileges,
17921            objects,
17922            grantees,
17923            cascade,
17924            granted_by,
17925        }))
17926    }
17927
17928    /// Parse a REVOKE statement
17929    pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
17930        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17931
17932        self.expect_keyword_is(Keyword::FROM)?;
17933        let grantees = self.parse_grantees()?;
17934
17935        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17936            Some(self.parse_identifier()?)
17937        } else {
17938            None
17939        };
17940
17941        let cascade = self.parse_cascade_option();
17942
17943        Ok(Revoke {
17944            privileges,
17945            objects,
17946            grantees,
17947            granted_by,
17948            cascade,
17949        })
17950    }
17951
17952    /// Parse an REPLACE statement
17953    pub fn parse_replace(
17954        &mut self,
17955        replace_token: TokenWithSpan,
17956    ) -> Result<Statement, ParserError> {
17957        if !dialect_of!(self is MySqlDialect | GenericDialect) {
17958            return parser_err!(
17959                "Unsupported statement REPLACE",
17960                self.peek_token_ref().span.start
17961            );
17962        }
17963
17964        let mut insert = self.parse_insert(replace_token)?;
17965        if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
17966            *replace_into = true;
17967        }
17968
17969        Ok(insert)
17970    }
17971
17972    /// Parse an INSERT statement, returning a `Box`ed SetExpr
17973    ///
17974    /// This is used to reduce the size of the stack frames in debug builds
17975    fn parse_insert_setexpr_boxed(
17976        &mut self,
17977        insert_token: TokenWithSpan,
17978    ) -> Result<Box<SetExpr>, ParserError> {
17979        Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
17980    }
17981
17982    /// Parse an INSERT statement
17983    pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
17984        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
17985        let or = self.parse_conflict_clause();
17986        let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
17987            None
17988        } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
17989            Some(MysqlInsertPriority::LowPriority)
17990        } else if self.parse_keyword(Keyword::DELAYED) {
17991            Some(MysqlInsertPriority::Delayed)
17992        } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
17993            Some(MysqlInsertPriority::HighPriority)
17994        } else {
17995            None
17996        };
17997
17998        let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
17999            && self.parse_keyword(Keyword::IGNORE);
18000
18001        let replace_into = false;
18002
18003        let overwrite = self.parse_keyword(Keyword::OVERWRITE);
18004        let into = self.parse_keyword(Keyword::INTO);
18005
18006        let local = self.parse_keyword(Keyword::LOCAL);
18007
18008        if self.parse_keyword(Keyword::DIRECTORY) {
18009            let path = self.parse_literal_string()?;
18010            let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
18011                Some(self.parse_file_format()?)
18012            } else {
18013                None
18014            };
18015            let source = self.parse_query()?;
18016            Ok(Statement::Directory {
18017                local,
18018                path,
18019                overwrite,
18020                file_format,
18021                source,
18022            })
18023        } else {
18024            // Hive lets you put table here regardless
18025            let table = self.parse_keyword(Keyword::TABLE);
18026            let table_object = self.parse_table_object()?;
18027
18028            let table_alias = if self.dialect.supports_insert_table_alias()
18029                && !self.peek_sub_query()
18030                && self
18031                    .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18032                    .is_none()
18033            {
18034                if self.parse_keyword(Keyword::AS) {
18035                    Some(TableAliasWithoutColumns {
18036                        explicit: true,
18037                        alias: self.parse_identifier()?,
18038                    })
18039                } else {
18040                    self.maybe_parse(|parser| parser.parse_identifier())?
18041                        .map(|alias| TableAliasWithoutColumns {
18042                            explicit: false,
18043                            alias,
18044                        })
18045                }
18046            } else {
18047                None
18048            };
18049
18050            let is_mysql = dialect_of!(self is MySqlDialect);
18051
18052            let (columns, partitioned, after_columns, output, source, assignments) = if self
18053                .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18054            {
18055                (vec![], None, vec![], None, None, vec![])
18056            } else {
18057                let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
18058                    let columns =
18059                        self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
18060
18061                    let partitioned = self.parse_insert_partition()?;
18062                    // Hive allows you to specify columns after partitions as well if you want.
18063                    let after_columns = if dialect_of!(self is HiveDialect) {
18064                        self.parse_parenthesized_column_list(Optional, false)?
18065                    } else {
18066                        vec![]
18067                    };
18068                    (columns, partitioned, after_columns)
18069                } else {
18070                    Default::default()
18071                };
18072
18073                let output = self.maybe_parse_output_clause()?;
18074
18075                let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
18076                    || self.peek_keyword(Keyword::SETTINGS)
18077                {
18078                    (None, vec![])
18079                } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
18080                    (None, self.parse_comma_separated(Parser::parse_assignment)?)
18081                } else {
18082                    (Some(self.parse_query()?), vec![])
18083                };
18084
18085                (
18086                    columns,
18087                    partitioned,
18088                    after_columns,
18089                    output,
18090                    source,
18091                    assignments,
18092                )
18093            };
18094
18095            let (format_clause, settings) = if self.dialect.supports_insert_format() {
18096                // Settings always comes before `FORMAT` for ClickHouse:
18097                // <https://clickhouse.com/docs/en/sql-reference/statements/insert-into>
18098                let settings = self.parse_settings()?;
18099
18100                let format = if self.parse_keyword(Keyword::FORMAT) {
18101                    Some(self.parse_input_format_clause()?)
18102                } else {
18103                    None
18104                };
18105
18106                (format, settings)
18107            } else {
18108                Default::default()
18109            };
18110
18111            let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
18112                && self.parse_keyword(Keyword::AS)
18113            {
18114                let row_alias = self.parse_object_name(false)?;
18115                let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
18116                Some(InsertAliases {
18117                    row_alias,
18118                    col_aliases,
18119                })
18120            } else {
18121                None
18122            };
18123
18124            let on = if self.parse_keyword(Keyword::ON) {
18125                if self.parse_keyword(Keyword::CONFLICT) {
18126                    let conflict_target =
18127                        if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
18128                            Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
18129                        } else if self.peek_token_ref().token == Token::LParen {
18130                            Some(ConflictTarget::Columns(
18131                                self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18132                            ))
18133                        } else {
18134                            None
18135                        };
18136
18137                    self.expect_keyword_is(Keyword::DO)?;
18138                    let action = if self.parse_keyword(Keyword::NOTHING) {
18139                        OnConflictAction::DoNothing
18140                    } else {
18141                        self.expect_keyword_is(Keyword::UPDATE)?;
18142                        self.expect_keyword_is(Keyword::SET)?;
18143                        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18144                        let selection = if self.parse_keyword(Keyword::WHERE) {
18145                            Some(self.parse_expr()?)
18146                        } else {
18147                            None
18148                        };
18149                        OnConflictAction::DoUpdate(DoUpdate {
18150                            assignments,
18151                            selection,
18152                        })
18153                    };
18154
18155                    Some(OnInsert::OnConflict(OnConflict {
18156                        conflict_target,
18157                        action,
18158                    }))
18159                } else {
18160                    self.expect_keyword_is(Keyword::DUPLICATE)?;
18161                    self.expect_keyword_is(Keyword::KEY)?;
18162                    self.expect_keyword_is(Keyword::UPDATE)?;
18163                    let l = self.parse_comma_separated(Parser::parse_assignment)?;
18164
18165                    Some(OnInsert::DuplicateKeyUpdate(l))
18166                }
18167            } else {
18168                None
18169            };
18170
18171            let returning = if self.parse_keyword(Keyword::RETURNING) {
18172                Some(self.parse_comma_separated(Parser::parse_select_item)?)
18173            } else {
18174                None
18175            };
18176
18177            Ok(Insert {
18178                insert_token: insert_token.into(),
18179                optimizer_hints,
18180                or,
18181                table: table_object,
18182                table_alias,
18183                ignore,
18184                into,
18185                overwrite,
18186                partitioned,
18187                columns,
18188                after_columns,
18189                source,
18190                assignments,
18191                has_table_keyword: table,
18192                on,
18193                returning,
18194                output,
18195                replace_into,
18196                priority,
18197                insert_alias,
18198                settings,
18199                format_clause,
18200                multi_table_insert_type: None,
18201                multi_table_into_clauses: vec![],
18202                multi_table_when_clauses: vec![],
18203                multi_table_else_clause: None,
18204            }
18205            .into())
18206        }
18207    }
18208
18209    /// Parses input format clause used for ClickHouse.
18210    ///
18211    /// <https://clickhouse.com/docs/en/interfaces/formats>
18212    pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18213        let ident = self.parse_identifier()?;
18214        let values = self
18215            .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18216            .unwrap_or_default();
18217
18218        Ok(InputFormatClause { ident, values })
18219    }
18220
18221    /// Returns true if the immediate tokens look like the
18222    /// beginning of a subquery. `(SELECT ...`
18223    fn peek_subquery_start(&mut self) -> bool {
18224        matches!(
18225            self.peek_tokens_ref(),
18226            [
18227                TokenWithSpan {
18228                    token: Token::LParen,
18229                    ..
18230                },
18231                TokenWithSpan {
18232                    token: Token::Word(Word {
18233                        keyword: Keyword::SELECT,
18234                        ..
18235                    }),
18236                    ..
18237                },
18238            ]
18239        )
18240    }
18241
18242    /// Returns true if the immediate tokens look like the
18243    /// beginning of a subquery possibly preceded by CTEs;
18244    /// i.e. `(WITH ...` or `(SELECT ...`.
18245    fn peek_subquery_or_cte_start(&mut self) -> bool {
18246        matches!(
18247            self.peek_tokens_ref(),
18248            [
18249                TokenWithSpan {
18250                    token: Token::LParen,
18251                    ..
18252                },
18253                TokenWithSpan {
18254                    token: Token::Word(Word {
18255                        keyword: Keyword::SELECT | Keyword::WITH,
18256                        ..
18257                    }),
18258                    ..
18259                },
18260            ]
18261        )
18262    }
18263
18264    fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18265        if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18266            Some(SqliteOnConflict::Replace)
18267        } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18268            Some(SqliteOnConflict::Rollback)
18269        } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18270            Some(SqliteOnConflict::Abort)
18271        } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18272            Some(SqliteOnConflict::Fail)
18273        } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18274            Some(SqliteOnConflict::Ignore)
18275        } else if self.parse_keyword(Keyword::REPLACE) {
18276            Some(SqliteOnConflict::Replace)
18277        } else {
18278            None
18279        }
18280    }
18281
18282    /// Parse an optional `PARTITION (...)` clause for INSERT statements.
18283    pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18284        if self.parse_keyword(Keyword::PARTITION) {
18285            self.expect_token(&Token::LParen)?;
18286            let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18287            self.expect_token(&Token::RParen)?;
18288            Ok(partition_cols)
18289        } else {
18290            Ok(None)
18291        }
18292    }
18293
18294    /// Parse optional Hive `INPUTFORMAT ... SERDE ...` clause used by LOAD DATA.
18295    pub fn parse_load_data_table_format(
18296        &mut self,
18297    ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18298        if self.parse_keyword(Keyword::INPUTFORMAT) {
18299            let input_format = self.parse_expr()?;
18300            self.expect_keyword_is(Keyword::SERDE)?;
18301            let serde = self.parse_expr()?;
18302            Ok(Some(HiveLoadDataFormat {
18303                input_format,
18304                serde,
18305            }))
18306        } else {
18307            Ok(None)
18308        }
18309    }
18310
18311    /// Parse an UPDATE statement, returning a `Box`ed SetExpr
18312    ///
18313    /// This is used to reduce the size of the stack frames in debug builds
18314    fn parse_update_setexpr_boxed(
18315        &mut self,
18316        update_token: TokenWithSpan,
18317    ) -> Result<Box<SetExpr>, ParserError> {
18318        Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18319    }
18320
18321    /// Parse an `UPDATE` statement and return `Statement::Update`.
18322    pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18323        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18324        let or = self.parse_conflict_clause();
18325        let table = self.parse_table_and_joins()?;
18326        let from_before_set = if self.parse_keyword(Keyword::FROM) {
18327            Some(UpdateTableFromKind::BeforeSet(
18328                self.parse_table_with_joins()?,
18329            ))
18330        } else {
18331            None
18332        };
18333        self.expect_keyword(Keyword::SET)?;
18334        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18335
18336        let output = self.maybe_parse_output_clause()?;
18337
18338        let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18339            Some(UpdateTableFromKind::AfterSet(
18340                self.parse_table_with_joins()?,
18341            ))
18342        } else {
18343            from_before_set
18344        };
18345        let selection = if self.parse_keyword(Keyword::WHERE) {
18346            Some(self.parse_expr()?)
18347        } else {
18348            None
18349        };
18350        let returning = if self.parse_keyword(Keyword::RETURNING) {
18351            Some(self.parse_comma_separated(Parser::parse_select_item)?)
18352        } else {
18353            None
18354        };
18355        let order_by = if self.dialect.supports_update_order_by()
18356            && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18357        {
18358            self.parse_comma_separated(Parser::parse_order_by_expr)?
18359        } else {
18360            vec![]
18361        };
18362        let limit = if self.parse_keyword(Keyword::LIMIT) {
18363            Some(self.parse_expr()?)
18364        } else {
18365            None
18366        };
18367        Ok(Update {
18368            update_token: update_token.into(),
18369            optimizer_hints,
18370            table,
18371            assignments,
18372            from,
18373            selection,
18374            returning,
18375            output,
18376            or,
18377            order_by,
18378            limit,
18379        }
18380        .into())
18381    }
18382
18383    /// Parse a `var = expr` assignment, used in an UPDATE statement
18384    pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18385        let target = self.parse_assignment_target()?;
18386        self.expect_token(&Token::Eq)?;
18387        let value = self.parse_expr()?;
18388        Ok(Assignment { target, value })
18389    }
18390
18391    /// Parse the left-hand side of an assignment, used in an UPDATE statement
18392    pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18393        if self.consume_token(&Token::LParen) {
18394            let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18395            self.expect_token(&Token::RParen)?;
18396            Ok(AssignmentTarget::Tuple(columns))
18397        } else {
18398            let column = self.parse_object_name(false)?;
18399            Ok(AssignmentTarget::ColumnName(column))
18400        }
18401    }
18402
18403    /// Parse a single function argument, handling named and unnamed variants.
18404    pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18405        let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
18406            self.maybe_parse(|p| {
18407                let name = p.parse_expr()?;
18408                let operator = p.parse_function_named_arg_operator()?;
18409                let arg = p.parse_wildcard_expr()?.into();
18410                Ok(FunctionArg::ExprNamed {
18411                    name,
18412                    arg,
18413                    operator,
18414                })
18415            })?
18416        } else {
18417            self.maybe_parse(|p| {
18418                let name = p.parse_identifier()?;
18419                let operator = p.parse_function_named_arg_operator()?;
18420                let arg = p.parse_wildcard_expr()?.into();
18421                Ok(FunctionArg::Named {
18422                    name,
18423                    arg,
18424                    operator,
18425                })
18426            })?
18427        };
18428        if let Some(arg) = arg {
18429            return Ok(arg);
18430        }
18431        let wildcard_expr = self.parse_wildcard_expr()?;
18432        let arg_expr: FunctionArgExpr = match wildcard_expr {
18433            Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18434                // Support `* EXCLUDE(col1, col2, ...)` inside function calls (e.g. Snowflake's
18435                // `HASH(* EXCLUDE(col))`).  Parse the options the same way SELECT items do.
18436                let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18437                if opts.opt_exclude.is_some()
18438                    || opts.opt_except.is_some()
18439                    || opts.opt_replace.is_some()
18440                    || opts.opt_rename.is_some()
18441                    || opts.opt_ilike.is_some()
18442                {
18443                    FunctionArgExpr::WildcardWithOptions(opts)
18444                } else {
18445                    wildcard_expr.into()
18446                }
18447            }
18448            other => other.into(),
18449        };
18450        Ok(FunctionArg::Unnamed(arg_expr))
18451    }
18452
18453    fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18454        if self.parse_keyword(Keyword::VALUE) {
18455            return Ok(FunctionArgOperator::Value);
18456        }
18457        let tok = self.next_token();
18458        match tok.token {
18459            Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18460                Ok(FunctionArgOperator::RightArrow)
18461            }
18462            Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
18463                Ok(FunctionArgOperator::Equals)
18464            }
18465            Token::Assignment
18466                if self
18467                    .dialect
18468                    .supports_named_fn_args_with_assignment_operator() =>
18469            {
18470                Ok(FunctionArgOperator::Assignment)
18471            }
18472            Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
18473                Ok(FunctionArgOperator::Colon)
18474            }
18475            _ => {
18476                self.prev_token();
18477                self.expected("argument operator", tok)
18478            }
18479        }
18480    }
18481
18482    /// Parse an optional, comma-separated list of function arguments (consumes closing paren).
18483    pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
18484        if self.consume_token(&Token::RParen) {
18485            Ok(vec![])
18486        } else {
18487            let args = self.parse_comma_separated(Parser::parse_function_args)?;
18488            self.expect_token(&Token::RParen)?;
18489            Ok(args)
18490        }
18491    }
18492
18493    fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
18494        if self.consume_token(&Token::RParen) {
18495            return Ok(TableFunctionArgs {
18496                args: vec![],
18497                settings: None,
18498            });
18499        }
18500        let mut args = vec![];
18501        let settings = loop {
18502            if let Some(settings) = self.parse_settings()? {
18503                break Some(settings);
18504            }
18505            args.push(self.parse_function_args()?);
18506            if self.is_parse_comma_separated_end() {
18507                break None;
18508            }
18509        };
18510        self.expect_token(&Token::RParen)?;
18511        Ok(TableFunctionArgs { args, settings })
18512    }
18513
18514    /// Parses a potentially empty list of arguments to a function
18515    /// (including the closing parenthesis).
18516    ///
18517    /// Examples:
18518    /// ```sql
18519    /// FIRST_VALUE(x ORDER BY 1,2,3);
18520    /// FIRST_VALUE(x IGNORE NULL);
18521    /// ```
18522    fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
18523        let mut clauses = vec![];
18524
18525        // Handle clauses that may exist with an empty argument list
18526
18527        if let Some(null_clause) = self.parse_json_null_clause() {
18528            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18529        }
18530
18531        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18532            clauses.push(FunctionArgumentClause::JsonReturningClause(
18533                json_returning_clause,
18534            ));
18535        }
18536
18537        if self.consume_token(&Token::RParen) {
18538            return Ok(FunctionArgumentList {
18539                duplicate_treatment: None,
18540                args: vec![],
18541                clauses,
18542            });
18543        }
18544
18545        let duplicate_treatment = self.parse_duplicate_treatment()?;
18546        let args = self.parse_comma_separated(Parser::parse_function_args)?;
18547
18548        if self.dialect.supports_window_function_null_treatment_arg() {
18549            if let Some(null_treatment) = self.parse_null_treatment()? {
18550                clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
18551            }
18552        }
18553
18554        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
18555            clauses.push(FunctionArgumentClause::OrderBy(
18556                self.parse_comma_separated(Parser::parse_order_by_expr)?,
18557            ));
18558        }
18559
18560        if self.parse_keyword(Keyword::LIMIT) {
18561            clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
18562        }
18563
18564        if dialect_of!(self is GenericDialect | BigQueryDialect)
18565            && self.parse_keyword(Keyword::HAVING)
18566        {
18567            let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
18568                Keyword::MIN => HavingBoundKind::Min,
18569                Keyword::MAX => HavingBoundKind::Max,
18570                unexpected_keyword => return Err(ParserError::ParserError(
18571                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
18572                )),
18573            };
18574            clauses.push(FunctionArgumentClause::Having(HavingBound(
18575                kind,
18576                self.parse_expr()?,
18577            )))
18578        }
18579
18580        if dialect_of!(self is GenericDialect | MySqlDialect)
18581            && self.parse_keyword(Keyword::SEPARATOR)
18582        {
18583            clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
18584        }
18585
18586        if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
18587            clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
18588        }
18589
18590        if let Some(null_clause) = self.parse_json_null_clause() {
18591            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18592        }
18593
18594        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18595            clauses.push(FunctionArgumentClause::JsonReturningClause(
18596                json_returning_clause,
18597            ));
18598        }
18599
18600        self.expect_token(&Token::RParen)?;
18601        Ok(FunctionArgumentList {
18602            duplicate_treatment,
18603            args,
18604            clauses,
18605        })
18606    }
18607
18608    fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
18609        if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
18610            Some(JsonNullClause::AbsentOnNull)
18611        } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
18612            Some(JsonNullClause::NullOnNull)
18613        } else {
18614            None
18615        }
18616    }
18617
18618    fn maybe_parse_json_returning_clause(
18619        &mut self,
18620    ) -> Result<Option<JsonReturningClause>, ParserError> {
18621        if self.parse_keyword(Keyword::RETURNING) {
18622            let data_type = self.parse_data_type()?;
18623            Ok(Some(JsonReturningClause { data_type }))
18624        } else {
18625            Ok(None)
18626        }
18627    }
18628
18629    fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
18630        let loc = self.peek_token_ref().span.start;
18631        match (
18632            self.parse_keyword(Keyword::ALL),
18633            self.parse_keyword(Keyword::DISTINCT),
18634        ) {
18635            (true, false) => Ok(Some(DuplicateTreatment::All)),
18636            (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
18637            (false, false) => Ok(None),
18638            (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
18639        }
18640    }
18641
18642    /// Parse a comma-delimited list of projections after SELECT
18643    pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
18644        let prefix = self
18645            .parse_one_of_keywords(
18646                self.dialect
18647                    .get_reserved_keywords_for_select_item_operator(),
18648            )
18649            .map(|keyword| Ident::new(format!("{keyword:?}")));
18650
18651        match self.parse_wildcard_expr()? {
18652            Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
18653                SelectItemQualifiedWildcardKind::ObjectName(prefix),
18654                self.parse_wildcard_additional_options(token.0)?,
18655            )),
18656            Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
18657                self.parse_wildcard_additional_options(token.0)?,
18658            )),
18659            Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
18660                parser_err!(
18661                    format!("Expected an expression, found: {}", v),
18662                    self.peek_token_ref().span.start
18663                )
18664            }
18665            Expr::BinaryOp {
18666                left,
18667                op: BinaryOperator::Eq,
18668                right,
18669            } if self.dialect.supports_eq_alias_assignment()
18670                && matches!(left.as_ref(), Expr::Identifier(_)) =>
18671            {
18672                let Expr::Identifier(alias) = *left else {
18673                    return parser_err!(
18674                        "BUG: expected identifier expression as alias",
18675                        self.peek_token_ref().span.start
18676                    );
18677                };
18678                Ok(SelectItem::ExprWithAlias {
18679                    expr: *right,
18680                    alias,
18681                })
18682            }
18683            expr if self.dialect.supports_select_expr_star()
18684                && self.consume_tokens(&[Token::Period, Token::Mul]) =>
18685            {
18686                let wildcard_token = self.get_previous_token().clone();
18687                Ok(SelectItem::QualifiedWildcard(
18688                    SelectItemQualifiedWildcardKind::Expr(expr),
18689                    self.parse_wildcard_additional_options(wildcard_token)?,
18690                ))
18691            }
18692            expr if self.dialect.supports_select_item_multi_column_alias()
18693                && self.peek_keyword(Keyword::AS)
18694                && self.peek_nth_token(1).token == Token::LParen =>
18695            {
18696                self.expect_keyword(Keyword::AS)?;
18697                self.expect_token(&Token::LParen)?;
18698                let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
18699                self.expect_token(&Token::RParen)?;
18700                Ok(SelectItem::ExprWithAliases {
18701                    expr: maybe_prefixed_expr(expr, prefix),
18702                    aliases,
18703                })
18704            }
18705            expr => self
18706                .maybe_parse_select_item_alias()
18707                .map(|alias| match alias {
18708                    Some(alias) => SelectItem::ExprWithAlias {
18709                        expr: maybe_prefixed_expr(expr, prefix),
18710                        alias,
18711                    },
18712                    None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
18713                }),
18714        }
18715    }
18716
18717    /// Parse an [`WildcardAdditionalOptions`] information for wildcard select items.
18718    ///
18719    /// If it is not possible to parse it, will return an option.
18720    pub fn parse_wildcard_additional_options(
18721        &mut self,
18722        wildcard_token: TokenWithSpan,
18723    ) -> Result<WildcardAdditionalOptions, ParserError> {
18724        let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
18725            self.parse_optional_select_item_ilike()?
18726        } else {
18727            None
18728        };
18729        let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
18730        {
18731            self.parse_optional_select_item_exclude()?
18732        } else {
18733            None
18734        };
18735        let opt_except = if self.dialect.supports_select_wildcard_except() {
18736            self.parse_optional_select_item_except()?
18737        } else {
18738            None
18739        };
18740        let opt_replace = if self.dialect.supports_select_wildcard_replace() {
18741            self.parse_optional_select_item_replace()?
18742        } else {
18743            None
18744        };
18745        let opt_rename = if self.dialect.supports_select_wildcard_rename() {
18746            self.parse_optional_select_item_rename()?
18747        } else {
18748            None
18749        };
18750
18751        let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
18752            self.maybe_parse_select_item_alias()?
18753        } else {
18754            None
18755        };
18756
18757        Ok(WildcardAdditionalOptions {
18758            wildcard_token: wildcard_token.into(),
18759            opt_ilike,
18760            opt_exclude,
18761            opt_except,
18762            opt_rename,
18763            opt_replace,
18764            opt_alias,
18765        })
18766    }
18767
18768    /// Parse an [`Ilike`](IlikeSelectItem) information for wildcard select items.
18769    ///
18770    /// If it is not possible to parse it, will return an option.
18771    pub fn parse_optional_select_item_ilike(
18772        &mut self,
18773    ) -> Result<Option<IlikeSelectItem>, ParserError> {
18774        let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
18775            let next_token = self.next_token();
18776            let pattern = match next_token.token {
18777                Token::SingleQuotedString(s) => s,
18778                _ => return self.expected("ilike pattern", next_token),
18779            };
18780            Some(IlikeSelectItem { pattern })
18781        } else {
18782            None
18783        };
18784        Ok(opt_ilike)
18785    }
18786
18787    /// Parse an [`Exclude`](ExcludeSelectItem) information for wildcard select items.
18788    ///
18789    /// If it is not possible to parse it, will return an option.
18790    pub fn parse_optional_select_item_exclude(
18791        &mut self,
18792    ) -> Result<Option<ExcludeSelectItem>, ParserError> {
18793        let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
18794            if self.consume_token(&Token::LParen) {
18795                let columns =
18796                    self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
18797                self.expect_token(&Token::RParen)?;
18798                Some(ExcludeSelectItem::Multiple(columns))
18799            } else {
18800                let column = self.parse_object_name(false)?;
18801                Some(ExcludeSelectItem::Single(column))
18802            }
18803        } else {
18804            None
18805        };
18806
18807        Ok(opt_exclude)
18808    }
18809
18810    /// Parse an [`Except`](ExceptSelectItem) information for wildcard select items.
18811    ///
18812    /// If it is not possible to parse it, will return an option.
18813    pub fn parse_optional_select_item_except(
18814        &mut self,
18815    ) -> Result<Option<ExceptSelectItem>, ParserError> {
18816        let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
18817            if self.peek_token_ref().token == Token::LParen {
18818                let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
18819                match &idents[..] {
18820                    [] => {
18821                        return self.expected_ref(
18822                            "at least one column should be parsed by the expect clause",
18823                            self.peek_token_ref(),
18824                        )?;
18825                    }
18826                    [first, idents @ ..] => Some(ExceptSelectItem {
18827                        first_element: first.clone(),
18828                        additional_elements: idents.to_vec(),
18829                    }),
18830                }
18831            } else {
18832                // Clickhouse allows EXCEPT column_name
18833                let ident = self.parse_identifier()?;
18834                Some(ExceptSelectItem {
18835                    first_element: ident,
18836                    additional_elements: vec![],
18837                })
18838            }
18839        } else {
18840            None
18841        };
18842
18843        Ok(opt_except)
18844    }
18845
18846    /// Parse a [`Rename`](RenameSelectItem) information for wildcard select items.
18847    pub fn parse_optional_select_item_rename(
18848        &mut self,
18849    ) -> Result<Option<RenameSelectItem>, ParserError> {
18850        let opt_rename = if self.parse_keyword(Keyword::RENAME) {
18851            if self.consume_token(&Token::LParen) {
18852                let idents =
18853                    self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
18854                self.expect_token(&Token::RParen)?;
18855                Some(RenameSelectItem::Multiple(idents))
18856            } else {
18857                let ident = self.parse_identifier_with_alias()?;
18858                Some(RenameSelectItem::Single(ident))
18859            }
18860        } else {
18861            None
18862        };
18863
18864        Ok(opt_rename)
18865    }
18866
18867    /// Parse a [`Replace`](ReplaceSelectItem) information for wildcard select items.
18868    pub fn parse_optional_select_item_replace(
18869        &mut self,
18870    ) -> Result<Option<ReplaceSelectItem>, ParserError> {
18871        let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
18872            if self.consume_token(&Token::LParen) {
18873                let items = self.parse_comma_separated(|parser| {
18874                    Ok(Box::new(parser.parse_replace_elements()?))
18875                })?;
18876                self.expect_token(&Token::RParen)?;
18877                Some(ReplaceSelectItem { items })
18878            } else {
18879                let tok = self.next_token();
18880                return self.expected("( after REPLACE but", tok);
18881            }
18882        } else {
18883            None
18884        };
18885
18886        Ok(opt_replace)
18887    }
18888    /// Parse a single element of a `REPLACE (...)` select-item clause.
18889    pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
18890        let expr = self.parse_expr()?;
18891        let as_keyword = self.parse_keyword(Keyword::AS);
18892        let ident = self.parse_identifier()?;
18893        Ok(ReplaceSelectElement {
18894            expr,
18895            column_name: ident,
18896            as_keyword,
18897        })
18898    }
18899
18900    /// Parse ASC or DESC, returns an Option with true if ASC, false of DESC or `None` if none of
18901    /// them.
18902    pub fn parse_asc_desc(&mut self) -> Option<bool> {
18903        if self.parse_keyword(Keyword::ASC) {
18904            Some(true)
18905        } else if self.parse_keyword(Keyword::DESC) {
18906            Some(false)
18907        } else {
18908            None
18909        }
18910    }
18911
18912    /// Parse ASC or DESC and map to [OrderBySort].
18913    fn parse_optional_order_by_sort(&mut self) -> Option<OrderBySort> {
18914        match self.parse_asc_desc() {
18915            Some(true) => Some(OrderBySort::Asc),
18916            Some(false) => Some(OrderBySort::Desc),
18917            None => None,
18918        }
18919    }
18920
18921    /// Parse an [OrderByExpr] expression.
18922    pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
18923        self.parse_order_by_expr_inner(false)
18924            .map(|(order_by, _)| order_by)
18925    }
18926
18927    /// Parse an [IndexColumn].
18928    pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
18929        self.parse_order_by_expr_inner(true)
18930            .map(|(column, operator_class)| IndexColumn {
18931                column,
18932                operator_class,
18933            })
18934    }
18935
18936    fn parse_order_by_expr_inner(
18937        &mut self,
18938        with_operator_class: bool,
18939    ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
18940        let expr = self.parse_expr()?;
18941
18942        let operator_class: Option<ObjectName> = if with_operator_class {
18943            // We check that if non of the following keywords are present, then we parse an
18944            // identifier as operator class.
18945            if self
18946                .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
18947                .is_some()
18948            {
18949                None
18950            } else {
18951                self.maybe_parse(|parser| parser.parse_object_name(false))?
18952            }
18953        } else {
18954            None
18955        };
18956
18957        let options = if !with_operator_class
18958            && self.dialect.supports_order_by_using_operator()
18959            && self.parse_keyword(Keyword::USING)
18960        {
18961            let op = self.parse_order_by_using_operator()?;
18962            OrderByOptions {
18963                sort: Some(OrderBySort::Using(op)),
18964                nulls_first: self.parse_null_ordering_modifier(),
18965            }
18966        } else {
18967            self.parse_order_by_options()?
18968        };
18969
18970        let with_fill = if self.dialect.supports_with_fill()
18971            && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
18972        {
18973            Some(self.parse_with_fill()?)
18974        } else {
18975            None
18976        };
18977
18978        Ok((
18979            OrderByExpr {
18980                expr,
18981                options,
18982                with_fill,
18983            },
18984            operator_class,
18985        ))
18986    }
18987
18988    fn parse_order_by_using_operator(&mut self) -> Result<ObjectName, ParserError> {
18989        if self.parse_keyword(Keyword::OPERATOR) {
18990            self.expect_token(&Token::LParen)?;
18991            let operator_name = self.parse_operator_name()?;
18992            self.expect_token(&Token::RParen)?;
18993            return Ok(operator_name);
18994        }
18995
18996        let token = self.next_token();
18997        Ok(ObjectName::from(vec![Ident::new(token.token.to_string())]))
18998    }
18999
19000    fn parse_null_ordering_modifier(&mut self) -> Option<bool> {
19001        if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
19002            Some(true)
19003        } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
19004            Some(false)
19005        } else {
19006            None
19007        }
19008    }
19009
19010    fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
19011        let sort = self.parse_optional_order_by_sort();
19012        let nulls_first = self.parse_null_ordering_modifier();
19013
19014        Ok(OrderByOptions { sort, nulls_first })
19015    }
19016
19017    // Parse a WITH FILL clause (ClickHouse dialect)
19018    // that follow the WITH FILL keywords in a ORDER BY clause
19019    /// Parse a `WITH FILL` clause used in ORDER BY (ClickHouse dialect).
19020    pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
19021        let from = if self.parse_keyword(Keyword::FROM) {
19022            Some(self.parse_expr()?)
19023        } else {
19024            None
19025        };
19026
19027        let to = if self.parse_keyword(Keyword::TO) {
19028            Some(self.parse_expr()?)
19029        } else {
19030            None
19031        };
19032
19033        let step = if self.parse_keyword(Keyword::STEP) {
19034            Some(self.parse_expr()?)
19035        } else {
19036            None
19037        };
19038
19039        Ok(WithFill { from, to, step })
19040    }
19041
19042    /// Parse a set of comma separated INTERPOLATE expressions (ClickHouse dialect)
19043    /// that follow the INTERPOLATE keyword in an ORDER BY clause with the WITH FILL modifier
19044    pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
19045        if !self.parse_keyword(Keyword::INTERPOLATE) {
19046            return Ok(None);
19047        }
19048
19049        if self.consume_token(&Token::LParen) {
19050            let interpolations =
19051                self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
19052            self.expect_token(&Token::RParen)?;
19053            // INTERPOLATE () and INTERPOLATE ( ... ) variants
19054            return Ok(Some(Interpolate {
19055                exprs: Some(interpolations),
19056            }));
19057        }
19058
19059        // INTERPOLATE
19060        Ok(Some(Interpolate { exprs: None }))
19061    }
19062
19063    /// Parse a INTERPOLATE expression (ClickHouse dialect)
19064    pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
19065        let column = self.parse_identifier()?;
19066        let expr = if self.parse_keyword(Keyword::AS) {
19067            Some(self.parse_expr()?)
19068        } else {
19069            None
19070        };
19071        Ok(InterpolateExpr { column, expr })
19072    }
19073
19074    /// Parse a TOP clause, MSSQL equivalent of LIMIT,
19075    /// that follows after `SELECT [DISTINCT]`.
19076    pub fn parse_top(&mut self) -> Result<Top, ParserError> {
19077        let quantity = if self.consume_token(&Token::LParen) {
19078            let quantity = self.parse_expr()?;
19079            self.expect_token(&Token::RParen)?;
19080            Some(TopQuantity::Expr(quantity))
19081        } else {
19082            let next_token = self.next_token();
19083            let quantity = match next_token.token {
19084                Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
19085                _ => self.expected("literal int", next_token)?,
19086            };
19087            Some(TopQuantity::Constant(quantity))
19088        };
19089
19090        let percent = self.parse_keyword(Keyword::PERCENT);
19091
19092        let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
19093
19094        Ok(Top {
19095            with_ties,
19096            percent,
19097            quantity,
19098        })
19099    }
19100
19101    /// Parse a LIMIT clause
19102    pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
19103        if self.parse_keyword(Keyword::ALL) {
19104            Ok(None)
19105        } else {
19106            Ok(Some(self.parse_expr()?))
19107        }
19108    }
19109
19110    /// Parse an OFFSET clause
19111    pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
19112        let value = self.parse_expr()?;
19113        let rows = if self.parse_keyword(Keyword::ROW) {
19114            OffsetRows::Row
19115        } else if self.parse_keyword(Keyword::ROWS) {
19116            OffsetRows::Rows
19117        } else {
19118            OffsetRows::None
19119        };
19120        Ok(Offset { value, rows })
19121    }
19122
19123    /// Parse a FETCH clause
19124    pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
19125        let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
19126
19127        let (quantity, percent) = if self
19128            .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
19129            .is_some()
19130        {
19131            (None, false)
19132        } else {
19133            let quantity = Expr::Value(self.parse_value()?);
19134            let percent = self.parse_keyword(Keyword::PERCENT);
19135            let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
19136            (Some(quantity), percent)
19137        };
19138
19139        let with_ties = if self.parse_keyword(Keyword::ONLY) {
19140            false
19141        } else {
19142            self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
19143        };
19144
19145        Ok(Fetch {
19146            with_ties,
19147            percent,
19148            quantity,
19149        })
19150    }
19151
19152    /// Parse a FOR UPDATE/FOR SHARE clause
19153    pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
19154        let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
19155            Keyword::UPDATE => LockType::Update,
19156            Keyword::SHARE => LockType::Share,
19157            unexpected_keyword => return Err(ParserError::ParserError(
19158                format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
19159            )),
19160        };
19161        let of = if self.parse_keyword(Keyword::OF) {
19162            Some(self.parse_object_name(false)?)
19163        } else {
19164            None
19165        };
19166        let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19167            Some(NonBlock::Nowait)
19168        } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19169            Some(NonBlock::SkipLocked)
19170        } else {
19171            None
19172        };
19173        Ok(LockClause {
19174            lock_type,
19175            of,
19176            nonblock,
19177        })
19178    }
19179
19180    /// Parse a PostgreSQL `LOCK` statement.
19181    pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19182        self.expect_keyword(Keyword::LOCK)?;
19183
19184        if self.peek_keyword(Keyword::TABLES) {
19185            return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19186        }
19187
19188        let _ = self.parse_keyword(Keyword::TABLE);
19189        let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19190        let lock_mode = if self.parse_keyword(Keyword::IN) {
19191            let lock_mode = self.parse_lock_table_mode()?;
19192            self.expect_keyword(Keyword::MODE)?;
19193            Some(lock_mode)
19194        } else {
19195            None
19196        };
19197        let nowait = self.parse_keyword(Keyword::NOWAIT);
19198
19199        Ok(Lock {
19200            tables,
19201            lock_mode,
19202            nowait,
19203        })
19204    }
19205
19206    fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19207        let only = self.parse_keyword(Keyword::ONLY);
19208        let name = self.parse_object_name(false)?;
19209        let has_asterisk = self.consume_token(&Token::Mul);
19210
19211        Ok(LockTableTarget {
19212            name,
19213            only,
19214            has_asterisk,
19215        })
19216    }
19217
19218    fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19219        if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19220            Ok(LockTableMode::AccessShare)
19221        } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19222            Ok(LockTableMode::AccessExclusive)
19223        } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19224            Ok(LockTableMode::RowShare)
19225        } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19226            Ok(LockTableMode::RowExclusive)
19227        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19228            Ok(LockTableMode::ShareUpdateExclusive)
19229        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19230            Ok(LockTableMode::ShareRowExclusive)
19231        } else if self.parse_keyword(Keyword::SHARE) {
19232            Ok(LockTableMode::Share)
19233        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19234            Ok(LockTableMode::Exclusive)
19235        } else {
19236            self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19237        }
19238    }
19239
19240    /// Parse a VALUES clause
19241    pub fn parse_values(
19242        &mut self,
19243        allow_empty: bool,
19244        value_keyword: bool,
19245    ) -> Result<Values, ParserError> {
19246        let mut explicit_row = false;
19247
19248        let rows = self.parse_comma_separated(|parser| {
19249            if parser.parse_keyword(Keyword::ROW) {
19250                explicit_row = true;
19251            }
19252            Ok(Parens {
19253                opening_token: parser.expect_token(&Token::LParen)?.into(),
19254                content: if allow_empty && parser.peek_token_ref().token == Token::RParen {
19255                    vec![]
19256                } else {
19257                    parser.parse_comma_separated(Parser::parse_expr)?
19258                },
19259                closing_token: parser.expect_token(&Token::RParen)?.into(),
19260            })
19261        })?;
19262        Ok(Values {
19263            explicit_row,
19264            rows,
19265            value_keyword,
19266        })
19267    }
19268
19269    /// Parse a 'START TRANSACTION' statement
19270    pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19271        self.expect_keyword_is(Keyword::TRANSACTION)?;
19272        Ok(Statement::StartTransaction {
19273            modes: self.parse_transaction_modes()?,
19274            begin: false,
19275            transaction: Some(BeginTransactionKind::Transaction),
19276            modifier: None,
19277            statements: vec![],
19278            exception: None,
19279            has_end_keyword: false,
19280        })
19281    }
19282
19283    /// Parse a transaction modifier keyword that can follow a `BEGIN` statement.
19284    pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19285        if !self.dialect.supports_start_transaction_modifier() {
19286            None
19287        } else if self.parse_keyword(Keyword::DEFERRED) {
19288            Some(TransactionModifier::Deferred)
19289        } else if self.parse_keyword(Keyword::IMMEDIATE) {
19290            Some(TransactionModifier::Immediate)
19291        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19292            Some(TransactionModifier::Exclusive)
19293        } else if self.parse_keyword(Keyword::TRY) {
19294            Some(TransactionModifier::Try)
19295        } else if self.parse_keyword(Keyword::CATCH) {
19296            Some(TransactionModifier::Catch)
19297        } else {
19298            None
19299        }
19300    }
19301
19302    /// Parse a 'BEGIN' statement
19303    pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19304        let modifier = self.parse_transaction_modifier();
19305        let transaction =
19306            match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19307            {
19308                Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19309                Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19310                Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19311                _ => None,
19312            };
19313        Ok(Statement::StartTransaction {
19314            modes: self.parse_transaction_modes()?,
19315            begin: true,
19316            transaction,
19317            modifier,
19318            statements: vec![],
19319            exception: None,
19320            has_end_keyword: false,
19321        })
19322    }
19323
19324    /// Parse a 'BEGIN ... EXCEPTION ... END' block
19325    pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19326        let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19327
19328        let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19329            let mut when = Vec::new();
19330
19331            // We can have multiple `WHEN` arms so we consume all cases until `END`
19332            while !self.peek_keyword(Keyword::END) {
19333                self.expect_keyword(Keyword::WHEN)?;
19334
19335                // Each `WHEN` case can have one or more conditions, e.g.
19336                // WHEN EXCEPTION_1 [OR EXCEPTION_2] THEN
19337                // So we parse identifiers until the `THEN` keyword.
19338                let mut idents = Vec::new();
19339
19340                while !self.parse_keyword(Keyword::THEN) {
19341                    let ident = self.parse_identifier()?;
19342                    idents.push(ident);
19343
19344                    self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19345                }
19346
19347                let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19348
19349                when.push(ExceptionWhen { idents, statements });
19350            }
19351
19352            Some(when)
19353        } else {
19354            None
19355        };
19356
19357        self.expect_keyword(Keyword::END)?;
19358
19359        Ok(Statement::StartTransaction {
19360            begin: true,
19361            statements,
19362            exception,
19363            has_end_keyword: true,
19364            transaction: None,
19365            modifier: None,
19366            modes: Default::default(),
19367        })
19368    }
19369
19370    /// Parse an 'END' statement
19371    pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19372        let modifier = if !self.dialect.supports_end_transaction_modifier() {
19373            None
19374        } else if self.parse_keyword(Keyword::TRY) {
19375            Some(TransactionModifier::Try)
19376        } else if self.parse_keyword(Keyword::CATCH) {
19377            Some(TransactionModifier::Catch)
19378        } else {
19379            None
19380        };
19381        Ok(Statement::Commit {
19382            chain: self.parse_commit_rollback_chain()?,
19383            end: true,
19384            modifier,
19385        })
19386    }
19387
19388    /// Parse a list of transaction modes
19389    pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19390        let mut modes = vec![];
19391        let mut required = false;
19392        loop {
19393            let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19394                let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19395                    TransactionIsolationLevel::ReadUncommitted
19396                } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19397                    TransactionIsolationLevel::ReadCommitted
19398                } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19399                    TransactionIsolationLevel::RepeatableRead
19400                } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19401                    TransactionIsolationLevel::Serializable
19402                } else if self.parse_keyword(Keyword::SNAPSHOT) {
19403                    TransactionIsolationLevel::Snapshot
19404                } else {
19405                    self.expected_ref("isolation level", self.peek_token_ref())?
19406                };
19407                TransactionMode::IsolationLevel(iso_level)
19408            } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19409                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19410            } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19411                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19412            } else if required {
19413                self.expected_ref("transaction mode", self.peek_token_ref())?
19414            } else {
19415                break;
19416            };
19417            modes.push(mode);
19418            // ANSI requires a comma after each transaction mode, but
19419            // PostgreSQL, for historical reasons, does not. We follow
19420            // PostgreSQL in making the comma optional, since that is strictly
19421            // more general.
19422            required = self.consume_token(&Token::Comma);
19423        }
19424        Ok(modes)
19425    }
19426
19427    /// Parse a 'COMMIT' statement
19428    pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19429        Ok(Statement::Commit {
19430            chain: self.parse_commit_rollback_chain()?,
19431            end: false,
19432            modifier: None,
19433        })
19434    }
19435
19436    /// Parse a 'ROLLBACK' statement
19437    pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19438        let chain = self.parse_commit_rollback_chain()?;
19439        let savepoint = self.parse_rollback_savepoint()?;
19440
19441        Ok(Statement::Rollback { chain, savepoint })
19442    }
19443
19444    /// Parse an optional `AND [NO] CHAIN` clause for `COMMIT` and `ROLLBACK` statements
19445    pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19446        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19447        if self.parse_keyword(Keyword::AND) {
19448            let chain = !self.parse_keyword(Keyword::NO);
19449            self.expect_keyword_is(Keyword::CHAIN)?;
19450            Ok(chain)
19451        } else {
19452            Ok(false)
19453        }
19454    }
19455
19456    /// Parse an optional 'TO SAVEPOINT savepoint_name' clause for ROLLBACK statements
19457    pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19458        if self.parse_keyword(Keyword::TO) {
19459            let _ = self.parse_keyword(Keyword::SAVEPOINT);
19460            let savepoint = self.parse_identifier()?;
19461
19462            Ok(Some(savepoint))
19463        } else {
19464            Ok(None)
19465        }
19466    }
19467
19468    /// Parse a 'RAISERROR' statement
19469    pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19470        self.expect_token(&Token::LParen)?;
19471        let message = Box::new(self.parse_expr()?);
19472        self.expect_token(&Token::Comma)?;
19473        let severity = Box::new(self.parse_expr()?);
19474        self.expect_token(&Token::Comma)?;
19475        let state = Box::new(self.parse_expr()?);
19476        let arguments = if self.consume_token(&Token::Comma) {
19477            self.parse_comma_separated(Parser::parse_expr)?
19478        } else {
19479            vec![]
19480        };
19481        self.expect_token(&Token::RParen)?;
19482        let options = if self.parse_keyword(Keyword::WITH) {
19483            self.parse_comma_separated(Parser::parse_raiserror_option)?
19484        } else {
19485            vec![]
19486        };
19487        Ok(Statement::RaisError {
19488            message,
19489            severity,
19490            state,
19491            arguments,
19492            options,
19493        })
19494    }
19495
19496    /// Parse a single `RAISERROR` option
19497    pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
19498        match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
19499            Keyword::LOG => Ok(RaisErrorOption::Log),
19500            Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
19501            Keyword::SETERROR => Ok(RaisErrorOption::SetError),
19502            _ => self.expected_ref(
19503                "LOG, NOWAIT OR SETERROR raiserror option",
19504                self.peek_token_ref(),
19505            ),
19506        }
19507    }
19508
19509    /// Parse a MSSQL `THROW` statement.
19510    ///
19511    /// See [Statement::Throw]
19512    pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
19513        self.expect_keyword_is(Keyword::THROW)?;
19514
19515        let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
19516        let (message, state) = if error_number.is_some() {
19517            self.expect_token(&Token::Comma)?;
19518            let message = Box::new(self.parse_expr()?);
19519            self.expect_token(&Token::Comma)?;
19520            let state = Box::new(self.parse_expr()?);
19521            (Some(message), Some(state))
19522        } else {
19523            (None, None)
19524        };
19525
19526        Ok(ThrowStatement {
19527            error_number,
19528            message,
19529            state,
19530        })
19531    }
19532
19533    /// Parse a SQL `DEALLOCATE` statement
19534    pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
19535        let prepare = self.parse_keyword(Keyword::PREPARE);
19536        let name = self.parse_identifier()?;
19537        Ok(Statement::Deallocate { name, prepare })
19538    }
19539
19540    /// Parse a SQL `EXECUTE` statement
19541    pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
19542        let immediate =
19543            self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
19544
19545        // When `EXEC` is immediately followed by `(`, the content is a dynamic-SQL
19546        // expression — e.g. `EXEC (@sql)`, `EXEC ('SELECT ...')`, or
19547        // `EXEC ('SELECT ... FROM ' + @tbl + ' WHERE ...')`.
19548        // Skip name parsing; the expression ends up in `parameters` via the
19549        // `has_parentheses` path below, consistent with `EXECUTE IMMEDIATE <expr>`.
19550        let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
19551            None
19552        } else {
19553            Some(self.parse_object_name(false)?)
19554        };
19555
19556        let has_parentheses = self.consume_token(&Token::LParen);
19557
19558        let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
19559        let end_token = match (has_parentheses, self.peek_token().token) {
19560            (true, _) => Token::RParen,
19561            (false, Token::EOF) => Token::EOF,
19562            (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
19563            (false, _) => Token::SemiColon,
19564        };
19565
19566        let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
19567
19568        if has_parentheses {
19569            self.expect_token(&Token::RParen)?;
19570        }
19571
19572        let into = if self.parse_keyword(Keyword::INTO) {
19573            self.parse_comma_separated(Self::parse_identifier)?
19574        } else {
19575            vec![]
19576        };
19577
19578        let using = if self.parse_keyword(Keyword::USING) {
19579            self.parse_comma_separated(Self::parse_expr_with_alias)?
19580        } else {
19581            vec![]
19582        };
19583
19584        let output = self.parse_keyword(Keyword::OUTPUT);
19585
19586        let default = self.parse_keyword(Keyword::DEFAULT);
19587
19588        Ok(Statement::Execute {
19589            immediate,
19590            name,
19591            parameters,
19592            has_parentheses,
19593            into,
19594            using,
19595            output,
19596            default,
19597        })
19598    }
19599
19600    /// Parse a SQL `PREPARE` statement
19601    pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
19602        let name = self.parse_identifier()?;
19603
19604        let mut data_types = vec![];
19605        if self.consume_token(&Token::LParen) {
19606            data_types = self.parse_comma_separated(Parser::parse_data_type)?;
19607            self.expect_token(&Token::RParen)?;
19608        }
19609
19610        self.expect_keyword_is(Keyword::AS)?;
19611        let statement = Box::new(self.parse_statement()?);
19612        Ok(Statement::Prepare {
19613            name,
19614            data_types,
19615            statement,
19616        })
19617    }
19618
19619    /// Parse a SQL `UNLOAD` statement
19620    pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
19621        self.expect_keyword(Keyword::UNLOAD)?;
19622        self.expect_token(&Token::LParen)?;
19623        let (query, query_text) =
19624            if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
19625                (None, Some(self.parse_literal_string()?))
19626            } else {
19627                (Some(self.parse_query()?), None)
19628            };
19629        self.expect_token(&Token::RParen)?;
19630
19631        self.expect_keyword_is(Keyword::TO)?;
19632        let to = self.parse_identifier()?;
19633        let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
19634            Some(self.parse_iam_role_kind()?)
19635        } else {
19636            None
19637        };
19638        let with = self.parse_options(Keyword::WITH)?;
19639        let mut options = vec![];
19640        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
19641            options.push(opt);
19642        }
19643        Ok(Statement::Unload {
19644            query,
19645            query_text,
19646            to,
19647            auth,
19648            with,
19649            options,
19650        })
19651    }
19652
19653    fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
19654        let temporary = self
19655            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
19656            .is_some();
19657        let unlogged = self.parse_keyword(Keyword::UNLOGGED);
19658        let table = self.parse_keyword(Keyword::TABLE);
19659        let name = self.parse_object_name(false)?;
19660
19661        Ok(SelectInto {
19662            temporary,
19663            unlogged,
19664            table,
19665            name,
19666        })
19667    }
19668
19669    fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
19670        let v = self.parse_value()?;
19671        match &v.value {
19672            Value::SingleQuotedString(_) => Ok(v),
19673            Value::DoubleQuotedString(_) => Ok(v),
19674            Value::Number(_, _) => Ok(v),
19675            Value::Placeholder(_) => Ok(v),
19676            _ => {
19677                self.prev_token();
19678                self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
19679            }
19680        }
19681    }
19682
19683    /// PRAGMA [schema-name '.'] pragma-name [('=' pragma-value) | '(' pragma-value ')']
19684    pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
19685        let name = self.parse_object_name(false)?;
19686        if self.consume_token(&Token::LParen) {
19687            let value = self.parse_pragma_value()?;
19688            self.expect_token(&Token::RParen)?;
19689            Ok(Statement::Pragma {
19690                name,
19691                value: Some(value),
19692                is_eq: false,
19693            })
19694        } else if self.consume_token(&Token::Eq) {
19695            Ok(Statement::Pragma {
19696                name,
19697                value: Some(self.parse_pragma_value()?),
19698                is_eq: true,
19699            })
19700        } else {
19701            Ok(Statement::Pragma {
19702                name,
19703                value: None,
19704                is_eq: false,
19705            })
19706        }
19707    }
19708
19709    /// `INSTALL [extension_name]`
19710    pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
19711        let extension_name = self.parse_identifier()?;
19712
19713        Ok(Statement::Install { extension_name })
19714    }
19715
19716    /// Parse a SQL LOAD statement
19717    pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
19718        if self.dialect.supports_load_extension() {
19719            let extension_name = self.parse_identifier()?;
19720            Ok(Statement::Load { extension_name })
19721        } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
19722            let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
19723            self.expect_keyword_is(Keyword::INPATH)?;
19724            let inpath = self.parse_literal_string()?;
19725            let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
19726            self.expect_keyword_is(Keyword::INTO)?;
19727            self.expect_keyword_is(Keyword::TABLE)?;
19728            let table_name = self.parse_object_name(false)?;
19729            let partitioned = self.parse_insert_partition()?;
19730            let table_format = self.parse_load_data_table_format()?;
19731            Ok(Statement::LoadData {
19732                local,
19733                inpath,
19734                overwrite,
19735                table_name,
19736                partitioned,
19737                table_format,
19738            })
19739        } else {
19740            self.expected_ref(
19741                "`DATA` or an extension name after `LOAD`",
19742                self.peek_token_ref(),
19743            )
19744        }
19745    }
19746
19747    /// ClickHouse:
19748    /// ```sql
19749    /// OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]]
19750    /// ```
19751    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/optimize)
19752    ///
19753    /// Databricks:
19754    /// ```sql
19755    /// OPTIMIZE table_name [WHERE predicate] [ZORDER BY (col_name1 [, ...])]
19756    /// ```
19757    /// [Databricks](https://docs.databricks.com/en/sql/language-manual/delta-optimize.html)
19758    pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
19759        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
19760
19761        let name = self.parse_object_name(false)?;
19762
19763        // ClickHouse-specific options
19764        let on_cluster = self.parse_optional_on_cluster()?;
19765
19766        let partition = if self.parse_keyword(Keyword::PARTITION) {
19767            if self.parse_keyword(Keyword::ID) {
19768                Some(Partition::Identifier(self.parse_identifier()?))
19769            } else {
19770                Some(Partition::Expr(self.parse_expr()?))
19771            }
19772        } else {
19773            None
19774        };
19775
19776        let include_final = self.parse_keyword(Keyword::FINAL);
19777
19778        let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
19779            if self.parse_keyword(Keyword::BY) {
19780                Some(Deduplicate::ByExpression(self.parse_expr()?))
19781            } else {
19782                Some(Deduplicate::All)
19783            }
19784        } else {
19785            None
19786        };
19787
19788        // Databricks-specific options
19789        let predicate = if self.parse_keyword(Keyword::WHERE) {
19790            Some(self.parse_expr()?)
19791        } else {
19792            None
19793        };
19794
19795        let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
19796            self.expect_token(&Token::LParen)?;
19797            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
19798            self.expect_token(&Token::RParen)?;
19799            Some(columns)
19800        } else {
19801            None
19802        };
19803
19804        Ok(Statement::OptimizeTable {
19805            name,
19806            has_table_keyword,
19807            on_cluster,
19808            partition,
19809            include_final,
19810            deduplicate,
19811            predicate,
19812            zorder,
19813        })
19814    }
19815
19816    /// ```sql
19817    /// CREATE [ { TEMPORARY | TEMP } ] SEQUENCE [ IF NOT EXISTS ] <sequence_name>
19818    /// ```
19819    ///
19820    /// See [Postgres docs](https://www.postgresql.org/docs/current/sql-createsequence.html) for more details.
19821    pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
19822        //[ IF NOT EXISTS ]
19823        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19824        //name
19825        let name = self.parse_object_name(false)?;
19826        //[ AS data_type ]
19827        let mut data_type: Option<DataType> = None;
19828        if self.parse_keywords(&[Keyword::AS]) {
19829            data_type = Some(self.parse_data_type()?)
19830        }
19831        let sequence_options = self.parse_create_sequence_options()?;
19832        // [ OWNED BY { table_name.column_name | NONE } ]
19833        let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
19834            if self.parse_keywords(&[Keyword::NONE]) {
19835                Some(ObjectName::from(vec![Ident::new("NONE")]))
19836            } else {
19837                Some(self.parse_object_name(false)?)
19838            }
19839        } else {
19840            None
19841        };
19842        Ok(Statement::CreateSequence {
19843            temporary,
19844            if_not_exists,
19845            name,
19846            data_type,
19847            sequence_options,
19848            owned_by,
19849        })
19850    }
19851
19852    fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
19853        let mut sequence_options = vec![];
19854        // PostgreSQL allows these clauses in any order (e.g. pg_dump emits
19855        // `START` before `INCREMENT`), so loop until no clause matches.
19856        // https://www.postgresql.org/docs/current/sql-createsequence.html
19857        loop {
19858            //[ INCREMENT [ BY ] increment ]
19859            if self.parse_keywords(&[Keyword::INCREMENT]) {
19860                if self.parse_keywords(&[Keyword::BY]) {
19861                    sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
19862                } else {
19863                    sequence_options
19864                        .push(SequenceOptions::IncrementBy(self.parse_number()?, false));
19865                }
19866            }
19867            //[ MINVALUE minvalue | NO MINVALUE ]
19868            else if self.parse_keyword(Keyword::MINVALUE) {
19869                sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
19870            } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
19871                sequence_options.push(SequenceOptions::MinValue(None));
19872            }
19873            //[ MAXVALUE maxvalue | NO MAXVALUE ]
19874            else if self.parse_keywords(&[Keyword::MAXVALUE]) {
19875                sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
19876            } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
19877                sequence_options.push(SequenceOptions::MaxValue(None));
19878            }
19879            //[ START [ WITH ] start ]
19880            else if self.parse_keywords(&[Keyword::START]) {
19881                if self.parse_keywords(&[Keyword::WITH]) {
19882                    sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
19883                } else {
19884                    sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
19885                }
19886            }
19887            //[ CACHE cache ]
19888            else if self.parse_keywords(&[Keyword::CACHE]) {
19889                sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
19890            }
19891            // [ [ NO ] CYCLE ]
19892            else if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
19893                sequence_options.push(SequenceOptions::Cycle(true));
19894            } else if self.parse_keywords(&[Keyword::CYCLE]) {
19895                sequence_options.push(SequenceOptions::Cycle(false));
19896            } else {
19897                break;
19898            }
19899        }
19900
19901        Ok(sequence_options)
19902    }
19903
19904    ///   Parse a `CREATE SERVER` statement.
19905    ///
19906    ///  See [Statement::CreateServer]
19907    pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
19908        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19909        let name = self.parse_object_name(false)?;
19910
19911        let server_type = if self.parse_keyword(Keyword::TYPE) {
19912            Some(self.parse_identifier()?)
19913        } else {
19914            None
19915        };
19916
19917        let version = if self.parse_keyword(Keyword::VERSION) {
19918            Some(self.parse_identifier()?)
19919        } else {
19920            None
19921        };
19922
19923        self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
19924        let foreign_data_wrapper = self.parse_object_name(false)?;
19925
19926        let mut options = None;
19927        if self.parse_keyword(Keyword::OPTIONS) {
19928            self.expect_token(&Token::LParen)?;
19929            options = Some(self.parse_comma_separated(|p| {
19930                let key = p.parse_identifier()?;
19931                let value = p.parse_identifier()?;
19932                Ok(CreateServerOption { key, value })
19933            })?);
19934            self.expect_token(&Token::RParen)?;
19935        }
19936
19937        Ok(Statement::CreateServer(CreateServerStatement {
19938            name,
19939            if_not_exists: ine,
19940            server_type,
19941            version,
19942            foreign_data_wrapper,
19943            options,
19944        }))
19945    }
19946
19947    /// The index of the first unprocessed token.
19948    pub fn index(&self) -> usize {
19949        self.index
19950    }
19951
19952    /// Parse a named window definition.
19953    pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
19954        let ident = self.parse_identifier()?;
19955        self.expect_keyword_is(Keyword::AS)?;
19956
19957        let window_expr = if self.consume_token(&Token::LParen) {
19958            NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
19959        } else if self.dialect.supports_window_clause_named_window_reference() {
19960            NamedWindowExpr::NamedWindow(self.parse_identifier()?)
19961        } else {
19962            return self.expected_ref("(", self.peek_token_ref());
19963        };
19964
19965        Ok(NamedWindowDefinition(ident, window_expr))
19966    }
19967
19968    /// Parse `CREATE PROCEDURE` statement.
19969    pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
19970        let name = self.parse_object_name(false)?;
19971        let params = self.parse_optional_procedure_parameters()?;
19972
19973        let language = if self.parse_keyword(Keyword::LANGUAGE) {
19974            Some(self.parse_identifier()?)
19975        } else {
19976            None
19977        };
19978
19979        self.expect_keyword_is(Keyword::AS)?;
19980
19981        let body = self.parse_conditional_statements(&[Keyword::END])?;
19982
19983        Ok(Statement::CreateProcedure {
19984            name,
19985            or_alter,
19986            params,
19987            language,
19988            body,
19989        })
19990    }
19991
19992    /// Parse a window specification.
19993    pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
19994        let window_name = match &self.peek_token_ref().token {
19995            Token::Word(word) if word.keyword == Keyword::NoKeyword => {
19996                self.parse_optional_ident()?
19997            }
19998            _ => None,
19999        };
20000
20001        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
20002            self.parse_comma_separated(Parser::parse_expr)?
20003        } else {
20004            vec![]
20005        };
20006        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
20007            self.parse_comma_separated(Parser::parse_order_by_expr)?
20008        } else {
20009            vec![]
20010        };
20011
20012        let window_frame = if !self.consume_token(&Token::RParen) {
20013            let window_frame = self.parse_window_frame()?;
20014            self.expect_token(&Token::RParen)?;
20015            Some(window_frame)
20016        } else {
20017            None
20018        };
20019        Ok(WindowSpec {
20020            window_name,
20021            partition_by,
20022            order_by,
20023            window_frame,
20024        })
20025    }
20026
20027    /// Parse `CREATE TYPE` statement.
20028    pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
20029        let name = self.parse_object_name(false)?;
20030
20031        // Check if we have AS keyword
20032        let has_as = self.parse_keyword(Keyword::AS);
20033
20034        if !has_as {
20035            // Two cases: CREATE TYPE name; or CREATE TYPE name (options);
20036            if self.consume_token(&Token::LParen) {
20037                // CREATE TYPE name (options) - SQL definition without AS
20038                let options = self.parse_create_type_sql_definition_options()?;
20039                self.expect_token(&Token::RParen)?;
20040                return Ok(Statement::CreateType {
20041                    name,
20042                    representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
20043                });
20044            }
20045
20046            // CREATE TYPE name; - no representation
20047            return Ok(Statement::CreateType {
20048                name,
20049                representation: None,
20050            });
20051        }
20052
20053        // We have AS keyword
20054        if self.parse_keyword(Keyword::ENUM) {
20055            // CREATE TYPE name AS ENUM (labels)
20056            self.parse_create_type_enum(name)
20057        } else if self.parse_keyword(Keyword::RANGE) {
20058            // CREATE TYPE name AS RANGE (options)
20059            self.parse_create_type_range(name)
20060        } else if self.consume_token(&Token::LParen) {
20061            // CREATE TYPE name AS (attributes) - Composite
20062            self.parse_create_type_composite(name)
20063        } else {
20064            self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
20065        }
20066    }
20067
20068    /// Parse remainder of `CREATE TYPE AS (attributes)` statement (composite type)
20069    ///
20070    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
20071    fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20072        if self.consume_token(&Token::RParen) {
20073            // Empty composite type
20074            return Ok(Statement::CreateType {
20075                name,
20076                representation: Some(UserDefinedTypeRepresentation::Composite {
20077                    attributes: vec![],
20078                }),
20079            });
20080        }
20081
20082        let mut attributes = vec![];
20083        loop {
20084            let attr_name = self.parse_identifier()?;
20085            let attr_data_type = self.parse_data_type()?;
20086            let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
20087                Some(self.parse_object_name(false)?)
20088            } else {
20089                None
20090            };
20091            attributes.push(UserDefinedTypeCompositeAttributeDef {
20092                name: attr_name,
20093                data_type: attr_data_type,
20094                collation: attr_collation,
20095            });
20096
20097            if !self.consume_token(&Token::Comma) {
20098                break;
20099            }
20100        }
20101        self.expect_token(&Token::RParen)?;
20102
20103        Ok(Statement::CreateType {
20104            name,
20105            representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
20106        })
20107    }
20108
20109    /// Parse remainder of `CREATE TYPE AS ENUM` statement (see [Statement::CreateType] and [Self::parse_create_type])
20110    ///
20111    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
20112    pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20113        self.expect_token(&Token::LParen)?;
20114        let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20115        self.expect_token(&Token::RParen)?;
20116
20117        Ok(Statement::CreateType {
20118            name,
20119            representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
20120        })
20121    }
20122
20123    /// Parse remainder of `CREATE TYPE AS RANGE` statement
20124    ///
20125    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
20126    fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20127        self.expect_token(&Token::LParen)?;
20128        let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
20129        self.expect_token(&Token::RParen)?;
20130
20131        Ok(Statement::CreateType {
20132            name,
20133            representation: Some(UserDefinedTypeRepresentation::Range { options }),
20134        })
20135    }
20136
20137    /// Parse a single range option for a `CREATE TYPE AS RANGE` statement
20138    fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
20139        let keyword = self.parse_one_of_keywords(&[
20140            Keyword::SUBTYPE,
20141            Keyword::SUBTYPE_OPCLASS,
20142            Keyword::COLLATION,
20143            Keyword::CANONICAL,
20144            Keyword::SUBTYPE_DIFF,
20145            Keyword::MULTIRANGE_TYPE_NAME,
20146        ]);
20147
20148        match keyword {
20149            Some(Keyword::SUBTYPE) => {
20150                self.expect_token(&Token::Eq)?;
20151                let data_type = self.parse_data_type()?;
20152                Ok(UserDefinedTypeRangeOption::Subtype(data_type))
20153            }
20154            Some(Keyword::SUBTYPE_OPCLASS) => {
20155                self.expect_token(&Token::Eq)?;
20156                let name = self.parse_object_name(false)?;
20157                Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
20158            }
20159            Some(Keyword::COLLATION) => {
20160                self.expect_token(&Token::Eq)?;
20161                let name = self.parse_object_name(false)?;
20162                Ok(UserDefinedTypeRangeOption::Collation(name))
20163            }
20164            Some(Keyword::CANONICAL) => {
20165                self.expect_token(&Token::Eq)?;
20166                let name = self.parse_object_name(false)?;
20167                Ok(UserDefinedTypeRangeOption::Canonical(name))
20168            }
20169            Some(Keyword::SUBTYPE_DIFF) => {
20170                self.expect_token(&Token::Eq)?;
20171                let name = self.parse_object_name(false)?;
20172                Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
20173            }
20174            Some(Keyword::MULTIRANGE_TYPE_NAME) => {
20175                self.expect_token(&Token::Eq)?;
20176                let name = self.parse_object_name(false)?;
20177                Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
20178            }
20179            _ => self.expected_ref("range option keyword", self.peek_token_ref()),
20180        }
20181    }
20182
20183    /// Parse SQL definition options for CREATE TYPE (options)
20184    fn parse_create_type_sql_definition_options(
20185        &mut self,
20186    ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
20187        self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
20188    }
20189
20190    /// Parse a single SQL definition option for CREATE TYPE (options)
20191    fn parse_sql_definition_option(
20192        &mut self,
20193    ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
20194        let keyword = self.parse_one_of_keywords(&[
20195            Keyword::INPUT,
20196            Keyword::OUTPUT,
20197            Keyword::RECEIVE,
20198            Keyword::SEND,
20199            Keyword::TYPMOD_IN,
20200            Keyword::TYPMOD_OUT,
20201            Keyword::ANALYZE,
20202            Keyword::SUBSCRIPT,
20203            Keyword::INTERNALLENGTH,
20204            Keyword::PASSEDBYVALUE,
20205            Keyword::ALIGNMENT,
20206            Keyword::STORAGE,
20207            Keyword::LIKE,
20208            Keyword::CATEGORY,
20209            Keyword::PREFERRED,
20210            Keyword::DEFAULT,
20211            Keyword::ELEMENT,
20212            Keyword::DELIMITER,
20213            Keyword::COLLATABLE,
20214        ]);
20215
20216        match keyword {
20217            Some(Keyword::INPUT) => {
20218                self.expect_token(&Token::Eq)?;
20219                let name = self.parse_object_name(false)?;
20220                Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
20221            }
20222            Some(Keyword::OUTPUT) => {
20223                self.expect_token(&Token::Eq)?;
20224                let name = self.parse_object_name(false)?;
20225                Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
20226            }
20227            Some(Keyword::RECEIVE) => {
20228                self.expect_token(&Token::Eq)?;
20229                let name = self.parse_object_name(false)?;
20230                Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
20231            }
20232            Some(Keyword::SEND) => {
20233                self.expect_token(&Token::Eq)?;
20234                let name = self.parse_object_name(false)?;
20235                Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
20236            }
20237            Some(Keyword::TYPMOD_IN) => {
20238                self.expect_token(&Token::Eq)?;
20239                let name = self.parse_object_name(false)?;
20240                Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
20241            }
20242            Some(Keyword::TYPMOD_OUT) => {
20243                self.expect_token(&Token::Eq)?;
20244                let name = self.parse_object_name(false)?;
20245                Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
20246            }
20247            Some(Keyword::ANALYZE) => {
20248                self.expect_token(&Token::Eq)?;
20249                let name = self.parse_object_name(false)?;
20250                Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
20251            }
20252            Some(Keyword::SUBSCRIPT) => {
20253                self.expect_token(&Token::Eq)?;
20254                let name = self.parse_object_name(false)?;
20255                Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
20256            }
20257            Some(Keyword::INTERNALLENGTH) => {
20258                self.expect_token(&Token::Eq)?;
20259                if self.parse_keyword(Keyword::VARIABLE) {
20260                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20261                        UserDefinedTypeInternalLength::Variable,
20262                    ))
20263                } else {
20264                    let value = self.parse_literal_uint()?;
20265                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20266                        UserDefinedTypeInternalLength::Fixed(value),
20267                    ))
20268                }
20269            }
20270            Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
20271            Some(Keyword::ALIGNMENT) => {
20272                self.expect_token(&Token::Eq)?;
20273                let align_keyword = self.parse_one_of_keywords(&[
20274                    Keyword::CHAR,
20275                    Keyword::INT2,
20276                    Keyword::INT4,
20277                    Keyword::DOUBLE,
20278                ]);
20279                match align_keyword {
20280                    Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20281                        Alignment::Char,
20282                    )),
20283                    Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20284                        Alignment::Int2,
20285                    )),
20286                    Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20287                        Alignment::Int4,
20288                    )),
20289                    Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20290                        Alignment::Double,
20291                    )),
20292                    _ => self.expected_ref(
20293                        "alignment value (char, int2, int4, or double)",
20294                        self.peek_token_ref(),
20295                    ),
20296                }
20297            }
20298            Some(Keyword::STORAGE) => {
20299                self.expect_token(&Token::Eq)?;
20300                let storage_keyword = self.parse_one_of_keywords(&[
20301                    Keyword::PLAIN,
20302                    Keyword::EXTERNAL,
20303                    Keyword::EXTENDED,
20304                    Keyword::MAIN,
20305                ]);
20306                match storage_keyword {
20307                    Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20308                        UserDefinedTypeStorage::Plain,
20309                    )),
20310                    Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20311                        UserDefinedTypeStorage::External,
20312                    )),
20313                    Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20314                        UserDefinedTypeStorage::Extended,
20315                    )),
20316                    Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20317                        UserDefinedTypeStorage::Main,
20318                    )),
20319                    _ => self.expected_ref(
20320                        "storage value (plain, external, extended, or main)",
20321                        self.peek_token_ref(),
20322                    ),
20323                }
20324            }
20325            Some(Keyword::LIKE) => {
20326                self.expect_token(&Token::Eq)?;
20327                let name = self.parse_object_name(false)?;
20328                Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
20329            }
20330            Some(Keyword::CATEGORY) => {
20331                self.expect_token(&Token::Eq)?;
20332                let category_str = self.parse_literal_string()?;
20333                let category_char = category_str.chars().next().ok_or_else(|| {
20334                    ParserError::ParserError(
20335                        "CATEGORY value must be a single character".to_string(),
20336                    )
20337                })?;
20338                Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
20339            }
20340            Some(Keyword::PREFERRED) => {
20341                self.expect_token(&Token::Eq)?;
20342                let value =
20343                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20344                Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
20345            }
20346            Some(Keyword::DEFAULT) => {
20347                self.expect_token(&Token::Eq)?;
20348                let expr = self.parse_expr()?;
20349                Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
20350            }
20351            Some(Keyword::ELEMENT) => {
20352                self.expect_token(&Token::Eq)?;
20353                let data_type = self.parse_data_type()?;
20354                Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
20355            }
20356            Some(Keyword::DELIMITER) => {
20357                self.expect_token(&Token::Eq)?;
20358                let delimiter = self.parse_literal_string()?;
20359                Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
20360            }
20361            Some(Keyword::COLLATABLE) => {
20362                self.expect_token(&Token::Eq)?;
20363                let value =
20364                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20365                Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
20366            }
20367            _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
20368        }
20369    }
20370
20371    fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
20372        self.expect_token(&Token::LParen)?;
20373        let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20374        self.expect_token(&Token::RParen)?;
20375        Ok(idents)
20376    }
20377
20378    fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
20379        if dialect_of!(self is MySqlDialect | GenericDialect) {
20380            if self.parse_keyword(Keyword::FIRST) {
20381                Ok(Some(MySQLColumnPosition::First))
20382            } else if self.parse_keyword(Keyword::AFTER) {
20383                let ident = self.parse_identifier()?;
20384                Ok(Some(MySQLColumnPosition::After(ident)))
20385            } else {
20386                Ok(None)
20387            }
20388        } else {
20389            Ok(None)
20390        }
20391    }
20392
20393    /// Parse [Statement::Print]
20394    fn parse_print(&mut self) -> Result<Statement, ParserError> {
20395        Ok(Statement::Print(PrintStatement {
20396            message: Box::new(self.parse_expr()?),
20397        }))
20398    }
20399
20400    /// Parse [Statement::WaitFor]
20401    ///
20402    /// See: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/waitfor-transact-sql>
20403    fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
20404        let wait_type = if self.parse_keyword(Keyword::DELAY) {
20405            WaitForType::Delay
20406        } else if self.parse_keyword(Keyword::TIME) {
20407            WaitForType::Time
20408        } else {
20409            return self.expected_ref("DELAY or TIME", self.peek_token_ref());
20410        };
20411        let expr = self.parse_expr()?;
20412        Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
20413    }
20414
20415    /// Parse [Statement::Return]
20416    fn parse_return(&mut self) -> Result<Statement, ParserError> {
20417        match self.maybe_parse(|p| p.parse_expr())? {
20418            Some(expr) => Ok(Statement::Return(ReturnStatement {
20419                value: Some(ReturnStatementValue::Expr(expr)),
20420            })),
20421            None => Ok(Statement::Return(ReturnStatement { value: None })),
20422        }
20423    }
20424
20425    /// /// Parse a `EXPORT DATA` statement.
20426    ///
20427    /// See [Statement::ExportData]
20428    fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
20429        self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
20430
20431        let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
20432            Some(self.parse_object_name(false)?)
20433        } else {
20434            None
20435        };
20436        self.expect_keyword(Keyword::OPTIONS)?;
20437        self.expect_token(&Token::LParen)?;
20438        let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
20439        self.expect_token(&Token::RParen)?;
20440        self.expect_keyword(Keyword::AS)?;
20441        let query = self.parse_query()?;
20442        Ok(Statement::ExportData(ExportData {
20443            options,
20444            query,
20445            connection,
20446        }))
20447    }
20448
20449    fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
20450        self.expect_keyword(Keyword::VACUUM)?;
20451        let full = self.parse_keyword(Keyword::FULL);
20452        let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
20453        let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
20454        let reindex = self.parse_keyword(Keyword::REINDEX);
20455        let recluster = self.parse_keyword(Keyword::RECLUSTER);
20456        let (table_name, threshold, boost) =
20457            match self.maybe_parse(|p| p.parse_object_name(false))? {
20458                Some(table_name) => {
20459                    let threshold = if self.parse_keyword(Keyword::TO) {
20460                        let value = self.parse_value()?;
20461                        self.expect_keyword(Keyword::PERCENT)?;
20462                        Some(value)
20463                    } else {
20464                        None
20465                    };
20466                    let boost = self.parse_keyword(Keyword::BOOST);
20467                    (Some(table_name), threshold, boost)
20468                }
20469                _ => (None, None, false),
20470            };
20471        Ok(Statement::Vacuum(VacuumStatement {
20472            full,
20473            sort_only,
20474            delete_only,
20475            reindex,
20476            recluster,
20477            table_name,
20478            threshold,
20479            boost,
20480        }))
20481    }
20482
20483    /// Consume the parser and return its underlying token buffer
20484    pub fn into_tokens(self) -> Vec<TokenWithSpan> {
20485        self.tokens
20486    }
20487
20488    /// Returns true if the next keyword indicates a sub query, i.e. SELECT or WITH
20489    fn peek_sub_query(&mut self) -> bool {
20490        self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
20491            .is_some()
20492    }
20493
20494    pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
20495        let show_in;
20496        let mut filter_position = None;
20497        if self.dialect.supports_show_like_before_in() {
20498            if let Some(filter) = self.parse_show_statement_filter()? {
20499                filter_position = Some(ShowStatementFilterPosition::Infix(filter));
20500            }
20501            show_in = self.maybe_parse_show_stmt_in()?;
20502        } else {
20503            show_in = self.maybe_parse_show_stmt_in()?;
20504            if let Some(filter) = self.parse_show_statement_filter()? {
20505                filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
20506            }
20507        }
20508        let starts_with = self.maybe_parse_show_stmt_starts_with()?;
20509        let limit = self.maybe_parse_show_stmt_limit()?;
20510        let from = self.maybe_parse_show_stmt_from()?;
20511        Ok(ShowStatementOptions {
20512            filter_position,
20513            show_in,
20514            starts_with,
20515            limit,
20516            limit_from: from,
20517        })
20518    }
20519
20520    fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
20521        let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
20522            Some(Keyword::FROM) => ShowStatementInClause::FROM,
20523            Some(Keyword::IN) => ShowStatementInClause::IN,
20524            None => return Ok(None),
20525            _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
20526        };
20527
20528        let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
20529            Keyword::ACCOUNT,
20530            Keyword::DATABASE,
20531            Keyword::SCHEMA,
20532            Keyword::TABLE,
20533            Keyword::VIEW,
20534        ]) {
20535            // If we see these next keywords it means we don't have a parent name
20536            Some(Keyword::DATABASE)
20537                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20538                    | self.peek_keyword(Keyword::LIMIT) =>
20539            {
20540                (Some(ShowStatementInParentType::Database), None)
20541            }
20542            Some(Keyword::SCHEMA)
20543                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20544                    | self.peek_keyword(Keyword::LIMIT) =>
20545            {
20546                (Some(ShowStatementInParentType::Schema), None)
20547            }
20548            Some(parent_kw) => {
20549                // The parent name here is still optional, for example:
20550                // SHOW TABLES IN ACCOUNT, so parsing the object name
20551                // may fail because the statement ends.
20552                let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
20553                match parent_kw {
20554                    Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
20555                    Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
20556                    Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
20557                    Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
20558                    Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
20559                    _ => {
20560                        return self.expected_ref(
20561                            "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
20562                            self.peek_token_ref(),
20563                        )
20564                    }
20565                }
20566            }
20567            None => {
20568                // Parsing MySQL style FROM tbl_name FROM db_name
20569                // which is equivalent to FROM tbl_name.db_name
20570                let mut parent_name = self.parse_object_name(false)?;
20571                if self
20572                    .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
20573                    .is_some()
20574                {
20575                    parent_name
20576                        .0
20577                        .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
20578                }
20579                (None, Some(parent_name))
20580            }
20581        };
20582
20583        Ok(Some(ShowStatementIn {
20584            clause,
20585            parent_type,
20586            parent_name,
20587        }))
20588    }
20589
20590    fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20591        if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
20592            Ok(Some(self.parse_value()?))
20593        } else {
20594            Ok(None)
20595        }
20596    }
20597
20598    fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
20599        if self.parse_keyword(Keyword::LIMIT) {
20600            Ok(self.parse_limit()?)
20601        } else {
20602            Ok(None)
20603        }
20604    }
20605
20606    fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20607        if self.parse_keyword(Keyword::FROM) {
20608            Ok(Some(self.parse_value()?))
20609        } else {
20610            Ok(None)
20611        }
20612    }
20613
20614    pub(crate) fn in_column_definition_state(&self) -> bool {
20615        matches!(self.state, ColumnDefinition)
20616    }
20617
20618    /// Parses options provided in key-value format.
20619    ///
20620    /// * `parenthesized` - true if the options are enclosed in parenthesis
20621    /// * `end_words` - a list of keywords that any of them indicates the end of the options section
20622    pub(crate) fn parse_key_value_options(
20623        &mut self,
20624        parenthesized: bool,
20625        end_words: &[Keyword],
20626    ) -> Result<KeyValueOptions, ParserError> {
20627        let mut options: Vec<KeyValueOption> = Vec::new();
20628        let mut delimiter = KeyValueOptionsDelimiter::Space;
20629        if parenthesized {
20630            self.expect_token(&Token::LParen)?;
20631        }
20632        loop {
20633            match self.next_token().token {
20634                Token::RParen => {
20635                    if parenthesized {
20636                        break;
20637                    } else {
20638                        return self.expected_ref(" another option or EOF", self.peek_token_ref());
20639                    }
20640                }
20641                Token::EOF | Token::SemiColon => break,
20642                Token::Comma => {
20643                    delimiter = KeyValueOptionsDelimiter::Comma;
20644                    continue;
20645                }
20646                Token::Word(w) if !end_words.contains(&w.keyword) => {
20647                    options.push(self.parse_key_value_option(&w)?)
20648                }
20649                Token::Word(w) if end_words.contains(&w.keyword) => {
20650                    self.prev_token();
20651                    break;
20652                }
20653                _ => {
20654                    return self.expected_ref(
20655                        "another option, EOF, SemiColon, Comma or ')'",
20656                        self.peek_token_ref(),
20657                    )
20658                }
20659            };
20660        }
20661
20662        Ok(KeyValueOptions { delimiter, options })
20663    }
20664
20665    /// Parses a `KEY = VALUE` construct based on the specified key
20666    pub(crate) fn parse_key_value_option(
20667        &mut self,
20668        key: &Word,
20669    ) -> Result<KeyValueOption, ParserError> {
20670        self.expect_token(&Token::Eq)?;
20671        let peeked_token = self.peek_token();
20672        match peeked_token.token {
20673            Token::SingleQuotedString(_) => Ok(KeyValueOption {
20674                option_name: key.value.clone(),
20675                option_value: KeyValueOptionKind::Single(self.parse_value()?),
20676            }),
20677            Token::Word(word)
20678                if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
20679            {
20680                Ok(KeyValueOption {
20681                    option_name: key.value.clone(),
20682                    option_value: KeyValueOptionKind::Single(self.parse_value()?),
20683                })
20684            }
20685            Token::Number(..) => Ok(KeyValueOption {
20686                option_name: key.value.clone(),
20687                option_value: KeyValueOptionKind::Single(self.parse_value()?),
20688            }),
20689            Token::Word(word) => {
20690                self.next_token();
20691                Ok(KeyValueOption {
20692                    option_name: key.value.clone(),
20693                    option_value: KeyValueOptionKind::Single(
20694                        Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
20695                    ),
20696                })
20697            }
20698            Token::LParen => {
20699                // Can be a list of values or a list of key value properties.
20700                // Try to parse a list of values and if that fails, try to parse
20701                // a list of key-value properties.
20702                match self.maybe_parse(|parser| {
20703                    parser.expect_token(&Token::LParen)?;
20704                    let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
20705                    parser.expect_token(&Token::RParen)?;
20706                    values
20707                })? {
20708                    Some(values) => Ok(KeyValueOption {
20709                        option_name: key.value.clone(),
20710                        option_value: KeyValueOptionKind::Multi(values),
20711                    }),
20712                    None => Ok(KeyValueOption {
20713                        option_name: key.value.clone(),
20714                        option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
20715                            self.parse_key_value_options(true, &[])?,
20716                        )),
20717                    }),
20718                }
20719            }
20720            _ => self.expected_ref("expected option value", self.peek_token_ref()),
20721        }
20722    }
20723
20724    /// Parses a RESET statement
20725    fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
20726        if self.parse_keyword(Keyword::ALL) {
20727            return Ok(ResetStatement { reset: Reset::ALL });
20728        }
20729
20730        let obj = self.parse_object_name(false)?;
20731        Ok(ResetStatement {
20732            reset: Reset::ConfigurationParameter(obj),
20733        })
20734    }
20735}
20736
20737fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
20738    if let Some(prefix) = prefix {
20739        Expr::Prefixed {
20740            prefix,
20741            value: Box::new(expr),
20742        }
20743    } else {
20744        expr
20745    }
20746}
20747
20748impl Word {
20749    /// Convert a reference to this word into an [`Ident`] by cloning the value.
20750    ///
20751    /// Use this method when you need to keep the original `Word` around.
20752    /// If you can consume the `Word`, prefer [`into_ident`](Self::into_ident) instead
20753    /// to avoid cloning.
20754    pub fn to_ident(&self, span: Span) -> Ident {
20755        Ident {
20756            value: self.value.clone(),
20757            quote_style: self.quote_style,
20758            span,
20759        }
20760    }
20761
20762    /// Convert this word into an [`Ident`] identifier, consuming the `Word`.
20763    ///
20764    /// This avoids cloning the string value. If you need to keep the original
20765    /// `Word`, use [`to_ident`](Self::to_ident) instead.
20766    pub fn into_ident(self, span: Span) -> Ident {
20767        Ident {
20768            value: self.value,
20769            quote_style: self.quote_style,
20770            span,
20771        }
20772    }
20773}
20774
20775#[cfg(test)]
20776mod tests {
20777    use crate::test_utils::{all_dialects, TestedDialects};
20778
20779    use super::*;
20780
20781    #[test]
20782    fn test_prev_index() {
20783        let sql = "SELECT version";
20784        all_dialects().run_parser_method(sql, |parser| {
20785            assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
20786            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20787            parser.prev_token();
20788            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20789            assert_eq!(parser.next_token(), Token::make_word("version", None));
20790            parser.prev_token();
20791            assert_eq!(parser.peek_token(), Token::make_word("version", None));
20792            assert_eq!(parser.next_token(), Token::make_word("version", None));
20793            assert_eq!(parser.peek_token(), Token::EOF);
20794            parser.prev_token();
20795            assert_eq!(parser.next_token(), Token::make_word("version", None));
20796            assert_eq!(parser.next_token(), Token::EOF);
20797            assert_eq!(parser.next_token(), Token::EOF);
20798            parser.prev_token();
20799        });
20800    }
20801
20802    #[test]
20803    fn test_peek_tokens() {
20804        all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
20805            assert!(matches!(
20806                parser.peek_tokens(),
20807                [Token::Word(Word {
20808                    keyword: Keyword::SELECT,
20809                    ..
20810                })]
20811            ));
20812
20813            assert!(matches!(
20814                parser.peek_tokens(),
20815                [
20816                    Token::Word(Word {
20817                        keyword: Keyword::SELECT,
20818                        ..
20819                    }),
20820                    Token::Word(_),
20821                    Token::Word(Word {
20822                        keyword: Keyword::AS,
20823                        ..
20824                    }),
20825                ]
20826            ));
20827
20828            for _ in 0..4 {
20829                parser.next_token();
20830            }
20831
20832            assert!(matches!(
20833                parser.peek_tokens(),
20834                [
20835                    Token::Word(Word {
20836                        keyword: Keyword::FROM,
20837                        ..
20838                    }),
20839                    Token::Word(_),
20840                    Token::EOF,
20841                    Token::EOF,
20842                ]
20843            ))
20844        })
20845    }
20846
20847    #[cfg(test)]
20848    mod test_parse_data_type {
20849        use crate::ast::{
20850            CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
20851        };
20852        use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
20853        use crate::test_utils::TestedDialects;
20854
20855        macro_rules! test_parse_data_type {
20856            ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
20857                $dialect.run_parser_method(&*$input, |parser| {
20858                    let data_type = parser.parse_data_type().unwrap();
20859                    assert_eq!($expected_type, data_type);
20860                    assert_eq!($input.to_string(), data_type.to_string());
20861                });
20862            }};
20863        }
20864
20865        #[test]
20866        fn test_ansii_character_string_types() {
20867            // Character string types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-string-type>
20868            let dialect =
20869                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20870
20871            test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
20872
20873            test_parse_data_type!(
20874                dialect,
20875                "CHARACTER(20)",
20876                DataType::Character(Some(CharacterLength::IntegerLength {
20877                    length: 20,
20878                    unit: None
20879                }))
20880            );
20881
20882            test_parse_data_type!(
20883                dialect,
20884                "CHARACTER(20 CHARACTERS)",
20885                DataType::Character(Some(CharacterLength::IntegerLength {
20886                    length: 20,
20887                    unit: Some(CharLengthUnits::Characters)
20888                }))
20889            );
20890
20891            test_parse_data_type!(
20892                dialect,
20893                "CHARACTER(20 OCTETS)",
20894                DataType::Character(Some(CharacterLength::IntegerLength {
20895                    length: 20,
20896                    unit: Some(CharLengthUnits::Octets)
20897                }))
20898            );
20899
20900            test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
20901
20902            test_parse_data_type!(
20903                dialect,
20904                "CHAR(20)",
20905                DataType::Char(Some(CharacterLength::IntegerLength {
20906                    length: 20,
20907                    unit: None
20908                }))
20909            );
20910
20911            test_parse_data_type!(
20912                dialect,
20913                "CHAR(20 CHARACTERS)",
20914                DataType::Char(Some(CharacterLength::IntegerLength {
20915                    length: 20,
20916                    unit: Some(CharLengthUnits::Characters)
20917                }))
20918            );
20919
20920            test_parse_data_type!(
20921                dialect,
20922                "CHAR(20 OCTETS)",
20923                DataType::Char(Some(CharacterLength::IntegerLength {
20924                    length: 20,
20925                    unit: Some(CharLengthUnits::Octets)
20926                }))
20927            );
20928
20929            test_parse_data_type!(
20930                dialect,
20931                "CHARACTER VARYING(20)",
20932                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20933                    length: 20,
20934                    unit: None
20935                }))
20936            );
20937
20938            test_parse_data_type!(
20939                dialect,
20940                "CHARACTER VARYING(20 CHARACTERS)",
20941                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20942                    length: 20,
20943                    unit: Some(CharLengthUnits::Characters)
20944                }))
20945            );
20946
20947            test_parse_data_type!(
20948                dialect,
20949                "CHARACTER VARYING(20 OCTETS)",
20950                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20951                    length: 20,
20952                    unit: Some(CharLengthUnits::Octets)
20953                }))
20954            );
20955
20956            test_parse_data_type!(
20957                dialect,
20958                "CHAR VARYING(20)",
20959                DataType::CharVarying(Some(CharacterLength::IntegerLength {
20960                    length: 20,
20961                    unit: None
20962                }))
20963            );
20964
20965            test_parse_data_type!(
20966                dialect,
20967                "CHAR VARYING(20 CHARACTERS)",
20968                DataType::CharVarying(Some(CharacterLength::IntegerLength {
20969                    length: 20,
20970                    unit: Some(CharLengthUnits::Characters)
20971                }))
20972            );
20973
20974            test_parse_data_type!(
20975                dialect,
20976                "CHAR VARYING(20 OCTETS)",
20977                DataType::CharVarying(Some(CharacterLength::IntegerLength {
20978                    length: 20,
20979                    unit: Some(CharLengthUnits::Octets)
20980                }))
20981            );
20982
20983            test_parse_data_type!(
20984                dialect,
20985                "VARCHAR(20)",
20986                DataType::Varchar(Some(CharacterLength::IntegerLength {
20987                    length: 20,
20988                    unit: None
20989                }))
20990            );
20991        }
20992
20993        #[test]
20994        fn test_ansii_character_large_object_types() {
20995            // Character large object types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-length>
20996            let dialect =
20997                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20998
20999            test_parse_data_type!(
21000                dialect,
21001                "CHARACTER LARGE OBJECT",
21002                DataType::CharacterLargeObject(None)
21003            );
21004            test_parse_data_type!(
21005                dialect,
21006                "CHARACTER LARGE OBJECT(20)",
21007                DataType::CharacterLargeObject(Some(20))
21008            );
21009
21010            test_parse_data_type!(
21011                dialect,
21012                "CHAR LARGE OBJECT",
21013                DataType::CharLargeObject(None)
21014            );
21015            test_parse_data_type!(
21016                dialect,
21017                "CHAR LARGE OBJECT(20)",
21018                DataType::CharLargeObject(Some(20))
21019            );
21020
21021            test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
21022            test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
21023        }
21024
21025        #[test]
21026        fn test_parse_custom_types() {
21027            let dialect =
21028                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21029
21030            test_parse_data_type!(
21031                dialect,
21032                "GEOMETRY",
21033                DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
21034            );
21035
21036            test_parse_data_type!(
21037                dialect,
21038                "GEOMETRY(POINT)",
21039                DataType::Custom(
21040                    ObjectName::from(vec!["GEOMETRY".into()]),
21041                    vec!["POINT".to_string()]
21042                )
21043            );
21044
21045            test_parse_data_type!(
21046                dialect,
21047                "GEOMETRY(POINT, 4326)",
21048                DataType::Custom(
21049                    ObjectName::from(vec!["GEOMETRY".into()]),
21050                    vec!["POINT".to_string(), "4326".to_string()]
21051                )
21052            );
21053        }
21054
21055        #[test]
21056        fn test_ansii_exact_numeric_types() {
21057            // Exact numeric types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type>
21058            let dialect = TestedDialects::new(vec![
21059                Box::new(GenericDialect {}),
21060                Box::new(AnsiDialect {}),
21061                Box::new(PostgreSqlDialect {}),
21062            ]);
21063
21064            test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
21065
21066            test_parse_data_type!(
21067                dialect,
21068                "NUMERIC(2)",
21069                DataType::Numeric(ExactNumberInfo::Precision(2))
21070            );
21071
21072            test_parse_data_type!(
21073                dialect,
21074                "NUMERIC(2,10)",
21075                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
21076            );
21077
21078            test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
21079
21080            test_parse_data_type!(
21081                dialect,
21082                "DECIMAL(2)",
21083                DataType::Decimal(ExactNumberInfo::Precision(2))
21084            );
21085
21086            test_parse_data_type!(
21087                dialect,
21088                "DECIMAL(2,10)",
21089                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
21090            );
21091
21092            test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
21093
21094            test_parse_data_type!(
21095                dialect,
21096                "DEC(2)",
21097                DataType::Dec(ExactNumberInfo::Precision(2))
21098            );
21099
21100            test_parse_data_type!(
21101                dialect,
21102                "DEC(2,10)",
21103                DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
21104            );
21105
21106            // Test negative scale values.
21107            test_parse_data_type!(
21108                dialect,
21109                "NUMERIC(10,-2)",
21110                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
21111            );
21112
21113            test_parse_data_type!(
21114                dialect,
21115                "DECIMAL(1000,-10)",
21116                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
21117            );
21118
21119            test_parse_data_type!(
21120                dialect,
21121                "DEC(5,-1000)",
21122                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
21123            );
21124
21125            test_parse_data_type!(
21126                dialect,
21127                "NUMERIC(10,-5)",
21128                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
21129            );
21130
21131            test_parse_data_type!(
21132                dialect,
21133                "DECIMAL(20,-10)",
21134                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
21135            );
21136
21137            test_parse_data_type!(
21138                dialect,
21139                "DEC(5,-2)",
21140                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
21141            );
21142
21143            dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
21144                let data_type = parser.parse_data_type().unwrap();
21145                assert_eq!(
21146                    DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
21147                    data_type
21148                );
21149                // Note: Explicit '+' sign is not preserved in output, which is correct
21150                assert_eq!("NUMERIC(10,5)", data_type.to_string());
21151            });
21152        }
21153
21154        #[test]
21155        fn test_ansii_date_type() {
21156            // Datetime types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type>
21157            let dialect =
21158                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21159
21160            test_parse_data_type!(dialect, "DATE", DataType::Date);
21161
21162            test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
21163
21164            test_parse_data_type!(
21165                dialect,
21166                "TIME(6)",
21167                DataType::Time(Some(6), TimezoneInfo::None)
21168            );
21169
21170            test_parse_data_type!(
21171                dialect,
21172                "TIME WITH TIME ZONE",
21173                DataType::Time(None, TimezoneInfo::WithTimeZone)
21174            );
21175
21176            test_parse_data_type!(
21177                dialect,
21178                "TIME(6) WITH TIME ZONE",
21179                DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
21180            );
21181
21182            test_parse_data_type!(
21183                dialect,
21184                "TIME WITHOUT TIME ZONE",
21185                DataType::Time(None, TimezoneInfo::WithoutTimeZone)
21186            );
21187
21188            test_parse_data_type!(
21189                dialect,
21190                "TIME(6) WITHOUT TIME ZONE",
21191                DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
21192            );
21193
21194            test_parse_data_type!(
21195                dialect,
21196                "TIMESTAMP",
21197                DataType::Timestamp(None, TimezoneInfo::None)
21198            );
21199
21200            test_parse_data_type!(
21201                dialect,
21202                "TIMESTAMP(22)",
21203                DataType::Timestamp(Some(22), TimezoneInfo::None)
21204            );
21205
21206            test_parse_data_type!(
21207                dialect,
21208                "TIMESTAMP(22) WITH TIME ZONE",
21209                DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
21210            );
21211
21212            test_parse_data_type!(
21213                dialect,
21214                "TIMESTAMP(33) WITHOUT TIME ZONE",
21215                DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
21216            );
21217        }
21218    }
21219
21220    #[test]
21221    fn test_parse_schema_name() {
21222        // The expected name should be identical as the input name, that's why I don't receive both
21223        macro_rules! test_parse_schema_name {
21224            ($input:expr, $expected_name:expr $(,)?) => {{
21225                all_dialects().run_parser_method(&*$input, |parser| {
21226                    let schema_name = parser.parse_schema_name().unwrap();
21227                    // Validate that the structure is the same as expected
21228                    assert_eq!(schema_name, $expected_name);
21229                    // Validate that the input and the expected structure serialization are the same
21230                    assert_eq!(schema_name.to_string(), $input.to_string());
21231                });
21232            }};
21233        }
21234
21235        let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
21236        let dummy_authorization = Ident::new("dummy_authorization");
21237
21238        test_parse_schema_name!(
21239            format!("{dummy_name}"),
21240            SchemaName::Simple(dummy_name.clone())
21241        );
21242
21243        test_parse_schema_name!(
21244            format!("AUTHORIZATION {dummy_authorization}"),
21245            SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
21246        );
21247        test_parse_schema_name!(
21248            format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
21249            SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
21250        );
21251    }
21252
21253    #[test]
21254    fn mysql_parse_index_table_constraint() {
21255        macro_rules! test_parse_table_constraint {
21256            ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
21257                $dialect.run_parser_method(&*$input, |parser| {
21258                    let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
21259                    // Validate that the structure is the same as expected
21260                    assert_eq!(constraint, $expected);
21261                    // Validate that the input and the expected structure serialization are the same
21262                    assert_eq!(constraint.to_string(), $input.to_string());
21263                });
21264            }};
21265        }
21266
21267        fn mk_expected_col(name: &str) -> IndexColumn {
21268            IndexColumn {
21269                column: OrderByExpr {
21270                    expr: Expr::Identifier(name.into()),
21271                    options: OrderByOptions {
21272                        sort: None,
21273                        nulls_first: None,
21274                    },
21275                    with_fill: None,
21276                },
21277                operator_class: None,
21278            }
21279        }
21280
21281        let dialect =
21282            TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
21283
21284        test_parse_table_constraint!(
21285            dialect,
21286            "INDEX (c1)",
21287            IndexConstraint {
21288                display_as_key: false,
21289                name: None,
21290                index_type: None,
21291                columns: vec![mk_expected_col("c1")],
21292                index_options: vec![],
21293            }
21294            .into()
21295        );
21296
21297        test_parse_table_constraint!(
21298            dialect,
21299            "KEY (c1)",
21300            IndexConstraint {
21301                display_as_key: true,
21302                name: None,
21303                index_type: None,
21304                columns: vec![mk_expected_col("c1")],
21305                index_options: vec![],
21306            }
21307            .into()
21308        );
21309
21310        test_parse_table_constraint!(
21311            dialect,
21312            "INDEX 'index' (c1, c2)",
21313            TableConstraint::Index(IndexConstraint {
21314                display_as_key: false,
21315                name: Some(Ident::with_quote('\'', "index")),
21316                index_type: None,
21317                columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
21318                index_options: vec![],
21319            })
21320        );
21321
21322        test_parse_table_constraint!(
21323            dialect,
21324            "INDEX USING BTREE (c1)",
21325            IndexConstraint {
21326                display_as_key: false,
21327                name: None,
21328                index_type: Some(IndexType::BTree),
21329                columns: vec![mk_expected_col("c1")],
21330                index_options: vec![],
21331            }
21332            .into()
21333        );
21334
21335        test_parse_table_constraint!(
21336            dialect,
21337            "INDEX USING HASH (c1)",
21338            IndexConstraint {
21339                display_as_key: false,
21340                name: None,
21341                index_type: Some(IndexType::Hash),
21342                columns: vec![mk_expected_col("c1")],
21343                index_options: vec![],
21344            }
21345            .into()
21346        );
21347
21348        test_parse_table_constraint!(
21349            dialect,
21350            "INDEX idx_name USING BTREE (c1)",
21351            IndexConstraint {
21352                display_as_key: false,
21353                name: Some(Ident::new("idx_name")),
21354                index_type: Some(IndexType::BTree),
21355                columns: vec![mk_expected_col("c1")],
21356                index_options: vec![],
21357            }
21358            .into()
21359        );
21360
21361        test_parse_table_constraint!(
21362            dialect,
21363            "INDEX idx_name USING HASH (c1)",
21364            IndexConstraint {
21365                display_as_key: false,
21366                name: Some(Ident::new("idx_name")),
21367                index_type: Some(IndexType::Hash),
21368                columns: vec![mk_expected_col("c1")],
21369                index_options: vec![],
21370            }
21371            .into()
21372        );
21373    }
21374
21375    #[test]
21376    fn test_tokenizer_error_loc() {
21377        let sql = "foo '";
21378        let ast = Parser::parse_sql(&GenericDialect, sql);
21379        assert_eq!(
21380            ast,
21381            Err(ParserError::TokenizerError(
21382                "Unterminated string literal at Line: 1, Column: 5".to_string()
21383            ))
21384        );
21385    }
21386
21387    #[test]
21388    fn test_parser_error_loc() {
21389        let sql = "SELECT this is a syntax error";
21390        let ast = Parser::parse_sql(&GenericDialect, sql);
21391        assert_eq!(
21392            ast,
21393            Err(ParserError::ParserError(
21394                "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
21395                    .to_string()
21396            ))
21397        );
21398    }
21399
21400    #[test]
21401    fn test_nested_explain_error() {
21402        let sql = "EXPLAIN EXPLAIN SELECT 1";
21403        let ast = Parser::parse_sql(&GenericDialect, sql);
21404        assert_eq!(
21405            ast,
21406            Err(ParserError::ParserError(
21407                "Explain must be root of the plan".to_string()
21408            ))
21409        );
21410    }
21411
21412    #[test]
21413    fn test_parse_multipart_identifier_positive() {
21414        let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
21415
21416        // parse multipart with quotes
21417        let expected = vec![
21418            Ident {
21419                value: "CATALOG".to_string(),
21420                quote_style: None,
21421                span: Span::empty(),
21422            },
21423            Ident {
21424                value: "F(o)o. \"bar".to_string(),
21425                quote_style: Some('"'),
21426                span: Span::empty(),
21427            },
21428            Ident {
21429                value: "table".to_string(),
21430                quote_style: None,
21431                span: Span::empty(),
21432            },
21433        ];
21434        dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
21435            let actual = parser.parse_multipart_identifier().unwrap();
21436            assert_eq!(expected, actual);
21437        });
21438
21439        // allow whitespace between ident parts
21440        let expected = vec![
21441            Ident {
21442                value: "CATALOG".to_string(),
21443                quote_style: None,
21444                span: Span::empty(),
21445            },
21446            Ident {
21447                value: "table".to_string(),
21448                quote_style: None,
21449                span: Span::empty(),
21450            },
21451        ];
21452        dialect.run_parser_method("CATALOG . table", |parser| {
21453            let actual = parser.parse_multipart_identifier().unwrap();
21454            assert_eq!(expected, actual);
21455        });
21456    }
21457
21458    #[test]
21459    fn test_parse_multipart_identifier_negative() {
21460        macro_rules! test_parse_multipart_identifier_error {
21461            ($input:expr, $expected_err:expr $(,)?) => {{
21462                all_dialects().run_parser_method(&*$input, |parser| {
21463                    let actual_err = parser.parse_multipart_identifier().unwrap_err();
21464                    assert_eq!(actual_err.to_string(), $expected_err);
21465                });
21466            }};
21467        }
21468
21469        test_parse_multipart_identifier_error!(
21470            "",
21471            "sql parser error: Empty input when parsing identifier",
21472        );
21473
21474        test_parse_multipart_identifier_error!(
21475            "*schema.table",
21476            "sql parser error: Unexpected token in identifier: *",
21477        );
21478
21479        test_parse_multipart_identifier_error!(
21480            "schema.table*",
21481            "sql parser error: Unexpected token in identifier: *",
21482        );
21483
21484        test_parse_multipart_identifier_error!(
21485            "schema.table.",
21486            "sql parser error: Trailing period in identifier",
21487        );
21488
21489        test_parse_multipart_identifier_error!(
21490            "schema.*",
21491            "sql parser error: Unexpected token following period in identifier: *",
21492        );
21493    }
21494
21495    #[test]
21496    fn test_mysql_partition_selection() {
21497        let sql = "SELECT * FROM employees PARTITION (p0, p2)";
21498        let expected = vec!["p0", "p2"];
21499
21500        let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
21501        assert_eq!(ast.len(), 1);
21502        if let Statement::Query(v) = &ast[0] {
21503            if let SetExpr::Select(select) = &*v.body {
21504                assert_eq!(select.from.len(), 1);
21505                let from: &TableWithJoins = &select.from[0];
21506                let table_factor = &from.relation;
21507                if let TableFactor::Table { partitions, .. } = table_factor {
21508                    let actual: Vec<&str> = partitions
21509                        .iter()
21510                        .map(|ident| ident.value.as_str())
21511                        .collect();
21512                    assert_eq!(expected, actual);
21513                }
21514            }
21515        } else {
21516            panic!("fail to parse mysql partition selection");
21517        }
21518    }
21519
21520    #[test]
21521    fn test_replace_into_placeholders() {
21522        let sql = "REPLACE INTO t (a) VALUES (&a)";
21523
21524        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21525    }
21526
21527    #[test]
21528    fn test_replace_into_set_placeholder() {
21529        let sql = "REPLACE INTO t SET ?";
21530
21531        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21532    }
21533
21534    #[test]
21535    fn test_replace_incomplete() {
21536        let sql = r#"REPLACE"#;
21537
21538        assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
21539    }
21540
21541    #[test]
21542    fn test_placeholder_invalid_whitespace() {
21543        for w in ["  ", "/*invalid*/"] {
21544            let sql = format!("\nSELECT\n  :{w}fooBar");
21545            assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
21546        }
21547    }
21548}